백엔드 개발자 2021. 7. 28. 14:34

출처:https://www.fun-coding.org/Chapter18-dfs-live.html

 

BFS : 너비 우선 탐색 

정점들과 같은 레벨에 있는 노드들을 먼저 탐색하는 방식이다.

 

 

시간복잡도 :

노드수:V

간선수:E

O(V+E)

 

 

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']

 

BFS의 알고리즘 표현

2개의 큐를 활용한다.

 

def bfs( 딕셔너리, 처음원소)

큐2개 선언

시작노드 need_visit에 넣고 시작하기

 

while need_visit이 빌때까지

   첫원소를 빼낸다.(왼쪽에서 빼내기)

   그원소가 visited에 없으면 

   append후 

   need_visit의 오른쪽에 원소 넣기.

 

 

BFS도 마찬가지로 extend( reversed( graph[node]) ) 로 바꾸면 후위순회로 변경된다.

 

 

def bfs( graph , start):
    need_visit=[start]
    visited=[]

   
while need_visit:
        node=need_visit.pop(
0)
       
if node not in visited:
            visited.append(node)
            need_visit.extend(graph[node])
   
return visited

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']

print (bfs(graph,'A') )