(전공복습) 데이터과학 4. 시각화
차례
다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다.
즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다.
단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-포드 알고리즘을 사용해야 한다.
기본적인 아이디어는 다음과 같다:
\(\delta(u, v)\)를 \(u\)에서 \(v\)로의 최단거리라고 할 때, \(\delta (u, v)\)의 부분경로는 마찬가지로 최단거리를 가지는 경로가 된다.
다시 말해, 최단경로의 부분경로는 마찬가지로 최단경로이다.
다익스트라 알고리즘의 대략적인 순서는 이렇다:
위 그래프에서 출발점이 A노드라고 하자.
초기화 이후 거리는 위와 같을 것이다.
처음에 가장 거리(0)가 가까운 노드 A가 선택되고, 그 인접 노드(B, C)까지의 거리가 갱신된다.
이후 그 다음으로 거리(2)가 가까운 노드 C가 선택되고, 그 인접 노드(B)까지의 거리가 갱신된다.
그 후에는 B(거리: 3)가 선택되지만, 갱신되는 노드는 없다.
결과적으로 출발점 A에서 각 노드까지의 거리는 0, 3, 2, INF(경로 없음)가 된다.
다익스트라 알고리즘은 우선순위 큐를 활용하면 효율적으로 구현할 수 있다.
가장 가까운 노드를 선택할 때, 선형 탐색(\(O(N)\))을 하는 것보다 최소 힙을 이용한 우선순위 큐(\(O(lgN)\))를 활용하는 것이 더 효율적이기 때문이다.
또한, 우선순위 큐를 사용하면 도달한 노드가 큐에서 빠지므로 방문 처리를 위한 배열이 필요하지 않게 된다.
from heapq import *
INF = float('inf')
# 연결 리스트로 구현된 그래프
graph = [[(1, 4), (2, 2)], [], [(1, 1)], [(0, 1)]]
n = len(graph)
# 거리를 나타내는 리스트, INF로 초기화
distance = [INF] * n
distance[0] = 0
# 최소 힙 우선순위 큐
q = []
heappush(q, (0, 0))
# 다익스트라 알고리즘 진행
while q:
cost, node = heappop(q)
if distance[node] < cost:
continue
for nextNode, nextCost in graph[node]:
if distance[node] + nextCost < distance[nextNode]:
distance[nextNode] = distance[node] + nextCost
heappush(q, (distance[nextNode], nextNode))
# 각 노드까지의 거리 출력
print(distance)
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...