2024. 1. 30. 03:12ใCS - Roadmap.sh/3. Common Algorithms
CS - 3. Common Algorithms - 3.5 Graph - 3.5.4 Dijkstra's Algorithm
Dijkstra’s Algorithm
๐กDijkstra’s algorithm is a graph traversal algorithm that finds the shortest path between two nodes in a graph.
It is a weighted graph algorithm, meaning that each edge in the graph has a weight associated with it.
The algorithm works by finding the shortest path from the starting node to all other nodes in the graph.
It does this by keeping track of the distance from the starting node to each node, and then choosing the node with the shortest distance from the starting node to visit next.
It then updates the distance of each node from the starting node, and repeats the process until all nodes have been visited.
๋ํฌ์คํธ๋ผ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ์์ ๋ ๋ ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๊ฐ์ค ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๊ทธ๋ํ์ ๊ฐ ์์ง์๋ ๊ฐ์ค์น๊ฐ ๋ถ์ฌ๋ฉ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์์ ๋ ธ๋์์ ๊ทธ๋ํ์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์์ ๋ ธ๋์์ ๊ฐ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ์ ํ ๋ค์, ์์ ๋ ธ๋์์ ๋ค์ ๋ฐฉ๋ฌธ ๋ ธ๋๋ก ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ๋ ธ๋๋ฅผ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ์ํ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์์ ๋ ธ๋์์ ๊ฐ ๋ ธ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋๊น์ง ์ด ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ( Dijkstra's Algorithm)์
1.2.4 Graph representation, 1.3 Heap ์์ ์ธ๊ธ์ ํ๋ฒ ํ์๋ค.
(https://parkpakrsu.tistory.com/331 - ํ๊ณผ ๊ด๋ จ๋ ์๊ณ ๋ฆฌ์ฆ)
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ์์ ํ ์ ์์ ๋ค๋ฅธ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ 'ํ์ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithms)'์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ๋งค ๋จ๊ณ์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋๋ฅผ ์ ํํ๋ ๋ฐฉ์์ด๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋์์ ์ด๋ฐ ์์์ด๋ค.
1. ์์ ๋ ธ๋๋ฅผ ์ค์ ํ๋ค.
2. ์ต๋จ ๊ฑฐ๋ฆฌ ํ๋ฅผ ์ด๊ธฐํ ํ๋ค. (์์ ๋ ธ๋์ ๊ฑฐ๋ฆฌ๋ 0, ๋๋จธ์ง ๋ ธ๋์ ๊ฑฐ๋ฆฌ๋ ๋ฌดํ๋)
3. ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๋ค.
4. ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐ, ์ต๋จ ๊ฑฐ๋ฆฌ ํ๋ฅผ ๊ฐฑ์ ํ๋ค.
5. ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
In Python
import heapq
def dijkstra(graph, start):
# ๊ฐ ๋
ธ๋์ ์์ ๋
ธ๋๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋์
๋๋ฆฌ ์์ฑ
# ์ด๊ธฐ์๋ ๋ชจ๋ ๋
ธ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌดํ๋๋ก ์ค์
distances = {node: float('inf') for node in graph}
distances[start] = 0 # ์์ ๋
ธ๋์ ๊ฑฐ๋ฆฌ๋ 0์ผ๋ก ์ค์
# ์ฐ์ ์์ ํ ์์ฑ
queue = []
# ์์ ๋
ธ๋์ ๊ฑฐ๋ฆฌ(0)์ ์์ ๋
ธ๋๋ฅผ ์ฐ์ ์์ ํ์ ๋ฃ์
heapq.heappush(queue, [distances[start], start])
while queue: # ํ๊ฐ ๋น์ด์์ง ์์ ๋์
# ์ฐ์ ์์ ํ์์ ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ํ ๊ฑฐ๋ฆฌ์ ํด๋น ๋
ธ๋๋ฅผ ๊บผ๋
current_distance, current_node = heapq.heappop(queue)
# ๊ธฐ์กด์ ๊ณ์ฐํ ํด๋น ๋
ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง๋ค๋ฉด, ๋ฌด์
if distances[current_node] < current_distance:
continue
# ์ธ์ ๋
ธ๋, ๊ฐ์ค์น๋ฅผ ์ํ
for adjacent, weight in graph[current_node].items():
# ์ ํ๋ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ ์ธ์ ๋
ธ๋๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐ
distance = current_distance + weight
# ๋ง์ฝ ์์ ๋
ธ๋์์ ์ธ์ ๋
ธ๋๋ก ๋ฐ๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ณด๋ค ํ์ฌ ๊ณ์ฐํ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง๋ค๋ฉด
if distance < distances[adjacent]:
# ์ธ์ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธ
distances[adjacent] = distance
# ๋ค์ ์ธ์ ๋
ธ๋์ ๊ฑฐ๋ฆฌ์ ๋ค์ ์ธ์ ๋
ธ๋๋ฅผ ํ์ ๋ฃ์
heapq.heappush(queue, [distance, adjacent])
# ๋ชจ๋ ๋
ธ๋๋ก์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐํ
return distances
์์ ๋ ธ๋์์ ๊ฐ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋์ ๋๋ฆฌ ํํ๋ก ๋ฐํํฉ๋๋ค.
์์๋ก ์ด๋ฐ ํํ์ ๊ทธ๋ํ๋ฅผ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํตํด A ๋ ธ๋์์์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
A-A ์๊ธฐ ์์ ์ด๋ 0,
A-B 8, A-C-B ๊ฐ 1+5 ๋ก 6. ๋ฐ๋ผ์ ์ต์๊ฐ 6
์ด๋ฐ์์ผ๋ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ํ์ธํ ์ ์์ต๋๋ค.
ํ์ฉ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ํ ์ํฉ์์ ํ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋คํธ์ํฌ ๋ผ์ฐํ , GPS, ์ ๋ ฅ ๊ทธ๋ฆฌ๋, SNS ์น๊ตฌ์ถ์ฒ ๋ฑ
์ด๋ค ๋ ธ๋์์ - ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
'CS - Roadmap.sh > 3. Common Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3.6 Greedy Algorithms (0) | 2024.02.02 |
---|---|
3.5 Graph - 3.5.5 A* Algorithm (0) | 2024.01.31 |
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.5.1 Breadth First Search(BFS) (0) | 2024.01.28 |