알고리즘/PYTHON

알고리즘 with 파이썬 (7) - BFS 너비 우선 탐색 개념

뚜벅-뚜벅 2021. 4. 6. 00:23

BFS는 큐 자료구조에 기초하여 구현이 간단하다. deque 라이브러리를 이용한다.

가까운 노드부터 탐색하는 알고리즘으로, 최대한 멀리있는 노드를 우선 탐색하는 DFS 와 반대이다.

인접 노드를 작은 순으로 큐에 담고, 다음 turn에서 빼므로 (선입선출) 자연스럽게 가까운 노드 순으로 방문하게 된다

DFS(깊이우선탐색) 보다 실제 수행시간이 짧다 = 빠르다.

 

1) 탐색 시작 노드를 큐에 삽입하고 방문처리를 한다

2) 큐에서 노드를 꺼내, 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문처리를 한다.

3) 2)의 과정을 더이상 수행할 수 없을 때 까지 반복

 

이번에도 위 그래프를 너비우선탐색 방식으로 처리해보자

from collections import deque

#BFS 메서드 정의
def bfs(graph, start, visited):
    #큐 구현을 위해 deque라이브러리 사용
    queue = deque([start])
    #현재노드를 방문처리
    visited[start] = True
    #큐가 빌때 까지 반복
    while queue:
        #큐에서 하나의 원소를 뽑아 출력
        v =queue.popleft()
        print(v,end=' ')
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i]= True

#각 노드가 연결된 정보를 리스트 자료형으로 표현
graph =[
    [],  # 0번노드는 없으니깐 ㅋ
    [2, 3, 8],  # 1번노드
    [1, 7],  # 2번노드
    [1, 4, 5],  # 3번노드 연결된 값들
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

#각 노드가 방문된 정보를 리스트 자료형으로 표현 (1차원리스트)
visited = [False]*9
#정의된 BFS 함수 호출
bfs(graph, 1, visited)

결과

 

1 2 3 8 7 4 5 6 

 

* 노드의 방문순서가 DFS 탐색 결과와 다르다..!

* DFS 는 재귀호출을 통해 방문처리했다면, BFS 는 queue.popleft() 를 통해 먼저들어온값 순으로 방문처리

 깊이우선탐색 DFS 보다 빠르다라는 점 알아두자