λλΉ μ°μ νμ (BFS), κΉμ΄ μ°μ νμ (DFS) μ 리
π©π» λλΉ μ°μ νμ (BFS), κΉμ΄ μ°μ νμ (DFS) μ 리 with Python
π₯ λλΉ μ°μ νμ (Breadth-First-Search)
Node κ°μ λ 벨μ μλ Nodeλ€ (νμ Nodeλ€)μ λ¨Όμ νμνλ λ°©μμ λλ€.
νμ΄μ¬μ μ΄μ©ν κ·Έλν νν μ½λ
graph = dict()
graph['A'] = ['B', 'C']
graph['B'] = ['A', 'D']
graph['C'] = ['A', 'G', 'H', 'I']
graph['D'] = ['B', 'E', 'F']
graph['E'] = ['D']
graph['F'] = ['D']
graph['G'] = ['C']
graph['H'] = ['C']
graph['I'] = ['C', 'J']
graph['J'] = ['I']
λλΉ μ°μ νμ (Breadth-First-Search) μκ³ λ¦¬μ¦ κ΅¬ν
def BFS(graph, startNode):
visited,needVisited = list(),list()
needVisited.append(startNode)
while needVisited:
node = needVisited.pop(0)
if node not in visited:
visited.append(node)
needVisited.extend(graph[node])
return visited
μλ£κ΅¬μ‘° Queueλ₯Ό νμ©νμ¬μ
visitedμ needVisited λ κ°μ Queueλ₯Ό μμ±νμ¬μ μκ³ λ¦¬μ¦ κ΅¬ννκ² λ©λλ€.
Queueμ κ·νμ κ°λ¨ν νμ΄μ¬ 리μ€νΈλ₯Ό νμ©ν©λλ€.
μ½λ μ€ν κ²°κ³Ό
π³ κΉμ΄ μ°μ νμ (Depth-First-Search)
Nodeμ Childλ€μ λ¨Όμ νμνλ λ°©μμ λλ€.
κΉμ΄ μ°μ νμ (Depth-First-Search) μκ³ λ¦¬μ¦ κ΅¬ν
def BFS(graph, startNode):
visited,needVisited = list(),list()
needVisited.append(startNode)
while needVisited:
node = needVisited.pop()
if node not in visited:
visited.append(node)
needVisited.extend(graph[node])
return visited
μλ£κ΅¬μ‘° Stackκ³Ό Queueλ₯Ό νμ©νκ² λ©λλ€.
needVisited Stackκ³Ό visited Queue, λ κ°μ μλ£κ΅¬μ‘°λ₯Ό μμ±νμ¬ μκ³ λ¦¬μ¦μ ꡬννκ² λ©λλ€.
Queueμ Stackμ κ°λ¨ν νμ΄μ¬ 리μ€νΈλ₯Ό νμ©νμμ΅λλ€.
μ½λ μ€ν κ²°κ³Ό
BFS μλ£κ΅¬μ‘°λ λ κ°μ Queueλ₯Ό νμ©νλλ° λ°ν΄,
DFSλ Stackκ³Ό Queueλ₯Ό νμ©νλ€λ μ°¨μ΄κ° μμμ νμΈν©μλ€!
πͺ μκ° λ³΅μ‘λ
μΌλ°μ μΈ DFS μκ° λ³΅μ‘λ
- λ Έλ μ: V
- κ°μ μ: E
- μ μ½λμμ while need_visit μ V + E λ² λ§νΌ μννκ² λ©λλ€.
- μκ° λ³΅μ‘λ: O(V + E)
μΌλ°μ μΈ BFS μκ° λ³΅μ‘λ
- λ Έλ μ: V
- κ°μ μ: E
- μ μ½λμμ while need_visit μ V + E λ² λ§νΌ μννκ² λ©λλ€.
- μκ° λ³΅μ‘λ: O(V + E)