我是一名前端Javascript开发人员,但想学习一些图论以准备Google面试,我查阅了Dijkstra算法的一些实现。Dijkstra的算法应该返回什么?
的例子这里列出 https://github.com/mburst/dijkstras-algorithm/blob/master/dijkstras.js 似乎适合于寻找两个节点之间的最短路径,并返回它们之间的最短节点路径,但在维基百科上的伪代码版本似乎同时返回“上一个,和DIST” - - 他们应该是什么?
我试图修改GitHub的例子,以配合维基百科伪和返回的距离似乎给最短的数值距离分别来自startVertex ...但上一个没有返回的最短路径
var INFINITY = 1/0;
function PriorityQueue() {
this._nodes = [];
this.enqueue = function (priority, key) {
this._nodes.push({key: key, priority: priority });
this.sort();
}
this.dequeue = function() {
return this._nodes.shift().key;
}
this.sort = function() {
this._nodes.sort(function (a, b) {
return a.priority - b.priority;
});
}
this.isEmpty = function() {
return !this._nodes.length;
}
}
function Graph(){
this.vertices = {};
this.addVertex = function(name, edges){
edges = edges || null;
this.vertices[name] = edges;
}
}
function djikstra(graph, startVertex) {
var nodes = new PriorityQueue();
var distances = {};
var previous = {};
for(vertex in graph.vertices) {
if (vertex === startVertex) {
distances[vertex] = 0;
nodes.enqueue(0, vertex);
} else {
distances[vertex] = INFINITY;
nodes.enqueue(INFINITY, vertex);
}
previous[vertex] = null;
}
while(!nodes.isEmpty()) {
var smallest = nodes.dequeue();
for(var neighbor in graph.vertices[smallest]) {
var alt = distances[smallest] + graph.vertices[smallest][neighbor];
if(alt < distances[neighbor]) {
distances[neighbor] = alt;
previous[neighbor] = smallest;
}
}
}
return distances;
}
var graph = new Graph();
graph.addVertex('S', {V: 1, W: 4});
graph.addVertex('V', {W: 2, T: 6});
graph.addVertex('W', {T: 3});
graph.addVertex('T');
console.log(djikstra(graph, 'S'));
//
{ S: 0, V: 1, W: 3, T: 6 }
此实现似乎的最短路径的长度从给定的节点返回到每一个节点,在这种情况下'S'。 – mrmcgreg
根据你的需要,它可以返回路径和/或路径中所有顶点的总和。 – Mox
什么是prev应该在wikipedia pseudocode? – WinchenzoMagnifico