깊이 우선 탐색(DFS)

Sunny·2022년 8월 5일
0

🌱 깊이 우선 탐색(DFS, Depth Fisrt Search)

그래프 완전 탐색 중 하나로, 그래프 시작 노드에서 출발하여 탐색할 한 쪽 분기를 정하여 최대 깊이까지 탐색을 마친 후 다른 쪽 분기로 이동하여 다시 탐색을 수행하는 알고리즘

🔹기능

  • 그래프 완전 탐색

🔹특징

  • 재귀 함수로 구현
  • 스택 자료구조 이용

🔹시간 복잡도 (노드 수 : V, 에지 수: E)

  • O(V+E)

깊이 우선 탐색은 실제 구현 시 재귀함수를 이용하므로 스택 오버플로에 유의해야 함

🌱 깊이 우선 탐색(DFS, Depth Fisrt Search)의 핵심 이론

DFS는 한 번 방문한 노드를 다시 방문하면 안 되므로 노드 방문 여부를 체크할 배열이 필요하며, 그래프는 인접 리스트로 표현. 그리고 DFS의 탐색 방식은 후입선출 특성을 가지므로 스택을 사용하여 설명.

(여기서는 설명의 편의를 위해 스택을 사용하여 설명하지만, 실제 DFS 구현은 스택보다는 스택 성질을 갖는 재귀 함수로 많이 구현)

1. DFS를 시작할 노드를 정한 후 사용할 자료구조 초기화하기

DFS를 위해 필요한 초기 작업은 인접 리스트로 그래프 표현하기, 방문 배열 초기화하기, 시작 노드 스택에 삽입하기임. 스택에 시작 노드를 1로 삽입할 떄 해당 위치의 방문 배열을 체크하면 T,F,F,F,F,F 임.

2. 스택에서 노드를 꺼낸 후 꺼낸 노드의 인접 노드를 다시 스택에 삽입하기

이제 pop을 수행하여 노드를 꺼냄. 꺼낸 노드를 탐색 순서에 기입하고 인접 리스트의 인접 노드를 스택에 삽입하여 방문 배열을 체크. 방문 배열은 T,T,T,F,F,F 가 됨.

3. 스택 자료구조에 값이 없을 때까지 반복하기

앞선 과정을 스택 자료구조에 값이 없을 떄까지 반복. 이때 이미 다녀간 노드는 방문 배열을 바탕으로 재삽입하지 않는 것이 특징.

스택에서 3을 꺼내며 탐색 순서에 기록하고 인접 노드 4를 스택에 삽입하며 방문 배열에 체크. 4를 꺼내며 탐색 순서에 기록하고 6을 삽입하며 방문 배열에 체크. 6을 꺼내며 탐색 순서에 기록하고 6과 인접한 노드는 없으므로 추가. 6을 꺼내며 탐색 순서에 기록하고 6과 인접한 노드는 없으므로 추가 삽입은 없다. 계속해서 스택에서 2를 꺼내며 탐색 순서에 기록하고 2와 인접한 5,6을 삽입하기 위해 본다. 이때 6은 방문 배열에 T로 체크되어 있으므로 5만 삽입. 이 과정을 스택이 빌 때까지 진행.

💡 한줄 요약 : 스택에 노드를 삽입할 때 방문 배열을 체크하고, 스택에서 노드를 뺄 때 탐색 순서에 기록하며 인접 노드를 방문 배열과 대조하여 살핀다.

profile
개발에 재미를 붙여보기 :)

0개의 댓글