on
알고리즘 : 깊이 우선 탐색(Depth-First Search)
알고리즘 : 깊이 우선 탐색(Depth-First Search)
728x90
https://every-time-i-pass-this-place.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%84%88%EB%B9%84-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89Breadth-First-Search
지난 시간에 올렸던 너비우선탐색(BFS)와 비교하려면 참고 바란다.
깊이 우선 탐색(Depth-First Search)은?
정점의 자식들을 먼저 탐색하는 방식
DFS 방식 : A - B - D - E - F - C - G - H - I - J
한 노드의 자식을 타고 끝까지 순회한 후 다시 돌아와서 다른 형제들의 자식을 타고 내려가며 순화함
graph = dict() graph['A'] = ['B', 'C'] graph['B'] = ['A', 'D'] graph['C'] = ['A', 'G', 'H', 'I'] graph['D'] = ['B', 'E', 'F'] graph['E'] = ['D'] graph['F'] = ['D'] graph['G'] = ['C'] graph['H'] = ['C'] graph['I'] = ['C', 'J'] graph['J'] = ['I'] graph """ 출력결과 {'A': ['B', 'C'], 'B': ['A', 'D'], 'C': ['A', 'G', 'H', 'I'], 'D': ['B', 'E', 'F'], 'E': ['D'], 'F': ['D'], 'G': ['C'], 'H': ['C'], 'I': ['C', 'J'], 'J': ['I']} """
파이썬 표현
Key Values A B C B A D C A G H I D B E F E D F D G C H C I C J J I
DFS 알고리즘 구현
자료구조 스택과 큐를 활용
- need_visit 스택과 visited 큐, 두 개의 자료 구조를 생성
BFS자료구조는 두 개의 큐를 활용하는데 비해 DFS는 스택과 큐를 활용한다는 차이가 있음을 인지!
큐와 스택 구현은 별도 라이브러리를 활용할 수도 있지만 간단히 파이썬 리스트를 활용할 수 있음
def dfs(graph, start_node): visited, need_visit = list(), list() need_visit.append(start_node) while need_visit: node = need_visit.pop() if node not in visited: visited.append(node) need_visit.extend(graph[node]) return visited
dfs(graph, 'A') #출력결과 ['A', 'C', 'I', 'J', 'H', 'G', 'B', 'D', 'F', 'E']
시간 복잡도
일반적인 DFS 시간 복잡도
- 노드 수 : V
- 간선 수 : E
- 위 코드에서 while need_visit은 V + E 번 만큼 수행함
- 시간 복잡도 : O(V + E)
from http://every-time-i-pass-this-place.tistory.com/27 by ccl(A) rewrite - 2021-09-23 12:26:32