[알고리즘] 깊이우선탐색(DFS)와 너비 우선 탐색(BFS)

유진·2023년 8월 29일

알고리즘-자료구조

목록 보기
12/15

📝 깊이 우선 탐색(DFS)이란?

그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘으로 루트 노드나 다른 임의의 노드에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법이다.



🎯 깊이 우선 탐색의 특징

  • 모든 노드를 확인하고자 할 때 사용한다.
  • 검색 속도는 너비 우선 탐색에 비해 느리다.
  • 자기 자신을 호출하는 순환 알고리즘의 형태이다.
  • 시간 복잡도
    • 인접 리스트로 표현된 그래프 : O(N+E)
    • 인접 행렬로 표현된 그래프 : O(N^2)
  • 적용 예시) 경로의 특징을 저장할 경우 / 길 찾기 / 미로문제



깊이 우선 탐색 구현 방법

  1. 탐색 시작 노드를 스택에 삽입하고, 방문 처리한다.
  2. 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리하고, 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
  3. 위의 1번과 2번 과정을 더 이상 수행할 수 없을 때까지 반복한다.


📈 깊이 우선 탐색의 장점

  • 현재 경로의 노드들만을 기억하면 되므로 저장공간의 수요가 비교적 적다.
  • 최선의 경우, 가장 빠른 알고리즘으로 운 좋게 항상 해에 도달하는 올바른 경로를 선택한다면, 깊이 우선 탐색이 최소 실행시간에 해를 찾을 수 있다.
  • 찾으려는 노드가 깊은 단계에 있다면 BFS보다 빠르게 찾을 수 있다.

📉 깊이 우선 탐색의 단점

  • 찾은 해가 최단 경로가 된다는 보장이 없다.
  • 최악의 경우, 가능한 모든 경로를 탐험하고서야 해를 찾으므로, 해에 도달하는 데 가장 오랜 시간이 걸린다.



📝 너비 우선 탐색(BFS)이란?

가까운 노드부터 탐색하는 알고리즘으로 루트 노드나 다른 임의의 노드에서 시작해서 인접한 노드를 우선적으로 탐색하는 방법이다.



🎯 너비 우선 탐색의 특징

  • 두 노드 사이의 최단 경로나 임의의 경로를 찾을 때 사용한다.
  • 재귀적 알고리즘이 아니다.
  • 자료구조 큐를 사용하여 선입선출을 원칙으로 탐색한다.
  • 적용 예시) 길찾기 / 웹 크롤러 / 그래프에서 주변 위치 찾기



너비 우선 탐색 구현 방법

  1. 탐색 시작 노드를 큐에 삽입하고 방문 처리한다.
  2. 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리한다.
  3. 위의 1번과 2번 과정을 더 이상 수행할 수 없을 때까지 반복한다.


📈 너비 우선 탐색의 장점

  • 너비를 우선으로 탐색하기 때문에 답이 되는 경로가 여러 개인 경우에 최단 경로임을 보장한다.
  • 최단 경로가 존재한다면, 어느 한 경로가 무한히 깊어진다 해도 최단 경로를 반드시 찾을 수 있다
  • 노드 수가 적고 깊이가 얕은 해가 존재하거나 찾는 노드가 인접할 때 유리하다.

📉 너비 우선 탐색의 단점

  • 재귀호출을 사용하는 DFS와 달리 큐를 이용해 다음에 탐색 할 노드들을 저장하기 때문에 노드의 수가 많을 수록 필요없는 노드들까지 저장하게 되며 메모리를 많이 소비한다.
  • 노드의 수가 늘어나면 탐색해야하는 노드가 많아지기 때문에 비효율적이다.


🔗DFS와 BFS 비교

DFSBFS
동작원리스택
구현방법재귀 함수 이용큐 자료구조 이용
공통점그래프의 모든 노드를 탐색그래프의 모든 노드를 탐색



참고자료

profile
도라에몽 암기빵

0개의 댓글