본문 바로가기
카테고리 없음

[알고리즘] DFS, BFS에 대한 모든것 이고 싶어요

by 우직한 사람 2024. 5. 1.
반응형
 
 

탐색 알고리즘 DFS, BFS

DFS(Depth-First Search)

  • 깊이 우선 탐색이라고 부르며, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
  • 시간복잡도는 O(N)

그래프는 NodeEdge로 표현

그래프 탐색이란 하나의 노드를 시작으로 다수의 노드를 방문하는 것

프로그래밍에서는 그래프를 인접행렬이나 인접리스트로 표현할 수 있음

인접행렬 방식

  • 2차원 배열에 각 노드가 연결된 형태를 기록하는 방식
  • 연결되어 있지 않은 노드끼리는 무한의 비용이라고 작성
INF = 99999999
graph = [
	[0, 7, 5],
	[7, 0, INF],
	[5, INF, 0]
	]​

인접리스트 방식

  • 모든 노드에 연결된 노드에 대한 정보를 차례대로 연결하여 저장
  • 연결 리스트라는 자료구조 이용
graph = [[] for _ in range(3)]
graph[0].append((1, 7))
graph[0].append((2, 5))

graph[1].append((0, 7)
graph[2].append((0, 5))

print(graph)

두 방식의 차이

  • 인접행렬 방식은 노드 개수가 많을 수록 메모리가 불필요하게 낭비 됨
  • 인접리스트 방식은 연결된 정보만을 저장하기 때문에 메모리 효율적 사용

DFS 동작 과정

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

DFS 예제 (스택이 아닌 재귀함수로 구현)

BFS(Breadth First Search)

  • 너비 우선 탐색
  • 가까운 노드부터 탐색하는 알고리즘 (DFS는 최대한 멀리 있는 노드를 우선으로 탐색하는 방식)
  • DFS는 스택, BFS는 큐 자료구조 이용
  • 시간복잡도 O(N)
  • 파이썬의 deque 라이브러리를 사용하는 것이 좋음
  • 일반적으로 실제 수행시간은 DFS보다 좋은 편

BFS 동작 방식

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

BFS 예제

DFS, BFS 동작 방식 차이

<Reference>

https://medium.com/analytics-vidhya/a-quick-explanation-of-dfs-bfs-depth-first-search-breadth-first-search-b9ef4caf952c

https://github.com/ndb796/python-for-coding-test

반응형