반응형
개념
- 특정 노드를 기준으로 가장 깊은 노드를 우선적으로 탐색하는 알고리즘.
- 탐색중인 정점의 연결된 노드에 방문한 적이 없다면 해당 노드를 스택에 삽입하고 방문 이력을 저장한다.
- 탐색중인 정점에 연결된 노드가 없거나 이미 방문한 적이 있다면 스택의 최상단을 제거한다.
- 즉, 스택에 노드를 넣고 그와 연결된 모든 노드를 방문하여 스택에 삽입하고 삭제하는 과정을 반복한다.
그래프 표현 - 인접행렬
static boolean[] check;
static int[][] map;
static void dfs(int x) {
//해당 노드 방문한경우 스택에서 제거
if(check[x]) return;
//방문하지 않았다면 방문 처리
check[x] = true;
System.out.println(x);
//해당 노드의 인접 노드 확인
for (int i = 0; i < map[x].length; i++) {
int c = map[x][i];
//간선이 있으면서 방문하지 않았다면
if(c == 1 && !check[i]) {
dfs(i);
}
}
}
public static void main(String[] args) {
int[][] edgeArr = {
{1,2}
,{1,3}
,{2,3}
,{2,4}
,{3,5}
};
map = new int[6][6];
check = new boolean[6];
//간선 설정
for (int i = 0; i < edgeArr.length; i++) {
int temp1 = edgeArr[i][0];
int temp2 = edgeArr[i][1];
map[temp1][temp2] = map[temp2][temp1] = 1;
}
dfs(1);
}
※ 장점
- 단지 현 경로상의 노드들만을 기억하면 되므로 저장공간의 수요가 비교적 적다. (그래프의 높이 만큼의 공간만을 요구)
- 목표노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.
※ 단점
- 해가 없는 경로에 깊이 빠질 가능성이 있다. (무한루프)
따라서 실제의 경우 미리 지정한 임의의 깊이까지만 탐색하고 목표노드를 발견하지 못하면 다음의 경로를 따라 탐색하는 방법이 유용할 수 있다.
- 얻어진 해가 최단 경로가 된다는 보장이 없다. 이는 목표에 이르는 경로가 다수인 문제에 대해 깊이우선 탐색은 해에 다다르면 탐색을 끝내버리므로, 이때 얻어진 해는 최적이 아닐 수 있다는 의미.
반응형
'Algorithm > 기본' 카테고리의 다른 글
크루스칼 알고리즘(Kruskal Algorithm) (0) | 2021.05.14 |
---|---|
유니온 파인드(Union Find) (0) | 2021.05.12 |
너비 우선 탐색(Breadth First Search, BFS) (0) | 2021.05.08 |
힙 정렬(heap sort) (0) | 2021.05.06 |
계수 정렬(counting sort) (0) | 2021.05.04 |