DFS는 깊이 우선 탐색을 수행하기 때문에 깊이가 깊어질수록 우선적으로 탐색하기 때문에 스택 오버플로우가 발생할 수 있다. 또한, DFS는 그래프가 커질수록 성능이 저하될 수 있다.
예시 코드 1 (스택)
public void DFS(int start)
{
// 스택 생성
Stack<int> stack = new Stack<int>();
// 시작 노드를 스택에 삽입
stack.Push(start);
// 스택이 빌 때까지 반복
while (stack.Count > 0)
{
// 스택의 제일 위에 있는 노드를 꺼내고, 스택에서 제거
int current = stack.Pop();
// 해당 노드가 아직 방문하지 않은 노드인 경우
if (!visited[current])
{
// 방문 처리
visited[current] = true;
Console.Write(current + " ");
// 해당 노드의 자식 노드들을 스택에 삽입
for (int i = 0; i < adjacencyList[current].Count; i++)
{
int next = adjacencyList[current][i];
if (!visited[next])
{
stack.Push(next);
}
}
}
}
}
이 코드에서adjacencyList는 그래프의 인접 리스트를 저장하는 배열이며,visited배열은 각 노드가 방문된 적이 있는지 여부를 저장합니다. 이 코드는 주어진 시작 노드를 시작으로 DFS를 수행하며, 각 노드를 재귀 호출하여 순서대로 탐색합니다.
예시코드2 (재귀)
public void DFS(int current)
{
// 해당 노드가 아직 방문하지 않은 노드인 경우
if (!visited[current])
{
// 방문 처리
visited[current] = true;
Console.Write(current + " ");
// 해당 노드의 자식 노드들을 순서대로 재귀 호출
for (int i = 0; i < adjacencyList[current].Count; i++)
{
int next = adjacencyList[current][i];
DFS(next);
}
}
}
BFS(Breadth-First Search)는 그래프 탐색 알고리즘의 하나로,
그래프의 한 노드를 시작으로 깊이가 아닌 너비 우선 탐색을 수행하는 알고리즘이다.
BFS는 큐(Queue)를 이용하여 구현할 수 있다. 시작 노드를 큐에 삽입한 후, 큐가 빌 때까지 반복한다.
각 반복마다 큐의 제일 앞에 있는 노드를 꺼내고, 해당 노드의 자식 노드들을 순서대로 큐에 삽입한다.
BFS는 깊이 우선 탐색과 달리 시작 노드에서 가까운 정점부터 차례대로 탐색하기 때문에 최단 경로를 찾을 때 유용하게
사용된다. 그러나 BFS는 깊이 우선 탐색보다 시간이 소요되는 경우가 많다.
BFS의 단점은 다음과 같은 점들이 있다:
저장 공간이 많이 필요하다: BFS는 깊이가 깊어질수록 계속해서 정점을 추가해야 하기 때문에, 저장 공간이 많이 필요하다. DFS는 재귀 호출을 이용하기 때문에, 재귀 호출이 종료될 때까지만 정점을 저장하기 때문에 저장 공간이 효율적으로 사용된다.
속도가 느리다: BFS는 깊이가 작은 정점부터 탐색을 시작하기 때문에, 깊이가 깊어질수록 정점을 탐색하는 속도가 느려진다. DFS는 깊이가 깊어질수록 빠르게 탐색을 진행할 수 있다.
public class Node
{
public string Value { get; set; }
public List<Node> Children { get; set; }
public Node(string value)
{
Value = value;
Children = new List<Node>();
}
}
public static List<string> BreadthFirstSearch(Node root)
{
var result = new List<string>();
var queue = new Queue<Node>();
queue.Enqueue(root);
while (queue.Count > 0)
{
var currentNode = queue.Dequeue();
result.Add(currentNode.Value);
foreach (var child in currentNode.Children)
{
queue.Enqueue(child);
}
}
return result;
}