DFS์ BFS
์ฌ์ ์ง์
ํ์
๋ง์ ์์ ๋ฐ์ดํฐ ์ค ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์
์คํ๊ณผ ํ
๋ค์ ๋ฌธ์๋ฅผ ์ฐธ์กฐ
์ฌ๊ท ํจ์
์๊ธฐ ์์ ์ ํธ์ถํ๋ ํจ์. ์ํ์ ์ ํ์์ ์ฝ๋ํํ ๊ฒ
์ ํ์: ํน์ ํจ์๋ฅผ ์๊ธฐ๋ณด๋ค ๋ ์์ ๋ณ์์ ํจ์์ ๊ด๊ณ๋ก ํํํ ๊ฒ
์ฌ๊ท ํจ์๋
์ ์ ์์์ง๋ ์๊ธฐ ์์
+์ข ๋ฃ ์กฐ๊ฑด
์ ํตํด ๋์ํ๋ค.
๊ทธ๋ํ
vertex(์ ์ )๊ณผ edge(๊ฐ์ )์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ
ํ๋ก๊ทธ๋๋ฐ์์ ์ด๋ฅผ ํํํ๋ ๋ฐฉ์์ผ๋ก๋
์ธ์ ํ๋ ฌ
๊ณผ์ธ์ ๋ฆฌ์คํธ
๊ฐ ์๋ค.
์ธ์ ํ๋ ฌ
2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ ๊ฒ
INF = 987654321
graph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
# 0๊ณผ 1์ ์ฐ๊ฒฐ ๊ด๊ณ
graph[0][1] ( == graph[1][0])
์ธ์ ๋ฆฌ์คํธ
์ฐ๊ฒฐ ๋ฆฌ์คํธ ์๋ฃ๊ตฌ์กฐ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ ํํ
vertex = 3
graph = [[] for i in range(vertex)]
# 0๋ฒ ๋
ธ๋์์ ์ฐ๊ฒฐ ์ ๋ณด
graph[0].append((1, 7))
graph[0].append((2, 5))
# 1๋ฒ ๋
ธ๋์์ ์ฐ๊ฒฐ ์ ๋ณด
graph[1].append((0, 7))
# 2๋ฒ ๋
ธ๋์์ ์ฐ๊ฒฐ ์ ๋ณด
graph[2].append((0, 5))
# 0๋ฒ๊ณผ 1๋ฒ์ ๋
ธ๋์ ์ฐ๊ฒฐ ๊ด๊ณ ํ์
graph[0].find
์ธ์ ํ๋ ฌ vs ์ธ์ ๋ฆฌ์คํธ
์ธ์ ํ๋ ฌ
์ฅ์ : ๋ ๋ ธ๋ ๊ฐ ์ฐ๊ฒฐ ์ฌ๋ถ ํ์ธ์ด ์ฝ๊ณ ์ ๋ณด๋ฅผ ์ป๋ ์๋๊ฐ ๋น ๋ฆ
๋จ์ : ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น
์ธ์ ๋ฆฌ์คํธ
์ฅ์ : ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ (์๊ธฐ ์์ ๊ณผ์ ๊ด๊ณ ์ ์ฅ X, ํ์ํ ๋ ธ๋์ ๊ด๊ณ๋ง ์ ์ฅ)
๋จ์ : ์ฐ๊ฒฐ ์ฌ๋ถ ํ์ธ์ ์ํด ์ํ๋ฅผ ํด์ผ ํ๋ค. (์ ๋ณด ์ป๋ ์๋ ๋๋ฆผ)
๋ฐ๋ผ์ ๋ ธ๋์ ๊ฐ์์ ๋นํด ๊ฐ์ ์ด ํ์ฐํ ์ ์ ๋(sparse graph)์๋ ์ธ์ ๋ฆฌ์คํธ, ์๋ ๊ฒฝ์ฐ์๋ ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
โ
DFS (๊น์ด ์ฐ์ ํ์, Depth-First Search)
์ ์
๋ ์ด์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์์ ๋๊น์ง ์ธ์ ๋ ธ๋๋ฅผ ์ ํํ์ฌ ํ์ํ๋ ๋ฐฉ์
์ธ์ ๋ ธ๋๊ฐ์๋ ์ ํด์ง ์ฐ์ ์์๊ฐ ์์ง๋ ์์ผ๋ ๋ณดํต ํฌ๊ธฐ๊ฐ ์์ ์์๋๋ก ํ์
๊ตฌํ
์คํ๊ณผ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
๋ฐฉ๋ฌธํ ๋ ธ๋, ์ธ์ ํ ๋ ธ๋๋ฅผ ์คํ์ ์ถ๊ฐํ๊ณ ์ธ์ ๋ ธ๋ ์ค ๋ฏธ๋ฐฉ๋ฌธ์ธ ๋ ธ๋๊ฐ ์์ ์ ๊บผ๋ธ๋ค.
๋๋ ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ ์ธ์ ํ๋ ฌ
์, ์๋ ๊ฒฝ์ฐ ์ธ์ ๋ฆฌ์คํธ
๋ฅผ ์ด์ฉํ๋ค.
์ธ์ ํ๋ ฌ
INF = 987654321
def dfs(graph, v, visited):
visited[v] = True
print(v, end=" ")
for i in range(len(graph[0])):
if graph[v][i] != 0 and graph[v][i] != INF and not visited[i]:
dfs(graph, i, visited)
graph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
visited = [False] * len(graph[0])
start = 1
dfs(graph, start, visited)
์ธ์ ๋ฆฌ์คํธ
def dfs(graph, v, visited):
visited[v] = True
print(v, end=" ")
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
vertex = 4
graph = [
[2, 3],
[2],
[0, 1],
[0]
]
start = 1
visited = [False] * vertex
dfs(graph, start, visited)
์๊ฐ ๋ณต์ก๋
dfs ํจ์(๊ณง ๋ฐ๋ณต๋ฌธ)๋ ์ ์ ์ ๊ฐ์๋งํผ ํธ์ถ๋๊ณ , ๋ฐ๋ณต๋ฌธ์ graph[v] == ๊ฐ์ ์ ๊ฐ์๋งํผ ์ํํ๋ฏ๋ก ์ธ์ ํ๋ ฌ์ ๊ฒฝ์ฐ O(V + E)
, ์ธ์ ๊ทธ๋ํ์ ๊ฒฝ์ฐ O(V^2)
์ด๋ค.
โ
BFS(๋๋น ์ฐ์ ํ์, Breadth-First Search)
์ ์
์ธ์ ๋ ธ๋๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ ๋ค ๊ทธ ์ค ๊ฐ์ฅ ๋จผ์ ๋ฐฉ๋ฌธํ ์ธ์ ๋ ธ๋์ ์ธ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ์
๊ตฌํ
ํ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
ํ์์ ๊บผ๋ธ ๋ ธ๋์ ์ธ์ ๋ ธ๋๋ฅผ ์ํํ๋ฉฐ ๋ฏธ๋ฐฉ๋ฌธ๋ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ ์ธ์ ํ๋ ฌ
์, ์๋ ๊ฒฝ์ฐ ์ธ์ ๋ฆฌ์คํธ
๋ฅผ ์ด์ฉํ๋ค.
์ธ์ ํ๋ ฌ
from collections import deque
INF = 987654321
def bfs(graph, start, visited):
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
print(v, end=" ")
for i in range(len(graph[0])):
if graph[v][i] != 0 and graph[v][i] != INF and not visited[i]:
queue.append(i)
visited[i] = True
graph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
start = 1
visited = [False] * len(graph[0])
bfs(graph, start, visited)
์ธ์ ๋ฆฌ์คํธ
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
vertex = 4
graph = [
[2, 3],
[2],
[0, 1],
[0]
]
start = 1
visited = [False] * vertex
bfs(graph, start, visited)
์๊ฐ ๋ณต์ก๋
๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋ณต๋ฌธ์ ๋
ธ๋์ ๊ฐ์๋งํผ, ์ํ ํ์๋ ๊ฐ์ ์ ์๋งํผ์ด๋ฏ๋ก O(V+E)
๋๋ O(V^2
์ด์ง๋ง DFS๋ณด๋ค ์กฐ๊ธ ๋ ๋น ๋ฅด๋ค๊ณ ํ๋ค.
Last updated