on
[Python] DFS & BFS - DFS와 BFS를 쓰는 상황
[Python] DFS & BFS - DFS와 BFS를 쓰는 상황
자바로 dfs와 bfs를 공부한적이있는데, 파이썬으로 다시 해보면서 개념정리와, 어떤 상황에서 유리한지 정리해보고자 한다,
DFS & BFS
DFS란
자료의 검색, 트리나 그래프를 탐색하는 방법. 한 노드를 시작으로 인접한 다른 노드를 재귀적으로 탐색해가고 끝까지 탐색하면 다시 위로 와서 다음을 탐색하여 검색한다. [컴퓨터인터넷IT용어대사전]
dfs는 그래프의 노드를 갈 수 있는 데 까지 끝까지 방문하는 것이다.
노드를 순서대로 목적지에 도달할 때 까지 방문하면서, 각 노드에서 또 방문할 수 있는 위치를 저장해 둔다.
노드가 끝까지 갔다가 다시 한칸 뒤로 돌아와, 갈 수 있는 방향을 탐색한다.
따라서 재귀적이고 / 스택을 이용할 수 있다.
Depth First Search
BFS란
자료의 검색, 트리나 그래프를 탐색하는 방법. 한 노드를 시작으로 인접한 다른 노드를 재귀적으로 탐색해가고 끝까지 탐색하면 다시 위로 와서 다음을 탐색하여 검색한다. [컴퓨터인터넷IT용어대사전]
bfs는 노드에서 인접한 노드를 먼저 방문한다.
한 노드에서 갈수있는 모든 경우의 수를 저장한 후, 순서대로 방문한다.
이를 반복하기 위해서 큐를 사용한다.
큐에 방문할 위치를 저장함으로써 순서대로 방문이 가능하다.
Breadth First Search
탐색 노드의 경우의 수
1. DFS 구현 - Python
dfs 그래프
[재귀를 이용]
# 위의 그래프를 예시로 삼아서 인접 리스트 방식으로 표현했습니다! graph = { 1: [2, 5, 9], 2: [1, 3], 3: [2, 4], 4: [3], 5: [1, 6, 8], 6: [5, 7], 7: [6], 8: [5], 9: [1, 10], 10: [9] } visited = [] def dfs_recursion(adjacent_graph, cur_node, visited_array): visited_array.append(cur_node) for i in adjacent_graph[cur_node] : if i not in visited_array: dfs_recursion(adjacent_graph,i,visited_array) return dfs_recursion(graph, 1, visited) # 1 이 시작노드입니다! print(visited) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 이 출력되어야 합니다!
[스택 이용]
def dfs_stack(adjacent_graph, start_node): stack = [start_node] visited = [] while stack: current_node = stack.pop() visited.append(current_node) for adjacent_node in adjacent_graph[current_node]: if adjacent_node not in visited: stack.append(adjacent_node) return visited
2. BFS 구현 - Python
[재귀를 이용]
728x90
반응형
from http://thalals.tistory.com/195 by ccl(A) rewrite - 2021-10-21 12:26:51