[알고리즘]-깊이 우선 탐색(DFS, Depth-First Search)
깊이 우선 탐색(DFS, Depth-First Search)
개념
루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
사용하는 경우 : 모든 노드를 방문 하고자 하는 경우 dfs가 bfs보다 간단하다. 단순 검색 속도는 bfs보다 느리다.
특징
순환 알고리즘 형태이다. 탐색 시 노드를 방문 했었는지 여부를 검사해야한다. 아니면 무한루프에 빠진다.
구현 방법
- 재귀함수 호출
- 스택(Stack) 사용
시간 복잡도
DFS(정점의 수:N, 간선의 수:E)의 모든 간선을 조회한다.
- 인접리스트로 표현된 그래프 : O(N+E)
- 인접행렬로 표현된 그래프 : O(N^2)
DFS 구현 코드 예시
//----------------------재귀함수 DFS
public static void dfs(int i) {
visited[i] = true; //먼저 방문했다고 표시
System.out.print(i + " ");
for(int j = 1; j <= n; j++) {//한쪽을 깊게
if(arr[i][j] == 1 && !visited[j]) { //이어져있고 방문 안한 곳
dfs(j);
}
}
}
}
//------------ 스택을 이용한 DFS
public static void bfs(int start) {
Stack<T> stack = new Stack<T>(); // 객체 선언
stack.push(start); // 시작점
visited[start] = true; // 방문 표시
System.out.print(start + " ");
while(!stack.isEmpty()) {
int temp = stack.pop();
System.out.print(temp + " ");
for(int j = 1; j <= n; j++) {
if(arr[temp][j] == 1 && !visited[j]) { // 이어져있고 방문 안한 곳
stack.push(j); // 스택에 넣고
visited[j] = true; // 방문 표시
}
}
}
}
요약
- 스택과 재귀함수로 구현한다.
- DFS는 한쪽을 먼저 다 검색한다.