Algorithm

λ„ˆλΉ„ μš°μ„  탐색 (BFS), 깊이 μš°μ„  탐색 (DFS) 정리

Yusang 2021. 8. 3. 08:07

πŸ‘©‍πŸ’» λ„ˆλΉ„ μš°μ„  탐색 (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)