2024. 1. 28. 21:21ใCS - Roadmap.sh/3. Common Algorithms
CS - 3. Common Algorithms - 3.5 Graph - 3.5.1 Breadth First Search(BFS)
Breadth First Search
๐กBreadth first search for a graph is a way to traverse the graph. It starts at the root node and explores all of the neighbor nodes at the present depth prior to moving on to the nodes at the next depth level.
๋์ด ์ฐ์ ํ์์ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฃจํธ ๋ ธ๋์์ ์์ํ์ฌ ๋ค์ ์ฌ๋ ์์ค์ ๋ ธ๋๋ก ์ด๋ํ๊ธฐ ์ ์ ํ์ฌ ์ฌ๋์ ์๋ ๋ชจ๋ ์ด์ ๋ ธ๋๋ฅผ ํ์ํฉ๋๋ค.
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ๋ฉด ๋์ค์ ์ผ๋ก ์ ์๋ ค์ง BFS, ๋์ด ์ฐ์ ํ์ ์ ๋๋ค.
In Python
def bfs(graph: dict, start: int):
# ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํ ๋์
๋๋ฆฌ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
visited = {node: False for node in graph.keys()}
# ํ์์ ์์ํ ๋
ธ๋๋ฅผ ํ์ ๋ฃ์ต๋๋ค.
queue = [start]
# ์์ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํฉ๋๋ค.
visited[start] = True
# ๋ฐฉ๋ฌธ ์์๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
order_of_visit = []
# ํ๊ฐ ๋น์ด์์ง ์์ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
while queue:
# ํ์์ ๋
ธ๋๋ฅผ ํ๋ ๊บผ๋
๋๋ค. (ํ์ฌ ๋
ธ๋)
current_node = queue.pop(0)
order_of_visit.append(current_node)
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ํ์ธํฉ๋๋ค.
for adjacent_node in graph[current_node]:
# ๋ง์ฝ ์ธ์ ํ ๋
ธ๋๋ฅผ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด,
if not visited[adjacent_node]:
# ํด๋น ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํฉ๋๋ค.
queue.append(adjacent_node)
visited[adjacent_node] = True
return order_of_visit
์์์ ์ ์ํ BFS ํจ์๋๋ก, ์์ ๋ ธ๋๋ก๋ถํฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๊ณ , ๊ทธ๋ค์ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ์ง๋ฉ๋๋ค.
1-2,3,4 ๋ฅผ ์์๋๋ก ๋ฐฉ๋ฌธํ ๋ค, 2,3,4 ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ค๊ณ ํ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ธฐ์ ๊ทธ๋ค์ ๊ฐ๊น์ด 5๋ฒ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํฉ๋๋ค.
5-6,7 ๋ก ์ฐ๊ฒฐ๋์ด ์์ด ๊ทธ๋ค์ 6,7 ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํฉ๋๋ค.
์ด์ง ์ด๋ ๊ฒ ๋ณด๋ฉด 1,2,3,4,5,6,7 ๊ทธ๋ฅ ์์๋๋ก ๋ฐฉ๋ฌธํ๋๊ฑฐ ์๋๋? ๋ผ๊ณ ์๊ฐํ ์ ๋ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ์์ ๋ ธ๋๋ 1์ด๋ฏ๋ก, 1๊ณผ ์ง์ ์ฐ๊ฒฐ๋ ๋ ธ๋์ธ 2, 3์ ๋จผ์ ๋ฐฉ๋ฌธํฉ๋๋ค.
๊ทธ ๋ค์์ผ๋ก๋ 2์ 3์์ ๊ฐ ์ ์๋ ๋ ธ๋์ธ 4์ 6์ ๋ฐฉ๋ฌธํ๊ฒ ๋ฉ๋๋ค. 4์์๋ ๋ค์ 5๋ก ์ด๋ํ ์ ์์ผ๋ฏ๋ก 5๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋ฉ๋๋ค.
์ 7๊ณผ 8 ๋ ธ๋๊ฐ ์์๊น์?
import networkx as nx
import matplotlib.pyplot as plt
graph_example2 = {
1: [2, 3],
2: [4],
3: [6],
4: [5],
5: [],
6: [],
7: [],
8: [6, 7]
}
G = nx.DiGraph()
for node, edges in graph_example2.items():
for edge in edges:
G.add_edge(node, edge)
nx.draw(G, with_labels=True)
plt.show()
๊ทธ๋ํ์ ์ฃ์ง ํน์ฑ์ธ ๋ฐฉํฅ์ฑ์ ์กด์ฌ ๋๋ฌธ์ด๊ธฐ๋ ํฉ๋๋ค.
https://parkpakrsu.tistory.com/327
์ ๋ง ๋ณธ๋ค๋ฉด 1 - 3 - 6 - 8 ์ด๋ฐ์์ผ๋ก ๊ฐ์ ์๋ค๊ณ ์๊ฐํ๊ฒ ์ง๋ง, ๊ทธ๋ํ์ ์ฃ์ง๋ ๋ฐฉํฅ์ฑ์ด ์์ต๋๋ค.
ํ์ดํ์ ๋ฐฉํฅ์ผ๋ก๋ง ๋ ธ๋์ ์ด๋์ ์งํํ ์ ์๊ธฐ์, ํ์ ์์๋ ธ๋์ธ 1์์ 8์ผ๋ก ๊ฐ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ ๋๋ค.
๊ฐ์ ๊ทธ๋ํ์ ํ์์ 8๋ฒ์์ ๋ถํฐ ์์ํ๋ค๋ฉด 8,6,7 ์์๋ก ํ์์ด ๋๋๊ฒ ๋ฉ๋๋ค.
ํ์ฉ
BFS ์๊ณ ๋ฆฌ์ฆ์ด ํ์ฉ๋๋ ๊ณณ์ ๋ค์ํฉ๋๋ค.
1. ๋ ๋
ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก ํน์ ์์์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ผ ํ ๋
2. ๊ทธ๋ํ์ ํฌํจ๋ ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํด์ผ ํ ๋
3. ๋ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํด์ผ ํ ๋
์ข๋ ์ค์ ์ ์ธ ์์๋ฅผ ๋ ๋ค๋ฉด,
1. SNS ์น๊ตฌ ์ถ์ฒ ์์คํ
- ์ฌ์ฉ์๋ฅผ ์์ ๋ ธ๋๋ก BFS๋ฅผ ์ํ, ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋(์ฆ, ์น๊ตฌ)๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ , ๊ทธ ๋ค์์ผ๋ก ๊ฐ๊น์ด ๋ ธ๋(์น๊ตฌ์ ์น๊ตฌ)๋ฅผ ๋ฐฉ๋ฌธํ๋ ํ์์ผ๋ก ์น๊ตฌ ์ถ์ฒ์ ํ ์ ์์ต๋๋ค.
๋งํฌ๋์ธ์์ 1์ด, 2์ด, 3์ด, 3์ด์ด์ ๊ฐ์ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
2. GPS ๋ค๋น๊ฒ์ด์
- BFS ๋ GPS ๋ค๋น๊ฒ์ด์ ์์คํ ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํน์ ์์น์์ ๋ชฉ์ ์ง ๊น์ง ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ์ํด, ์์ ์์น์์ BFS๋ฅผ ์ํํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ์์น๋ถํฐ ๋ฐฉ๋ฌธ, ๊ทธ ๋ค์์ผ๋ก ๊ฐ๊น์ด ์์น๋ฅผ ๋ฐฉ๋ฌธ ํ๋ ๋ฐฉ์์ผ๋ก ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
3. ๋คํธ์ํฌ ๋ผ์ฐํ
- ๋คํธ์ํฌ์์ ํจํท์ ์ ์กํ๋ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ BFS๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ผ์ฐํฐ๋ BFS๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ผ์ฐํฐ ๋ถํฐ ๋ฐฉ๋ฌธํ๊ณ , ๊ทธ ๋ค์์ผ๋ก ๊ฐ๊น์ด ๋ผ์ฐํฐ๋ฅผ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ์์ผ๋ก ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ต๋๋ค.
'CS - Roadmap.sh > 3. Common Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3.5 Graph - 3.5.3 Bellman Fordโs Algorithm (1) | 2024.01.29 |
---|---|
3.5 Graph - 3.5.2 Depth First Search(DFS) (1) | 2024.01.29 |
3.5 Graph & 3.6 Tree (0) | 2024.01.27 |
3.4. Cache - 3.4.3 MFU Cache (0) | 2024.01.27 |
3.4. Cache - 3.4.2 LFU Cache (2) | 2024.01.26 |