깊이 우선 탐색
최대한 깊이 이동
정점의 자식을 먼저 탐색하는 방식
루트 노드에서 시작해 다음 분기로 넘어가기 전에 다음 분기를 완벽하게 탐색하는 방식
def dfs_recursive(v,discovered=[]):
discovered.append(v)
for w in graph[v]:
if w not in discovered:
discovered=dfs(w,discovered)
return discovered
def dfs_iterative(start_v):
discovered=[]
stack=[start_v]
while stack:
v=stack.pop()
if v not in discovered:
discovered.append(v)
for w in graph[v]:
stack.append(w)
return discovered
너비 우선 탐색
최대한 넓게 이동
정점들과 같은 레벨에 있는 노드들을 먼저 탐색하는 방식, 인접한 노드 먼저 탐색
시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법
def bfs(start_v):
discovered=[start_v]
queue=[start_v]
while queue:
v=queue.pop(0)
for w in graph[v]:
if w not in discovered:
discovered.append(w)
queue.append(w)
return discovered
모든 노드를 검색한다는 점에서 시간 복잡도는 동일
O(노드 개수 + 간선 개수)임
-> 인접 리스트로 구현하는 게 시간 복잡도가 작음
[참고]