깊이 우선 탐색(Depth-First Search) 란?
- 대표적인 그래프 탐색 알고리즘
- 정점의 자식 노드들을 먼저 탐색하는 방식이다.
깊이 우선 탐색(Depth-First Search) 이해
위와 같은 형태의 그래프가 있을 때 깊이 우선 탐색은 처음 시작 정점을 방문한 뒤, 인접 정점의 자식을 타고 끝까지 방문한 후, 다시 돌아와서 다른 형제의 자식노드를 타고 모든 정점을 방문한다. 넓이 우선 탐색과 다르게 깊이 우선 탐색은 탐색할 때 스택을 이용해야 한다.
첫 번째 노드에서 출발하기 때문에 1번 노드를 방문예약(need_visit) 스택에 넣은 뒤 1번 노드를 방문예약 스택에서 빼고 인접한 노드인 2, 5번 노드를 방문예약 스택에 넣어준다. (이후부터 스택이라 칭함)
5번 노드를 방문한 후 인접 노드인 4번 노드를 스택에 넣어준다.
마찬가지로 4번 노드를 방문한 후 인접 노드인 6번 노드를 스택에 넣어준다.
6번 노드를 방문한 후 더이상 자식 노드가 없기 때문에 이후에는 2번노드를 방문하게 된다.
같은 방식으로 계속 수행하게 되면
더이상 방문예약스택에 남아있는 정점이 없을 때 탐색을 종료한다.
깊이 우선 탐색(Depth-First Search) 구현
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
깊이 우선 탐색(Depth-First Search) 시간 복잡도
- 노드 수: V
- 간선 수: E
- 깊이 우선 탐색의 시간 복잡도는 노드 수 + 간선 수로 표현된다. O(V+E)
'Python > 자료구조와 알고리즘' 카테고리의 다른 글
[알고리즘] 그래프 너비 우선 탐색(Breadth-First Search) (0) | 2021.03.05 |
---|---|
[알고리즘] 그래프의 이해와 종류 (0) | 2021.03.05 |
[알고리즘] 순차 탐색(Sequential Search) (0) | 2021.02.24 |
[알고리즘] 이진 탐색(Binary Search) (0) | 2021.02.24 |
[알고리즘] 퀵 정렬(Quick Sort) (0) | 2021.02.17 |