DFS란?
-> 깊이 우선 탐색, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘.
DFS의 특징
- 스택 자료구조(또는 재귀 함수)를 이용한다.
DFS의 동작 과정
1. 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
2. 스택의 최상단 노드에 방문하지 않은 인접 노드가 있다면 그 노드를 스택에 넣고 방문 처리를 한다.
2-1. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
3. 2번의 과정을 수행할 수 없을 때까지 반복한다.
# 재귀함수를 이용한 dfs구현
def dfs(graph, v, visited):
# 현재 노드를 방문처리
visited[v] = True
print(v, end=" ")
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
# 해당 노드의 행의 노드 중 방문하지 않은 노드가 있으면 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# 인접 행렬 방식으로 표현
graph = [[], [2, 3, 8], [1, 7], [1, 4, 5], [3, 5], [3, 4], [7], [2, 6, 8], [1, 7]]
visited = [False] * 9
dfs(graph, 1, visited)
BFS란?
-> 너비 우선 탐색, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘.
BFS의 특징
- 큐 자료구조를 활용한다.
BFS의 동작 과정
1. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
2. 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리를 한다.
3. 2번의 과정을 수행할 수 없을 때까지 반복한다.
from collections import deque
def bfs(graph, start, visited):
# 시작 노드를 큐에 넣어준다.
queue = deque([start])
visited[start] = True
# 큐가 빌 때까지 반복
while queue:
# 가장 먼저 들어온 요소 빼고 검사
v = queue.popleft()
print(v, end=" ")
# 요소의 행에서 아직 방문 안 한 원소가 있으면 방문 및 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# 인접 행렬 방식으로 표현
graph = [[], [2, 3, 8], [1, 7], [1, 4, 5], [3, 5], [3, 4], [7], [2, 6, 8], [1, 7]]
# 각 노드의 방문여부를 표현
visited = [False] * 9
bfs(graph, 1, visited)
'알고리즘 > 이론' 카테고리의 다른 글
정렬 알고리즘 시간복잡도 비교 (0) | 2022.06.22 |
---|---|
계수 정렬(Count Sort) (0) | 2022.06.22 |
퀵 정렬(Quick Sort) (0) | 2022.06.22 |
삽입 정렬(Insertion Sort) (0) | 2022.06.22 |
선택 정렬(Selection Sort) (0) | 2022.06.22 |