ich eine Implementierung von Dijkstra-Algorithmus zu sehen, und ich habe nicht ganz verstanden, einige Teile dieses Codes:Compute Pfade - Dijkstra-Algorithmus
public static void computePaths(Vertex source) {
source.minDistance = 0;
PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>();
vertexQueue.add(source);
while (!vertexQueue.isEmpty()) {
Vertex u = vertexQueue.poll();
// Visit each edge exiting u
for (Edge e : u.adjacencies) {
Vertex v = e.target;
double distanceThroughU = u.minDistance + e.getweight();
if (distanceThroughU < v.minDistance) {
vertexQueue.remove(v); //How can I remove if I didn't add it first, and why do I need to remove?
v.minDistance = distanceThroughU;
v.previous = u;
vertexQueue.add(v); //Why is it add again?
}
}
}
}
ich über Dijkstra-Algorithmus gelesen, damit ich die allgemeine Logik weiß aber, während ich Als ich diese Implementierung sah, gab es ein paar Dinge, die ich nicht verstand, warum sie gemacht wurden. Kann jemand bitte versuchen zu erklären? Vor allem, wo ich die Kommentare habe!
Bitte lesen [mcve] und verbessern Sie Ihre Frage entsprechend. Wie sollen wir wissen, welche Teile des Codes Ihnen Probleme bereiten? – GhostCat
"* Ich sah eine Implementierung von Dijkstras Algorithmus *" - warum fragen Sie nicht den Autor? – Turing85
Das ist keine großartige Implementierung - 'PriorityQueue.remove' ist eine langsame Operation und macht den Code insgesamt ziemlich langsam. ('add' ist offensichtlich notwendig, denn wie sonst kommen Sie zu anderen Vertices?) – Dukeling