블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
그래프 탐색 알고리즘에는 대표적으로 BFS
와 DFS
가 있다.
본 글에서는 아래 그래프를 가지고, BFS
와 DFS
의 탐색 알고리즘을 살펴본다.
BFS
너비 우선 탐색을 BFS
라 부르고, Breadth Frist Search
의 약자이다.
해당 노드와 같은 레벨(Level
)의 노드를 먼저 탐색을 하기 때문에 붙여진 이름이다.
위 그래프를 예로 탐색 순서를 나열하면, 아래와 같은 순서로 탐색을 하게된다.
- A - B - C - D - E - F - G - H - I - J - K - L - M
코드
아래 코드는 unittest
기반으로 작성했다. 알고리즘은 bfs()
메소드를 참고한다.
# -*- coding: utf-8 -*-
import unittest
def bfs(graph, start):
"""너비 우선 탐색 알고리즘"""
queue = [start] # 초기값은 시작 노드
visit = list() # 방문했던 노드는 다시 재방문 하지 않기 위해 저장
while queue:
node = queue.pop(0) # 큐에서 노드를 꺼내온다.
if node not in visit: # 방문하지 않은 노드인 경우, 방문한다.
visit.append(node) # 방문 리스트에 추가한다.
# 큐에 인접한 노드들을 추가한다.
queue.extend(graph[node])
# .extend()는 아래 코드와 동일하다
# for new_node in graph[node]:
# queue.append(new_node)
return visit
# ...
class Exam15(unittest.TestCase):
@classmethod
def setUp(cls):
cls.graph = {
"A": ["B"],
"B": ["A", "C", "D"],
"C": ["B", "E", "F"],
"D": ["B", "G", "H"],
"E": ["C"],
"F": ["C", "I"],
"G": ["D"],
"H": ["D", "J", "K"],
"I": ["F", "L"],
"J": ["H", "M"],
"K": ["H"],
"L": ["I"],
"M": ["J"],
}
def test_bfs(self):
self.assertEqual(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], bfs(self.graph, "A"))
# ...
if __name__ == "__main__":
unittest.main()
BFS 응용하기 2020/04/01 - [Algorithm] - 탐색 알고리즘 BFS 응용하기 (친밀도 구하기)
DFS
깊이 우선 탐색을 DFS
라 부르고, Depth First Search
의 약자이다.
BFS
와 반대로 해당 노드의 자식 노드를 먼저 탐색하는 차이점이 있다.
위 그래프를 예로 탐색 순서를 나열하면, 아래와 같은 순서로 탐색을 하게된다.
- A - B - C - E - F - I - L - D - G - H - J - M - K
코드
아래 코드는 unittest
기반으로 작성했다. 알고리즘은 dfs()
메소드를 참고한다.
# -*- coding: utf-8 -*-
import unittest
# ...
def dfs(graph, start):
"""깊이 우선 탐색 알고리즘"""
stack = [start]
visit = list()
while stack:
node = stack.pop()
if node not in visit:
visit.append(node)
# 아래와 같이 해도 DFS 이지만, 오른쪽에서 왼쪽으로 탐색을 해서 결과값이 다르게 나온다.
# stack.extend(graph[node]) # ["A", "B", "D", "H", "K", "J", "M", "G", "C", "F", "I", "L", "E"]
# 왼쪽에서 오른쪽 탐색을 위해, reversed()를 이용해 연순으로 바꿔준다.
stack.extend(reversed(graph[node]))
return visit
class Exam15(unittest.TestCase):
@classmethod
def setUp(cls):
cls.graph = {
"A": ["B"],
"B": ["A", "C", "D"],
"C": ["B", "E", "F"],
"D": ["B", "G", "H"],
"E": ["C"],
"F": ["C", "I"],
"G": ["D"],
"H": ["D", "J", "K"],
"I": ["F", "L"],
"J": ["H", "M"],
"K": ["H"],
"L": ["I"],
"M": ["J"],
}
# ...
def test_dfs(self):
self.assertEqual(["A", "B", "C", "E", "F", "I", "L", "D", "G", "H", "J", "M", "K"], dfs(self.graph, "A"))
if __name__ == "__main__":
unittest.main()
미로찾기 알고리즘 2020/04/01 - [Algorithm] - 미로 찾기 알고리즘 BFS, DFS (with Python3)
반응형
'Algorithm' 카테고리의 다른 글
미로 찾기 알고리즘 BFS, DFS (with Python3) (0) | 2020.04.01 |
---|---|
탐색 알고리즘 BFS 응용하기 (친밀도 구하기) (0) | 2020.04.01 |
회문, 팰린드롬(Palindrome) 알고리즘 (with Python3) (0) | 2020.03.28 |
큐(Queue) 와 스택(Stack) 자료구조 (0) | 2020.03.28 |
이진 탐색 (Binary Search) 알고리즘 with Python3 (0) | 2020.03.25 |