DFS / BFS

iznueΒ·2023λ…„ 12μ›” 29일
0

μ½”λ”©ν…ŒμŠ€νŠΈ

λͺ©λ‘ 보기
6/8
post-thumbnail

πŸ“— DFS & BFS

  • 탐색 μ•Œκ³ λ¦¬μ¦˜
    • DFS와 BFSλŠ” κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜μ— μ†ν•˜λ©°, κ·Έλž˜ν”„μ˜ λͺ¨λ“  꼭짓점을 λ°©λ¬Έν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ˜λ―Έν•¨
    • 트림 탐색은 κ·Έλž˜ν”„ νƒμƒ‰μ˜ 특수 일쒅이며, λ°©λ¬Έν•œ λ…Έλ“œλŠ” λ‹€μ‹œ λ°©λ¬Έν•˜μ§€ μ•ŠμŒ

πŸ”” Graph

  • κ·Έλž˜ν”„λŠ” λ…Έλ“œμ™€ κ°„μ„ μœΌλ‘œ 이루어진 자료ꡬ쑰의 일쒅
  • κ·Έλž˜ν”„ κ΅¬ν˜„ 방식
    1. 인접 ν–‰λ ¬ : 2차원 배열을 ν™œμš©ν•œ 방식
      • μž₯점 : 두 λ…Έλ“œμ˜ κ°„μ„  쑴재 μ—¬λΆ€λ₯Ό λ°”λ‘œ νŒŒμ•…ν•  수 있음
      • 단점 : λͺ¨λ“  관계λ₯Ό κΈ°λ‘ν•˜λ―€λ‘œ λ…Έλ“œμ˜ μˆ˜κ°€ λ§Žμ„ 수둝 λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ 생김
    2. 인접 리슀트 : μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό ν™œμš©ν•œ 방식
      • μž₯점 : μ—°κ²°λœ κ²ƒλ§Œ κΈ°λ‘ν•˜μ—¬ νŠΉμ • λ…Έλ“œμ˜ 인접 λ…Έλ“œλ₯Ό λ°”λ‘œ νŒŒμ•…ν•  수 있음
      • 단점 : 두 λ…Έλ“œκ°€ μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ”λ° 인접 행렬보닀 였래걸림
  • λ”°λΌμ„œ 인접행렬은 κ·Έλž˜ν”„μ— 간선이 많이 μ‘΄μž¬ν•˜λŠ” 밀집 κ·Έλž˜ν”„μΌ λ•Œ, 인접 λ¦¬μŠ€νŠΈλŠ” 간선이 적은 ν¬μ†Œ κ·Έλž˜ν”„μΌ κ²½μš°μ— μ‚¬μš©ν•¨

πŸ”” DFS

  • κ·Έλž˜ν”„μ˜ κΉŠμ€ 뢀뢄을 μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
  • μ‹œκ°„λ³΅μž‘λ„ : O(N)
  • μŠ€νƒ κ΅¬ν˜„ 방법
    1. 빈 μŠ€νƒμ— μ‹œμž‘ν•  λ…Έλ“œλ₯Ό λ„£μŒ
    2. μŠ€νƒμ—μ„œ λ…Έλ“œλ₯Ό popν•˜κ³  좜λ ₯, κΊΌλ‚Έ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ₯Ό λ‹€ λ„£μŒ (μ΄λ•Œ ν•œ 번 μŠ€νƒμ— 담은 λ…Έλ“œλŠ” λ‹€μ‹œ 넣지 μ•ŠμŒ)
    3. 2번 과정을 더 이상 μˆ˜ν–‰ν•  수 없을 λ•ŒκΉŒμ§€ 반볡
    - μŠ€νƒμ„ μ‚¬μš©ν•˜λ―€λ‘œ λ§ˆμ§€λ§‰μœΌλ‘œ 넣은 λ…Έλ“œλΆ€ν„° 탐색됨
  • μž¬κ·€ κ΅¬ν˜„ 방법
    1. λ…Έλ“œμ˜ μžμ‹μ˜ μžμ‹...을 계속 ν˜ΈμΆœν•¨
    2. 더 이상 μžμ‹μ΄ μ—†λŠ” 경우 ν•œ 단계 μ˜¬λΌμ™€μ„œ κ·Έ μ§€μ μ˜ λ‹€λ₯Έ κ²½λ‘œλΆ€ν„° 탐색을 λ‹€μ‹œ μ‹œμž‘ν•¨
    - κ΅¬ν˜„ μ‹œ μŠ€νƒμ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ μ½”λ“œκ°€ 깔끔함
graph = [
    [],      # 0
    [2, 3],  # 1 
    [4, 5],  # 2
    [6],     # 3
    [2, 5],  # 4
    [2, 4],  # 5
    [3, 7],  # 6
    [6]      # 7
]
visited = [False] * 8

# μž¬κ·€ κ΅¬ν˜„
def recursive_dfs(v):
	visited[v] = True
    # print(v, end = '')
    for i in graph[v]:
    	if not visited[i]:
        	recursive_dfs(i)
recursive_dfs(1)

# μŠ€νƒ κ΅¬ν˜„
def iterative_dfs(v):
	visited=[]
    stack = [v]
    while stack:
    	v = stack.pop()
        if v not in visited:
        	visited.append(v)
            for w in graph[v]:
            	stack.append(w)
    return visited
