Algorithm

BFS (Breadth First Search, 너비 우선 탐색)

5_ssssseung 2021. 3. 4. 15:46

설명

  • 그래프를 탐색하는 방법에는 크게 두 가지가 있음
    • 깊이 우선 탐색 (Depth First Search, DFS)
    • 너비 우선 탐색 (Breadth First Search, BFS)
  • 너비우선탐색은 탐색 시작점의 인접한 정점들을 먼저 모두 차례로 방문한 후에, 방문했던 정점을 시작점으로 하여 다시 인접한 정점들을 차례로 방문하는 방식
  • 인접한 정점들에 대해 탐색한 후, 차례로 다시 너비우선탐색을 진행해야 하므로, 선입선출 형태의 자료구조인 큐를 활용

 

  • BFS는 아래와 같은 순서로 탐색

 

  • BFS 알고리즘
def BFS(G, v):          # 그래프 G, 탐색 시작점 v
    visited = [0] * n   # n : 정점의 개수
    queue = []          # 큐 생성
    queue.append(v)     # 시작점 v를 큐에 삽입

    while queue:                # 큐가 비어있지 않은 경우
        t = queue.pop(0)        # 큐의 첫번째 원소 반환
        if not visited[t]:      # 방문되지 않은 곳이라면
            visited[t] = True   # 방문한 것으로 표시
            visit(t)            # 필요한 행동을 취함
        
        for i in G[t]:          # t와 연결된 모든 선에 대해
            if not visited[i]:  # 방문되지 않은 곳이라면
                queue.append(i) # 큐에 넣기


# 완전그래프와 같이 간선이 많이 연결된 그래프일 경우
# 불필요한 계산을 막기위해서 다음과 같은 코드로 수정

def BFS(G, v):
    visited = [0] * n
    queue = []
    queue.append(v)
    visited[v] = True # 시작점을 방문했다고 먼저 선언

    while queue:

        size = len(queue)       # 이렇게 사이즈로 선언하면
        for i in range(size):   # 같은 거리인 정점들끼리 묶어서
            tmp = queue.pop(0)  # 필요 행동을 취할 수 있다.

            # 기존에는 방문 여부를 여기서 확인했음
            visit(t)            # 여기서 필요 행동만 취하고 방문 여부 확인은        
            for i in G[t]:
                if not visited[i]:
                    queue.append(i)
                    visited[i] = True   # 방문 대상인 정점에 대해서 True로 미리 바꿔줌

 

  • BFS 알고리즘 과정

1단계, 2단계
3단계, 4단계
5단계, 6단계
7단계, 8단계
9단계, 10단계
Queue가 비었으므로 탐색 종료

 

'Algorithm' 카테고리의 다른 글

시간 복잡도 개념 및 설명  (0) 2021.04.13
Tree / Binary Tree / Heap (트리, 이진 트리, 힙)  (0) 2021.04.07
Circular Queue (원형 큐)  (0) 2021.03.03
Linear Queue (선형 큐)  (0) 2021.03.03
Quick Sort (퀵 정렬)  (0) 2021.03.02