최단 경로 알고리즘은 다음과 같이 분류
// ShortestPath() : edge object 객체 저장을 위한 생성자
// key: vertex
// value: list 형태로 연결된 vertex를 표현하여 edge 연결 관계 표현
function ShortestPath() {
this.edges = {};
}
// addVertex() : 정점 추가(간선 비용 표시를 위해 key/value object 형태로 저장)
ShortestPath.prototype.addVertex = function (vertex) {
this.edges[vertex] = {};
};
// addEdge() : 간선 추가
ShortestPath.prototype.addEdge = function (srcVertex, dstVertex, weight) {
this.edges[srcVertex][dstVertex] = weight;
};
// _extractMin() : 최단 거리 노드 검색
ShortestPath.prototype._extractMin = function (queue, dist) {
let minDistance = Number.POSITIVE_INFINITY;
let minVertex = null;
for (let vertex in queue) {
if (dist[vertex] <= minDistance) {
minDistance = dist[vertex];
minVertex = vertex;
}
}
return minVertex;
};
// dijkstra() : 다익스트라 최단 경로 탐색
ShortestPath.prototype.dijkstra = function (start) {
let queue = {};
let dist = {};
for (let vertex in this.edges) {
dist[vertex] = Number.POSITIVE_INFINITY;
queue[vertex] = this.edges[vertex];
}
dist[start] = 0;
while (Object.keys(queue).length != 0) {
let u = this._extractMin(queue, dist);
delete queue[u];
for (let neighbor in this.edges[u]) {
let alt = dist[u] + this.edges[u][neighbor];
if (alt < dist[neighbor]) dist[neighbor] = alt;
}
}
for (let vertex in this.edges) {
if (dist[vertex] === Number.POSITIVE_INFINITY)
delete dist[vertex];
return dist;
};
// floydWarshall() : 플로이드-워셜 최단 경로 탐색
ShortestPath.prototype.floydWarshall = function () {
let dist = {};
for (let srcVertex in this.edges) {
dist[srcVertex] = {};
for (let dstVertex in this.edges) {
if (srcVertex === dstVertex) dist[srcVertex][dstVertex] = 0;
else dist[srcVertex][dstVertex] = Number.POSITIVE_INFINITY;
}
}
for (let srcVertex in this.edges) {
for (let dstVertex in this.edges[srcVertex])
dist[srcVertex][dstVertex] = this.edges[srcVertex][dstVertex];
}
for (let midVertex in this.edges)
for (let srcVertex in this.edges)
for (let dstVertex in this.edges)
dist[srcVertex][dstVertex] = Math.min(dist[srcVertex][dstVertex], dist[srcVertex][midVertex] + dist[midVertex][dstVertex]);
for (let srcVertex in this.edges)
for (let dstVertex in this.edges)
if (dist[srcVertex][dstVertex] === Number.POSITIVE_INFINITY)
delete dist[srcVertex][dstVertex];
return dist;
};
기준 | 다익스트라 | 플로이드-와샬 |
---|---|---|
계산 범위 | 단일 출발점 | 전체 노드 쌍 |
시간 복잡도 | O((V+E) log V) | O(V³) |
공간 복잡도 | O(V) | O(V²) |
가중치 제약 | 음수 불가 | 음수 허용(사이클 제외) |
최적화 기법 | 우선순위 큐 | 동적 계획법 |
적합 그래프 | 희소 그래프 | 밀집 그래프 |
다익스트라가 적합한 경우:
플로이드-와샬이 적합한 경우: