κ·Έλν νμ κΈ°λ²
κ·Έλν : μ μ (node)μ κ·Έ μ μ μ μ°κ²°νλ κ°μ (edge)μΌλ‘ μ΄λ£¨μ΄μ§ μλ£κ΅¬μ‘°μ΄κ³ ,
κ·Έλνλ₯Ό νμνλ κ²μ νλμ μ μ μΌλ‘λΆν° μμνμ¬ μ°¨λ‘λλ‘ λͺ¨λ μ μ λ€μ ν λ²μ© λ°©λ¬Ένλ κ²μ λ§νλ€.
DFS(Depth First Search) : κΉμ΄ μ°μ νμ
BFS(Breadth First Search) : λλΉ μ°μ νμ
DFS(Depth First Search)
μ΅λν κΉμ΄ λ΄λ €κ° λ€, λ μ΄μ κΉμ΄ κ° κ³³μ΄ μμ κ²½μ° μμΌλ‘ μ΄λ
1. λͺ¨λ λ Έλλ₯Ό λ°©λ¬Ένκ³ μ νλ κ²½μ°μ μ΄ λ°©λ²μ μ νν¨
2. κΉμ΄ μ°μ νμ(DFS)μ΄ λλΉ μ°μ νμ(BFS)λ³΄λ€ μ’ λ κ°λ¨ν¨
3. κ²μ μλ μ체λ λλΉ μ°μ νμ(BFS)μ λΉν΄μλ λλ¦Ό
μ μ© : λ―Έλ‘, κΈΈ μ°ΎκΈ°, κ²½λ‘μ νΉμ§μ μ μ₯ν΄μΌ νλ κ²½μ°
BFS(Breadth First Search)
μ΅λν λκ² μ΄λν λ€μ, λ μ΄μ κ° μ μμ λ μλλ‘ μ΄λ
1. μ£Όλ‘ λ λ Έλ μ¬μ΄μ μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύκ³ μΆμ λ μ΄ λ°©λ²μ μ ν
μ μ© : κΈΈμ°ΎκΈ°, λΌμ°ν , μΉ ν¬λ‘€λ¬, μμ λ€νΈμν¬μμ λ©λ¦¬ λ¨μ΄μ§ μ¬λ μ°ΎκΈ°, κ·Έλνμμ μ£Όλ³ μμΉ μ°ΎκΈ°
DFSμ BFSμ μ°¨μ΄
DFS(κΉμ΄ μ°μ νμ) | BFS(λλΉ μ°μ νμ) |
νμ¬ μ μ μμ κ° μ μλ μ λ€κΉμ§ λ€μ΄κ°λ©΄μ νμ | νμ¬ μ μ μ μ°κ²°λ κ°κΉμ΄ μ λ€λΆν° νμ |
μ€ν λλ μ¬κ·ν¨μλ‘ κ΅¬ν | ν μ΄μ©ν΄μ ꡬν |
λ©λͺ¨λ¦¬κ° μ μ | λ Έλκ° λ§μ μλ‘ λ©λͺ¨λ¦¬λ₯Ό λ§μ΄ μλΉ |
κ·Έλνμ κΉμ΄(depth)κ° κΉμ μλ‘ λΉ λ¦ | μ°Ύλ λ Έλκ° μΈμ ν λ μ 리 |
κ·Έλν νμ μμ
DFS(κΉμ΄ μ°μ νμ)
μ κ·Έλνλ₯Ό DFS λ‘ νμνλ©΄ 1 → 2 → 5 → 8 → 6 → 3 → 4 → 7 μ μμΌλ‘ νμμ νλ€.
BFS(λλΉ μ°μ νμ)
μ κ·Έλνλ₯Ό BFS λ‘ νμνλ©΄ 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 μ μμΌλ‘ νμμ νλ€.
Python μΌλ‘ λνλΈ BFS
#BFS - Breadth First Search
#λλΉ μ°μ νμ : κ°κΉμ΄ λ
ΈλλΆν° νμ
#ν μλ£κ΅¬μ‘° μ¬μ©
from collections import deque
def BFS(graph, start, visited) :
queue = deque([start])
#νμ¬ λ
Έλ λ°©λ¬Έ μ²λ¦¬
visited[start] = True
#νκ° λΉ λκΉμ§ λ°λ³΅
while queue :
#νμμ νλμ μμλ₯Ό λ½μ print
v = queue.popleft()
print(v, end = ' ')
#μμ§ λ°©λ¬Ένμ§ μμ μμλ€μ νμ μ½μ
for i in graph[v] :
if not visited[i] :
queue.append(i)
visited[i] = True
visited = [False] * 9
Python μΌλ‘ λνλΈ DFS
#DFS - Depth First Search
#κΉμ΄ μ°μ νμ - κΉμ λΆλΆμ μ°μ μ μΌλ‘ νμ
#μ€ν μλ£κ΅¬μ‘° μ¬μ©
from operator import truediv
visited = [False] * 9
def DFS(graph, v, visited, parent_node=-1) :
#νμ¬ λ
Έλλ₯Ό λ°©λ¬Έ μ²λ¦¬
visited[v] = True # assign current node as
print(v, end = ' ')
for i in graph[v] :
if not visited[i] : # if `i' is not visited
if DFS(graph, i, visited, v) :
return True
elif i != parent_node : # if `i` is visited, and `i` is not a parent_node
return True
return False