본문 바로가기

algorithm using python

graph algorithms - bfs, dfs

그래프구조에서 기초적인 탐색알고리즘으로 이용되는 bfs, dfs를 파이썬으로 구현해보았다.

 

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

- 루트 노드에서 시작해 인접 노드를 먼저 탐색하는 방법

- 넓게 탐색

- 두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때 이용

- 재귀적으로 동작하지 않음

- 어떤 노드를 방문했었는지 여부를 반드시 검사해야함

- 큐를 이용해서 넓이부터 탐색

 

DFS = Depth First Search

- 루트 노드에서 시작해 다른 branch로 넘어가기 전 해당 branch를 깊게 완벽하게 탐색

- 모든 노드를 방문하고자 할 때 이용

- Stack 이용

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
graph_list = {1:set([3,4]),
    2:set([3,4,5]),
    3:set([1,5]),
    4:set([1]),
    5:set([2,6]),
    6:set([3,5])}
 
root_node = 1
 
 
def bfs(graph, root):
    visited = []
    queue = []
 
    queue.append(root)
 
    while queue:
        node = queue.pop(0)
        if node not in visited:
            visited.append(node)
            queue.extend(graph[node]) #append처럼 데이터형을 유지하며 붙이지 않고 데이터의 element(iterable한 element)를 꺼내 붙인다.
 
    return visited
 
def dfs(graph, root):
    visited = []
    stack = []
 
    stack.append(root)
    
    while stack:
        node = stack.pop()
        if node not in visited:
            visited.append(node)
            stack.extend(graph[node])
 
    return visited
 
 
 
def main():
    a = bfs(graph_list,root_node)
    b = dfs(graph_list,root_node)
    print('given graph : ', graph_list, ' given root : ', root_node)
    print('bfs : ', a, ' dfs : ', b)
 
if __name__ == '__main__':
    main()
cs

'algorithm using python' 카테고리의 다른 글

이진탐색  (0) 2021.07.17
Quick Sort  (0) 2020.07.21
Merge Sort  (0) 2020.07.20