알고리즘/이론
DFS와 BFS
태풍사랑
2022. 3. 27. 21:56
DFS(깊이 우선 탐색)
-> **스택(혹은 재귀)**
- 구현
- **스택**에 시작 노드를 넣는다
- 스택이 비어있으면 실행을 멈추고 False 반환
- 스택의 맨 위 노드가 찾고자 하는 노드라면 탐색을 종료하고 True 반환
- 3에서 스택의 맨 위 노드가 찾고자 하는 노드가 아니라면 해당 노드를 POP. 스택에 들어온 적이 없는 POP한 노드의 모든 이웃 노드를 찾아 순서대로 스택에 넣는다
- 3으로 돌아간다
-
DFS(G,u) u.visited = ture for each v ∈ G.Adj[u] if v.visited == false DFS(G, v) init() For each u ∈ G u.visited = false For each u ∈ G DFS(G, u)
- 장점
- 현 경로상의 노드를 기억하기 때문에 적은 메모리 사용
- 찾으려는 노드가 깊은 단계에 있는 경우 BFS보다 빠르게 찾을 수 있다
- 단점
- 해가 없는 경로를 탐색할 경우 단계가 끝날 때까지 탐색. 효율성을 높이기 위해 미리 지정한 임의 깊이까지만 탐색하고 해를 발견하지 못하면 빠져나와 다른 경로를 탐색하는 방법 사용
- DFS를 통해 얻어진 해가 최단 경로라는 보장은 X. DFS는 해에 도착하면 탐색을 종료하기 때문!
BFS(너비 우선 탐색)
-> **큐 사용**(재귀적으로 동작 X)
- 사용되는 곳
- 웹 크롤링 : 동적으로 생성되는 무한한 인터넷 페이지를 구글이 크롤링하기 위해서는 BFS 사용
- 네트워크 브로드캐스트
- 가비지 컬렉션
- 구현
create a queue Q mark v as visited and put b into Q while Q is non-empty remove the head u of Q mark and enqueue all (unvisited) neighbors of u
- 장점
- 답이 되는 경로가 여러 개인 경우에도 최단 경로임을 보장
- 최단 경로가 존재하면 깊이가 무한정 깊어진다고 해도 답을 찾을 수 있다
- 단점
- 경로가 매우 길 경우 탐색 가지가 급격히 증가함에 따라 보다 많은 기억 공간을 필요로 하게 된다
- 해가 존재하지 않다면 유한 그래프의 경우 모든 그래프를 탐색한 후 실패로 끝난다
- 무한 그래프의 경우 해를 찾지도 못하고 끝내지도 못한다
사용
- 최단 거리 문제 -> BFS
- 이동할때마다 가중치가 붙어 이동 or 이동 과정에서 여러 제약이 있을 경우 -> DFS
[BFS]
1. 최소 비용 문제
2. 간선의 가중치가 1인 경우
3. 정점과 간선의 개수가 적다. (시간 제약, 메모리 제한 내에 만족한다.)