반응형
깊이 우선 탐색 (DFS : Depth First Search)
대표적으로 백트래킹에 사용한다. 일반적으로 재귀 호출을 사용하여 구현하지만, 단순한 스택 배열로 구현하기도 한다. 구조상 스택 오버플로우를 유의해야 한다.
자동 미로 생성에 많이 사용 되는 알고리즘!
장점
- 현 경로상의 노드만 기억하면 돼서 저장공간의 수요가 비교적 적다.
- 목표 노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.
단점
- 해가 없는 경로에 깊이 빠질 수 있다. ( 임의 깊이까지만 탐색하도록 만들기! )
- 얻어진 해가 최단 경로가 아닐 수도 있다.
왜냐? DFS는 일단 해를 찾으면 탐색이 끝나기 때문이다.
동작 방식
트리나 그래프에서 한 루트로 탐색하다가 특정 상황에서 최대한 깊숙이 들어가서 확인한 뒤 다시 돌아가 다른 루트로 탐색하는 방식이다.
우선 그래프에서의 깊이(depth)를 결정할 필요가 있다.
루트 노드의 깊이는 0으로 하고,
임의의 노드의 깊이는 이 부모 중 가장 깊이가 작은 것의 깊이에 1을 더한 값!!
따라서 그래프에서의 깊이 우선 탐색은 OPEN에 있는 노드 중 가장 깊은 것을 택하여 확장시키게 된다. 후계 노드가 생성되어 이 중에 이미 OPEN이나 CLOSED에 있는 것이 있다면, 깊이를 재조정하여야 한다.
여기서 알 수 있는 것은 일반적인 그래프를 탐색하는 경우라도, 탐색 과정에 의하여 얻어지는 노드들과 포인터들은 역시 탐색 트리를 형성한다는 것이다. 즉, 포인터들은 오직 하나의 부모를 가리키게 된다.
너비 우선 탐색 (BFS : Breadth-First Search)
깊이 우선 탐색(DFS)과는 다르게 가까운 노드부터 탐색하는 알고리즘이다.
노드 수가 적고 깊이가 얕은 해가 존재할 때 유리하다!
장점
- 답이 되는 경로가 여러 개인 경우 최단 경로를 찾아내기 쉬움
- 최단 경로가 존재한다면, 어느 한 경로가 무한히 깊어진다 해도 최단 경로를 반드시 찾을 수 있다.
단점
- 큐를 이용해 노드를 저장하기 때문에 노드의 수가 많을수록 필요한 저장공간의 크기 비약적으로 커짐.
- 불필요하게 탐색해야 하는 노드가 많다.
동작 방식
루트 노드에서 시작하여 루트 노드에 인접하는 방문한 적 없는(큐에도 없는) 노드를 큐에 넣는다.
큐에 들어가는 순서대로 노드를 탐색하며 큐를 방문할 때 해당 큐와 인접한 노드를 또 큐에 넣는다!
위에 애니메이션에서 회색은 큐의 상태를 보여주며 검은색은 실제로 탐색하는 노드의 순서다.
반응형
'알고리즘 테스트 > 이론' 카테고리의 다른 글
피보나치 수를 구하는 다양한 방법 (0) | 2022.04.06 |
---|---|
동적 계획법 (파이썬) (0) | 2022.02.07 |
정렬 알고리즘 3 : 계수 정렬(Counting sort) (0) | 2022.01.31 |
정렬 알고리즘 2 : 병합 정렬(합병 정렬, Merge sort) (0) | 2022.01.30 |
정렬 알고리즘 1 : 버블 정렬 (0) | 2022.01.30 |