iterative_dfs(1)

πŸ”” BFS

  • κ·Έλž˜ν”„μ˜ λ„ˆλΉ„λΆ€ν„° νƒμƒ‰ν•˜μ—¬ μ‹œμž‘ λ…Έλ“œλ‘œλΆ€ν„° κ°€κΉŒμš΄ 지점을 λ¨Όμ € λ°©λ¬Έν•˜κ³  λ¨Ό 지점은 λ‚˜μ€‘μ— 방문함
  • λ¬΄ν•œν•œ 길이λ₯Ό κ°€μ§€λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•  λ•Œ 탐색 λͺ©ν‘œκ°€ λ‹€λ₯Έ κ²½λ‘œμ— μžˆλŠ” 경우, λͺ¨λ“  경둜λ₯Ό λ™μ‹œμ— μ§„ν–‰ν•˜λ―€λ‘œ 탐색이 κ°€λŠ₯함
  • 큐둜 κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ©° μž¬κ·€λ‘œ κ΅¬ν˜„μ€ λΆˆκ°€λŠ₯함
  • μ‹œκ°„λ³΅μž‘λ„ : O(N) - BFS보닀 쑰금 더 λΉ λ₯΄κ²Œ λ™μž‘ν•¨
  • 큐 κ΅¬ν˜„ 방법
    1. 빈 큐λ₯Ό λ§Œλ“€κ³  μ‹œμž‘ λ…Έλ“œλ₯Ό λ„£μŒ
    2. νμ—μ„œ popν•˜κ³  좜λ ₯함, κΊΌλ‚Έ λ…Έλ“œμ˜ μžμ‹λ“€μ„ 큐에 좔가함 (μ΄λ•Œ, ν•œ 번 큐에 담은 λ…Έλ“œλŠ” λ‹€μ‹œ 넣지 μ•ŠμŒ)
    3. 2번 과정을 더 이상 μˆ˜ν–‰ν•  수 μ—†μ„λ•ŒκΉŒμ§€ 반볡
graph = [
    [],      # 0
    [2, 3],  # 1 
    [4, 5],  # 2
    [6],     # 3
    [2, 5],  # 4
    [2, 4],  # 5
    [3, 7],  # 6
    [6]      # 7
]
visited = [False] * 8

from collections import deque
def bfs(v):
	q = deque()
    q.append(v)
    while q:
    	x = q.popleft()
        # print(x, end='')
        for i in graph[x]:
        	if not visited[i]:
            	q.append(i)
                visited[i] = True
bfs(1)

πŸ”” DFS / BFS의 μ‘μš©

  • DFS의 μž₯점
    - ν•œ κ²½λ‘œμƒμ˜ λ…Έλ“œλ§Œ κΈ°μ–΅ν•˜λ―€λ‘œ 적은 λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•¨
    - λͺ©ν‘œ λ…Έλ“œκ°€ κΉŠμ€ 단계에 μžˆλŠ” 경우 λΉ λ₯΄κ²Œ 탐색 κ°€λŠ₯

  • DFS의 단점
    - λ¬΄ν•œν•œ 길이λ₯Ό κ°€μ§€λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ” 경우 μ˜μ›νžˆ μ’…λ£Œν•˜μ§€ λͺ»ν•¨
    - λͺ©ν‘œμ— 이λ₯΄λŠ” κ²½λ‘œκ°€ λ‹€μˆ˜μΈ 경우, 해에 λ„μ°©ν•˜λ©΄ 탐색을 μ’…λ£Œν•˜λ―€λ‘œ 얻은 ν•΄κ°€ μ΅œλ‹¨ κ²½λ‘œλΌλŠ” 보μž₯이 μ—†μŒ

  • BFS의 μž₯점
    - λͺ¨λ“  경둜λ₯Ό νƒμƒ‰ν•˜λ―€λ‘œ μ—¬λŸ¬ ν•΄κ°€ μ‘΄μž¬ν•΄λ„ μ΅œλ‹¨ 경둜λ₯Ό 보μž₯함
    - λ¬΄ν•œν•œ 길이의 κ²½λ‘œκ°€ μ‘΄μž¬ν•΄λ„ ν•΄λ₯Ό 찾을 수 있음
    - λ…Έλ“œμ˜ μˆ˜κ°€ 적고, κΉŠμ΄κ°€ 얕은 ν•΄κ°€ μ‘΄μž¬ν•  λ•Œ μœ λ¦¬ν•¨

  • BFS의 단점
    - λ…Έλ“œμ˜ μˆ˜κ°€ λ§Žμ„μˆ˜λ‘ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό ν•„μš”λ‘œ 함 (κ·Έλž˜ν”„μ— λΉ„λ‘€ν•˜λŠ” κ³΅κ°„λ³΅μž‘λ„λ₯Ό 가짐)


πŸ“˜ κ΄€λ ¨ 문제

⭐ νƒ€κ²Ÿλ„˜λ²„
⭐ λ„€νŠΈμ›Œν¬
⭐ κ²Œμž„ 맡 μ΅œλ‹¨κ±°λ¦¬
⭐ λ‹¨μ–΄λ³€ν™˜
⭐ μ•„μ΄ν…œ 쀍기
⭐ μ—¬ν–‰κ²½λ‘œ

profile
β‚ŠΛš ⊹ β™‘ https://github.com/iznue

0개의 λŒ“κΈ€