- 다익스트라 알고리즘은 매번 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택하여 한 단계씩 최단 거리를 구해나간다.
- 시간 복잡도는 O((n + m)logn))으로, n+m은 adjacent list일 경우에 걸리는 vertex와 edge 탐색 시간, logn은 PQ를 유지하면서 탐색하는 시간을 의미한다.
- 반면, 벨만-포드 알고리즘은 매 단계마다 모든 간선을 전부 확인하며 모든 노드간의 최단 거리를 구해나간다.
- 반드시 directed edges를 가정해야 한다! 만약 undirected graph일 경우, 음수 가중치 cycle이 형성될 수도 있기 때문이다.
- 음수 간선이 있어도 최적의 해를 찾을 수 있다.
- 시간 복잡도는 O(nm)으로, 느린 편이다.
procedure
- 전체 노드 개수 - 1 번의 반복을 하는 동안, i번째 iteration에서 i edges를 사용하는 모든 최단 경로를 구한다.
Digraph : 모든 간선이 방향이 있는 그래프
Why? 각 노드별 간선의 갯수가 n-1, n-2, n-3, ..., 1, 0이 되므로, n(n-1)/2이다. 이 때, 방향이 두 가지 존재하므로 2 * n(n-1)/2 = n(n-1)이 최대 간선 갯수가 된다.
이 때, 필요한 연산은
ALgorithm TopologicalSort(G)
H <- G // Temporary copy of G
n <- G.numVertices()
while H is not empty do
Let v in H be a vertex with no outgoing edges
Label v <- n
n <- n-1
Remove v from H
왜 Dijkstra's alg보다 빠른가?
- 그래프에 사이클이 없고, 엣지가 한 방향으로만 존재하기 때문에. 그런 그래프가 constant를 갖고 있기 때문에.
- Topological Order를 사용할 수 있기 때문에. 덕분에 정점을 단 한 번씩만, 간선을 단 한 번씩만 확인하면 끝난다.
즉, 우선순위 큐가 필요 없고, 복잡한 relaxation 반복도 필요 없다.DAG SP와 Topological Sort의 관계
- DAG SP 알고리즘은 위상 정렬이 없으면 아예 성립할 수 없다.
- 즉, DAG 최단 경로 알고리즘은 위상 정렬을 기반으로 만들어진 알고리즘으로, 구조적 기반 <-> 응용 관계이다.
- 위상 정렬이 DAG의 정점들을 정답이 될 수 있는 순서로 정렬해준다.
- DAG-based SP 알고리즘은 그 순서를 이용해 각 정점을 단 한 번만 처리해서 최단 경로를 계산한다.
즉, 위상 정렬이 순서를 만들고, DAG-SP가 그 순서를 이용해 최단 경로를 구한다.