Diskussion:Dijkstra-Algorithmus/Archiv

message: In dem Artikel wird der Dijkstra-Algorithmus mit Kruskal (minimal spannender Baum) verglichen. Diese beiden Probleme sind nicht äquivalent! Man kann ein einfaches Beispiel konstruieren, wo der Kürzeste-Pfade-Graph anders aussieht als der minimal spannende Baum.
:Das ist natürlich richtig, Aber im Grunde ist der Algorithmus von Dijkstra identisch zum Algorithmus vom Prim. Dijkstra bricht lediglich ab, wenn der Zielknoten erreicht wurde und berechnet (im Falle das man wirklich den Pfad kennen möchte) nochmal den Weg zurück... Prim bricht erst ab, wenn alle Knoten besucht wurden. Prim berechnet damit einem MST und lässt sich somit mit Kruskal vergleichen. Ich schau mir die Behauptung mal an und korrigiere das ggf.
::Also erstmal hab ich deine Änderung rückgängig gemacht, denn die war falsch... ich werde jetzt versuchen es etwas besser zu formulieren... --Coma 16:42, 27. Aug 2004 (CEST)
thread_title:  Dijkstra != MST (Kruskal) 

message: das alte algorithmus war nicht korrekt. ich ahbe eine korrekte version hineingestellt. Virtualone 13:31, 17. Nov 2004 (CET)
thread_title:  Algorithmus 

message: IMO ist der Satz "Damit findet sich eine Verwandtschaft zur Breitensuche, die ebenfalls solch ein gieriges Verhalten aufweist." nicht richtig. Wenn ich mich nicht täusche ist die Breitensuche nicht gierig, da bei der standard Breitensuche ja gar keine Heuristik vorhanden ist um einen "besseren" Folgeknoten aus der Liste potenzieller Folgeknoten auszuwählen. Die Verwandschaft von Dijkstra zum Breitensuche ist aber natürlich gegeben und zwar durch die "breite" Traversierungeigenschaft der Breitensuche. Species_8472 10:10, 01. Sep 2006 (CET)
replies: text: Kurz knapp und bündig: dein Einwand ist absolut korrekt. :-) Da mir aber auf die schnelle keine schöne Formulierung für "breite Traversierung in Bezug auf den Abstand zum Startknoten" einfiel, an dieser Stelle nur ein "Sei mutig!" :-) Regnaron 16:53, 1. Sep 2006 (CEST)
thread_title:  Grundlegende Konzepte und Verwandschaften 

message: Ich will ja nicht daruf rumreiten, aber... 
Das initialisieren der Menge U mit {s} hat schon seinen sinn. Die laufzeit ist ja O(n*log(n)) + O(m), wobei das log(n) nur durch das "finde-minimum" mit hilfe der fibonacci-hepas erzeugt wird. die menge U klein zu halten beschleunigt den algorithmus schon, und steht meines wissens in den sauberen implementierungen auch so drinnen.
korrekt ist er in beiden fällen, zumindest soweit ich das bisher beurteilen kann. ich dachte zuerst dass ein problem mit mehrfachkanten oder kanten auf sich selbst existiert, konnte jedoch kein beispiel finden. --Virtualone 01:05, 18. Nov 2004 (CET)
replies: text: ein beispiel für fehlverhalten habe ich gefunden: hat der graph mehrere zusammenhangskomponenten (was du in der definition bequemerweise ausschießt), so arbeitet er danach nicht mehr korrekt. da wird für "finde minimum" dann +"unendlich" ausgewählt. wird mit U={s} begonnen und danach im "inneren if" der knoten v zu U hinzugefügt (wie in meier version), löst sich das problem mit zusammenhagskomponenten von alleine. der nicht mit s verbundene teil bleibt auf entfernung unendlich und wird auch nie besucht.--Virtualone 01:23, 18. Nov 2004 (CET)
replies: text:  Ja, das mit den Abbruchbedingungen bei unzusammenhängenden Graphen (im ungerichteten Fall) und nicht stark-zusammenhängenden Graphen (im gerichteten Fall) hätte ich auch noch als Problem gesehen. Das könnte man höchstens noch dadurch reparieren, dass man abbricht, wenn man als minimum nur "unendlich" findet. Ein anderes Problem sehe ich jetzt nicht. Aber dann ist es vermutlich doch besser, deine Variante zu nehmen, da man so nichts an länge im Alg. spart. Werde das gleich ändern... --Coma 01:58, 18. Nov 2004 (CET)
thread_title:  Initialisierung 

message: In dem Algorithmus werden in der Initialisierung alle d(u) für u in U auf unendlich gesetzt. Aber dan wird immer in Linie 6 gesucht nach ein u mit d(u) minimal. Was macht das für Sinn wann immer alle u in U eine unendliche Distanz d(u) haben? 
Kan jemand mir (hier oder vielleicht im Artikel) das erklären? Ich versuche den Algorithmus zu verstehen, dafür ist dieser Artikel auch gemeint natürlich. Freundliche Grüsse, 84.84.73.66 15:06, 31. Dez 2005 (CET)
replies: text: Kein Antwort, obwohl es ein bedeutender Fehler war. Jetzt habe ich die Situation schon repariert. 84.84.73.66 18:17, 3. Jan 2006 (CET)
replies: text: Meiner Ansicht nach war die alte Version auch richtig. Zudem haben nach der Initialisierung nicht alle Knoten in U eine unendliche Distanz, sondern d(s) ist 0 und s ist ein Element von U zu Beginn (da zu Beginn U = V und s ein Element von V ist). --217.252.247.129 11:23, 21. Jan 2006 (CET)
replies: text: Ich habe mir erlaubt, die alte, einfachere Version des Algorithmus wieder einzustellen. Wie Benutzer "217.252.247.129" bereits bemerkt hat, ist diese vollkommen korrekt. Die neue Version von Benutzer "84.84.73.66" funktioniert zwar ebenfalls, ist aber unnötig kompliziert. Sie bietet zwar - je nach Graph - kleine Performance-Vorteile dadurch, dass in der Menge M (nur) die als nächstes zu besuchenden Knoten gespeichert werden, was das Auswählen des nächsten Knotens mit minimalen Kantenkosten etwas erleichtert; solche Dinge sind aber Sache der Implementierung (und nicht des Algorithmus an sich) und mit einer geeigneten Datenstruktur zum Abspeichern der Mengen ebenso (teilweise noch besser) zu erreichen. --thth 08:01, 28. Mai 2006 (CEST)
thread_title:  Nicht ganz klar 

message: Wenn in Zeile 4 eine leere Liste erzeigt wird (M:= EMPTYSET) wie kann dann in Zeile 7 der Knoten entfernt werden (wie es weiter unten in "Grundlegende Konzepte und Verwandschaften" erklaert wird). Ich denke doch dass M:= M UNION {v} bedeuete, dass v in M aufgenommen wird, oder irre ich mich da??
:Hast du den Abschnitt "Nicht ganz klar" in dieser Diskussion gelesen (die Antwort vom 21. Jan. stammt übrigens auch von mir)? Benutzer "84.84.13.66" hat den Pseudo-Code verändert, aber anscheind vergessen die Zeilenangaben im nachfolgenden Text zu korrigieren. Zudem leuchten mir die Änderungen nicht ein. In dieser älteren Version sollten die Zeilenangaben noch stimmen: http://de.wikipedia.org/w/index.php?title=Algorithmus_von_Dijkstra&oldid=11653579 --89.51.46.84 18:22, 15. Feb 2006 (CET)
thread_title:  Noch eine Frage zur Initialisierung 

message: Würzburg wird vor Erfurt besucht, was falsch ist, das die Kante Kassel-Erfurt < Frankfut-Würzburg.
Leider bin ich zu unerfahren um dies auszubessern.
: Hi, die Karte ist schon richtig. Es stimmt zwar, dass die Kante Kassel-Erfurt < Frankfurt-Würzburg ist, aber du startest in Frankfurt, und musst erst einmal nach Kassel kommen. Somit müsstest du die Kante Frankfurt-Kassel-Erfurt und die Kante Frankfurt-Würzburg vergleichen. Die erste Kante hat kosten von 173+137 = 310 > 217 = Frankfurt-Würzburg Regnaron 13:38, 3. Jul 2006 (CEST)
replies: text: Nachtrag: Aber danke für den Hinweis, ich sehe gerade, dass die Kante Kassel-Erfurt eigentlich gar nicht in dem Graphen sein sollte :-D Regnaron 13:45, 3. Jul 2006 (CEST)
replies: text:  Das Problem war, dass man in Kassel schon war, deshalb wars falsch. Lob für die schnelle Ausbesserung. 193.170.133.241 23:35, 4. Jul 2006 (CEST)
thread_title:  Fehler in den Grafiken 

message: "...dient der Berechnung eines kürzesten Pfades zwischen einem Startknoten und einem beliebigen Knoten in..." 
Eigentlich dient der Algorithmus zur Lösung des single-source shortest-paths problems, d.h. der Berechnung des kürzesten Pfades zwischen einem Startknoten und allen Knoten. Hier wird die Abarbeitung nur beim Erreichen des Zielknotens abgebrochen
--MarcoBe 11:05, 9. Nov. 2006 (CET)
replies: text: Ja und nein. Beide Algorithmen sind quasi gleich, stimmt. Dijkstra = A* mit Heuristik h(v) = 0 für alle Knoten v, bzw A* = Dijkstra + Heuristik. Dijkstra kann man aber auch verwenden wenn man die kürzesten Pfade zu allen Knoten finden will. Dies kannst du mit dem A* quasi nicht, da es sinnlos ist eine Heuristik zu verwenden um nicht alle Knoten explorieren zu müssen wenn du eh alle kürzesten Pfade zu allen Knoten finden willst :-) Aber man kann, wenn man will, eben mit Dijkstra auch nur nach einem Knoten suchen und abbrechen sobald man ihn gefunden hat) --Regnaron 21:11, 9. Nov. 2006 (CET)
replies: text:  Für mich wäre das Finden eines kürzesten Weges zwischen zwei Knoten ein Spezialfall des Algorithmus - und in der Ergebnismenge stehen ja auch die kürzesten Abstände zu den bereits betrachteten Knoten drin. Das steht ja auch im Text so drin, aber es gibt halt einen Unterschied zwischen single-pair shortest-path und single-source shortest-paths und das gibt der einleitende Satz nicht her. --MarcoBe 10:52, 10. Nov. 2006 (CET)
thread_title:  Dijkstra <-> A* 

message: Die Formel fuer den Aufwand ist falsch, nicht
O(m+n*log(n))
sondern
O((m+n)*log(n))
ist korrekt.
:Wie kommst du denn darauf? Wäre schön, wenn du das mal erklären würdest.--MarcoBe 11:08, 9. Nov. 2006 (CET)
replies: text:  Stimmt MarcoBe zu. Die Formel O(m+nlog(n)) ist (unter zuhilfenahme von Fibonacci Heaps) korrekt. Diese können das DecreaseKey welches beim relaxieren der Kanten verwendet wird in amortisiert Konstanter Zeit machen. (Diese Art von Anwendung war glaube ich sogar ein Grund warum Fibonacci Heaps entwickelt wurden) --Regnaron 21:11, 9. Nov. 2006 (CET)
replies: text: Ich weiß jetzt, wie er/sie darauf gekommen ist. Die Formel O((m+n)*log(n)) ist richtig, wenn man die priority-queue als Heap implementiert. Dann ergibt sich nämlich O(n*(1+logn+logn+logn)+m*logn), da der Aufwand für jede Funktion (insert (Einfügen eines Elementes), remove (Entfernen eines Elementes), extractMin (Rückgabe und Entfernen des Elementes mit höchster Priorität), changePriority (Ändern der Priorität eines Elementes - in diesem Fall (logn) ist. Nur falls es jemanden interessiert...--MarcoBe 14:59, 10. Nov. 2006 (CET)
thread_title:  Zeitkomplexität 

message: 
Die Graphentheorie kann, zumindest entsprechend der vorherrschenden Meinung, nicht als Teilgebiet der Mathematik betrachtet werden. Ich schlage daher alle Artikel (inklusive Diskussion) über diese völlig sinnfreie Pseudowissenschaft zum Löschen vor.
: Ich habe gerade hier nochmals genauer nachgelesen. Obgleich eine Viezahl von Teilgebieten und Anwendungen der Mathematik aufgelistet sind, fehlt die Graphentheorie.
:: Das kann doch nur ein Scherz, oder? Die Graphentheorie, ob nun Teilgebiet der Mathematik oder nicht, hat viele konkrete Anwendungen in der Realität und gerade Dijkstras Algorithmus ist in der Informatik von großer Bedeutung. Ich mache den Gegenvorschlag, diesen völlig sinnfreien Pseudo-Löschwunsch zu entfernen.
:: Wenn etwas irgendwo nicht steht, heißt es nicht zwingend, dass es auch nicht so ist. Zur Abwechslung kann man auch hier schauen, und zwar reicht da schon der erste Satz. Also im Netz sind schon einige Scherzkekse unterwegs... --Sixot 01:35, 24. Feb. 2007 (CET)
thread_title:  Vorschlag zum Löschen 

message: Also da es bei dem Algorithmus darum geht, einen Baum zu ermitteln, find ich es sehr fragwürdig, in dem Beispiel die Kanten, die benutzt wurden, um zu den markierten Knoten zu kommen, nicht zu markieren. Da geht der ganze Sinn des Beispiels meiner Meinung nach flöten! --Sixot 14:18, 31. Jan. 2007 (CET)
replies: text: ja, und man sieht so am Ende überhaupt nicht, welcher Weg zu einem Knoten nun wirklich der kürzeste ist, da nur die Knoten, aber nicht die Kanten markiert sind. --Fischbuerger 17:13, 21. Feb. 2007 (CET)
thread_title:  Beispiel 

message: Der Algorithmus von Dijkstra (nach seinem Erfinder Edsger W. Dijkstra) dient der Berechnung eines kürzesten Pfades zwischen einem Startknoten und einem beliebigen Knoten in einem kantengewichteten Graphen. Die Gewichte dürfen dabei nicht negativ sein.
Und wieso nicht? Kann vielleicht jemand den Artikel um ein illustriertes Gegenbeispiel erweitern, warum negative Kantengewichte nicht zulässig sind? --160.45.45.225 13:55, 15. Feb. 2007 (CET)
thread_title:  Frage zu negativen Kantengewichten 

message: Ich hab mal den Artikel entsprechend erweitert. Den Pseudocode habe ich größtenteils aus dem niederländischen Wiki übernommen. Ich finde diese Trennung besser verständlich als einfach nur eine halbfertige Implementierung. --Zhujik 13:23, 20. Jul. 2008 (CEST)
thread_title:  Informeller, formeller Algorithmus und Pseudocode 

message: Die Kante zum Knoten "Stuttgart" überdeckt die 1 des Kantenlabels "183km". Falls jemand etwas zu tun sucht: das könnte nachgebessert werden ;) Die Bilder sind als .svg gespeichert und Bearbeitung ist verlustfrei möglich. Grüße, --Sulai 13:42, 2. Aug. 2008 (CEST)
replies: text: Ich habe mal Step3 editiert, da der original Ersteller es wohl nicht mehr macht. Wenn das so gefällt, mache ich das mit den anderen auch so. Ich habe auf UTF-8 umgestellt und die „oo“ durch „∞“ ersetzt. Da ich keine „Times“ Schriftart habe, habe ich „DejaVu Serif“ genommen. Wenn was serifenloses erwünscht wird, würde ich „DejaVu Sans“ nehmen. Nun habe ich natürlich keine Ahnung, wie das in anderen Browsern und anderen Betriebssystemen aussieht. Ich bitte um Kritik. Wenn ihr das so wollt, sagt es hier. Da ich jede Datei mit inkscape anfasse (graphviz hat seine Grenzen), kann ich noch andere Sachen ändern. Vielleicht hat jemand eine Idee den Vorgänger mit einzutragen in jeden Knoten. Mir fiel nur keine intuitive Lösung ein. 
 (nicht signierter Beitrag von Faron (Diskussion | Beiträge) 20:42, 30. Mai 2009 (CEST)
thread_title:  Beispiel Grafik nachbessern 

message: Komischerweise ist das rekursive Abschneiden von "Wegstücken, welche mit dem Start und dem Ziel über gleiche Teilstrecken verbunden sind" hier nicht erwähnt. Wenn ich den Algorithmus richtig verstanden habe, könnte man ihn auf diese Weise doch optimieren, da sich dadurch die Prüfmenge verkleinert? Im konkreten Fall würde also Erfurt und Stuttgart erst einmal aussortiert, bevor der Algorithmus sie überflüssigerweise untersucht.
Weiter liessen sich dann alle Wegvarianten aussortieren, welche länger sind als andere, was eigentlich dazu führen würde, dass man den Algorithmus sozusagen umgekehrt entwickelt hat. Eine dezentrale UND ausschliessende Methode wird sehr wahrscheinlich aber langsamer als der normale Dijkstra Algorithmus (Wobei mir da der Kruskal Algorithmus auf alle negativen Distanzen einfällt)... (nicht signierter Beitrag von 92.105.162.226 (Diskussion | Beiträge) 02:02, 1. Mai 2009 (CEST)
thread_title:  Optimierung des Dijkstra Algorithmus 

message: In der informellen Beschreibung steht, dass der Algorithmus stoppt, wenn alle Knoten besucht wurden. Das stimmt jedoch nicht. Der Algorithmus stoppt, wenn das Ziel an der Reihe ist und zu diesem Zeitpunkt können auch Knoten unbesucht sein.
Beispiel: (Adjazenzmatrix, man will von 0 nach 1)
 	0	1	2
0	-	1	5
1	1	-	6
2	5	6	-
Natürlich wird die 1 besucht und es ist Ende.
Das gibt es auch bei komplexeren Graphen.
--Chricho 19:27, 25. Mai 2009 (CEST)
thread_title:  Stop, wenn alle besucht: Falsch! 

message: Entschuldigung, ich spreche Deutsch nur ein wenig. Aber es gibt Problems mit dem Beispiel.
* Mannheim (step01) oder Manheim (step02)?
* Augsburg (step01) oder Aufgsburg (step03) ?
Die Verbindungen zwischen Städten sind überraschend: in meiner Landkarte ist Stuttgart zwischen Karlsruhe und Augsburg. Ich lese auch :
* Würzburg - Frankfurt = 120 km (nicht 217 km)
* Karlsruhe - Augsburg = 220 km (nicht 250 km)
* Nürnberg - Stuttgart = 208 km (nicht 185 km)
* und so weiter
Der Beispiel ist mathematisch korrekt, aber nicht realistisch :fr:user:HB  - 1/07/2009 (nicht signierter Beitrag von 82.67.217.175 (Diskussion | Beiträge) 16:01, 1. Jul 2009 (CEST)
thread_title:  Beispiel (2) 

message: Mittlerweile finde ich, dass der C-Code deplaziert ist. Er trägt nicht zum verständnis bei, und für jemanden, der eine Implementierung schreiben muss, reicht der Pseudocode. Von daher sollte der Punkt rausgenommen werden. --Zhujik 11:59, 12. Aug. 2008 (CEST)
replies: text: Ich bin deiner Meinung und habe den Code gelöscht. --Stefan Birkner 13:33, 12. Aug. 2008 (CEST)
replies: text: Ich finde die C-Implemetierung schon hilfreich. Der Pseudocode ist zuteilen sehr mathematisch formuliert, was eine Hürde für den ein oder anderen sein kann. Mengentheorie und Aussagenlogik sind für uns irgendwo ganz unten bei den Grundlagen angesiedelt, dies muss jedoch nicht auch für unstudierte gelten, die genauso Nutzer der Wikipedia sind und damit diesen Pseudocode kaum nachvollziehen können. Ich habe nicht den nötigen Überblick über die Wikipedia. Gibt es vielleicht eine Möglichkeit Code aus dem Artikel auszulagern und darauf zu verweisen (also eine Art Code-Wiki)? --78.50.243.16 10:02, 19. Mär. 2009 (CET)
replies: text: Das gibt es! Ist unten verlinkt, da ist bisher nur meine Pythonversion. Erweiterungen willkommen. -- Pberndt (DS) 00:11, 5. Sep. 2009 (CEST)
thread_title:  C-Implementierung herausnehmen 

message: In Pseudocode sieht der Algorithmus wie folgt aus:
  foreach v \in V(G) do d(v) = \infty
  ;
  A := g_b
  d(a) := 0
  X := \emptyset
  foreach z : z \in M_{(g_b)} do 
    X := X \cup {z}
    d(z) := gew(g_b,z)
  ; 
    /*
     * X und d sind jetzt initialisiert
     */
  while not(X = \emptyset) do
    /*
     * X ist noch nicht leer
     */
    y : (y \in X) \land (d(y) = MIN {d(y)'|y' \in X}
    /*
     * y ist daher das Element von x mit dem kleinstene Wert von d(v) --
     * das ist der endgültige Wert von d(y)
     */
    A := A \cup {y}
    X := X\setminus{y} 
    /*
     * y ist jetzt verschoben von X nach A
     */
    foreach z: z \in M_(y) \land not (z \in A) do 
      if not (z \in X) then
         X := X \cup {z} 
         d(z) := d(y) + gew(y,z)
      else 
     /*
      * somit ist z \in X
      */ 
         d(z) := MIN{d(z), d(y) + gew(y,z)}
ich habe das mal im Beitrag etwas konsequenter durchgezogen. Zwei Anmerkungen: 
1. Der Algorithmus ermittelt die summierten Kantengewichte der kürzesten Pfade, aber nicht die Pfade selbst (soll heissen: nach Durchlauf des Algorithmus weiss ich zwar, wie weit es von Frankfurt nach München wenigstens ist, aber nicht, welcher Weg denn nun der kürzeste ist. Das wird im informellen Pseudocode ermittelt. Anpassung wäre leicht, mir aber jetzt rein Uhrzeitmäßig zu spät. 
2. Das letzte if-Bedingung ist doch überflüssig, oder? {z} in jedem Fall mit X vereinigen und die Minimum-Funktion auf d(z) ansetzen. 
85.179.117.16 23:25, 4. Sep. 2009 (CEST)
replies: text: In the following algorithm, the code u := node in Q with smallest dist[], searches for the vertex u in the vertex set Q that has the least dist[u] value. That vertex is removed from the set Q and returned to the user. dist_between(u, v) calculates the length between the two neighbor-nodes u and v. alt on line 11 is the length of the path from the root node to the neighbor node v if it were to go through u. If this path is shorter than the current shortest path recorded for v, that current path is replaced with this alt path.  The previous array is populated with a pointer to the "next-hop" node on the source graph to get the shortest route to the source.
  1  function Dijkstra(Graph, source):
  2      for each vertex v in Graph:           // Initializations
  3          dist[v] := infinity               // Unknown distance function from source to v
  4          previous[v] := undefined          // Previous node in optimal path from source
  5      dist[source] := 0                     // Distance from source to source
  6      Q := the set of all nodes in Graph    // All nodes in the graph are unoptimized - thus are in Q
  7      while Q is not empty:                 // The main loop
  8          u := vertex in Q with smallest dist[]
  9          remove u from Q
 10          for each neighbor v of u:         // where v has not yet been removed from Q.
 11              alt := dist[u] + dist_between(u, v)       // be careful in 1st step - dist[u] is infinity yet
 12              if alt < dist[v]              // Relax (u,v,a)
 13                  dist[v] := alt
 14                  previous[v] := u
 15      return previous[]
----
Könnte man doch einfach eindeutschen.
--78.50.243.16 13:32, 19. Mär. 2009 (CET)

text: Der Meinung bin ich auch. Das hatte ich auch schon vor etwas längerer Zeit vorgeschlagen. (siehe ein paar Zeilen tiefer (oder Hier)). Aber scheinbar findet man in Diskussionen keine Gleichgesinnte.... Aber meine Unterstützung hast du! --Nel1988 13:52, 19. Mär. 2009 (CET)
replies: text:  dann ändere es doch, hindert dich ja keiner dran. --Zhujik 20:31, 19. Mär. 2009 (CET)
replies: text:  Zuhjik, ich bin mir nicht sicher, ob es immer eine gute Idee ist, einfach mal schnell seine Ideen in ein Wiki zu hacken, wenn es ggf. plausible Argumente dagegen geben kann. --92.226.145.61 14:22, 20. Mär. 2009 (CET)
replies: text:  Eben, daher lieber erstmal hier den Vorschlag machen und auf Antworten warten... --Nel1988 12:49, 21. Mär. 2009 (CET)
replies: text:  nunja, der Diskussionsbeitrag stand ja jetzt auch schon ein bisschen länger da. man kann ja auch immernoch die alte version laden... :) --Zhujik 21:13, 21. Mär. 2009 (CET)
replies: text:  ich habe den formellen Pseudocode etwas konsequenter gestaltet. Finde ihn aber prinzipiell nicht sonderlich hilfreich, da zuviele mathematische Formelsymbole. Mag für Graphentheoretiker normal sein, aber selbst als diplomierter Informatiker musste ich mich erstmal in den Mathe-Modus versetzen, um das zu verstehen und nachzuvollziehen. Votiere hiermit für den informellen Pseudocode aus der englischen version 85.179.117.16 23:25, 4. Sep. 2009 (CEST)
replies: text:  Die Konsequenz fehlte da tatsächlich irgendwie o_O Finde ihn auch hinderlich. Der Sinn von Pseudocode ist mMn, dass Leser mit grundlegenden Programmierkenntnissen ihn verstehen, ohne vorher eine bestimmte Sprache gelernt haben zu müssen. Hier ist das Gegenteil der Fall - man muss die Notation der Mengenlehre kennen, um den Code zu verstehen. Außerdem kann man diese Mischung aus TeX und Monospace nur wiederlich schwer lesen. → Ändern! -- Pberndt (DS) 00:08, 5. Sep. 2009 (CEST)
replies: text:  Da keine Reaktion kam: Erledigt. -- Pberndt (DS) 16:58, 7. Sep. 2009 (CEST)
thread_title:  Algorithmus in Pseudocode 

message: Der Kurzschrittalgorithmus, auch genannt Dijkstra-Algorithmus, ist ein Graph-Algorithmus der von Edsger Dijkstra in 1959 publiziert wurde. Für einen gerichteten Graphen G, bei dem der Abstand zwischen zwei beliebigen Knoten mindestens 0 beträgt, berechnet der Algorithmus für einen bestimmten Startknoteng_b \in G den kürzesten Abstand zu allen Knoten von G. Dieser Algorithmus wird unter anderem angewandt bei Verkehrsmodellen, Routen-Navigationssystemen und in der Telekommunikation.
:Dies Aussage zu Navigationssystemen ist so nicht ganz richtig. Hier findet eher der A* Algorithmus Anwendung. -- 134.155.99.71 19:59, 27. Nov. 2009 (CET)
thread_title:  Kurzschrittalgorithmus 

message: Den Algorithmus ausführlich zu erklären ist gut und wichtig. Was noch fehlt ist Kontext: Wie ist er entstanden, wo und wann zum ersten Mal publiziert? Tieferer Vergleich mit ähnlichen Algorithmen. (nicht signierter Beitrag von 213.23.196.74 (Diskussion | Beiträge) 10:09, 26. Nov. 2009 (CET)
thread_title:  Kontext 

message: In den Bilder sind die Städte Augsburg und Mannheim falsch geschrieben, kommt nicht so gut. 10:55, 14. Jan. 2010 (CET)
thread_title:  Städtenamen in den Bildern falsch 

message: ..., wenn ein Pfad zwischen Startknoten und diesen Knoten nicht existiert, dieser aber in der Knotenmenge selbst vorliegt.
ist unverständlich. Wie kann ein Pfad erst nicht existieren und dann doch. Entweder die Knotenmenge des Pfades liegt in Knotenmenge des Graphs UND alle Kanten des Graphes liegen in der Kantenmenge des Graphs, oder es ist halt kein Pfad. Oder was ist gemeint?--Schönen Gruß "Wohingenau" 15:12, 4. Apr. 2010 (CEST)
replies: text: Wohl ein Typo: Nicht der Pfad liegt in der Knotenmenge (sowas geht gar nicht), sondern die Knoten, zu denen kein Pfad existiert, liegen in der Knotenmenge. --Zahnradzacken 18:00, 5. Apr. 2010 (CEST)
thread_title:  unverständliche Formulierung in der Einleitung 

message: Die Funktion(?) im Beispiel ist nicht definiert.--Schönen Gruß "Wohingenau" 17:25, 4. Apr. 2010 (CEST)
replies: text: Im Beispiel ist noch mehr nicht definiert: Prioritätswarteschlange, Neusortieren, reconstructShortestPath(). Die Begriffe basieren auf einer früheren Version des Artikels. Auch der Abschnitt Zeitkomplexität bezieht sich noch auf frühere Zeilennummern und einen anderen Code (aber Komplexitätsanalyse anhand von Zeilen im Pseudocode ist eigenlich Unsinn). Für ein erstes Verständnis füge ich in den Artikel ein, dass es eine andere Bezeichnung für den Update-Schritt ist. Längerfristig braucht der ganze Artikel eine Menge an Arbeit. --Zahnradzacken 18:17, 5. Apr. 2010 (CEST)
thread_title:  'relax' nicht definiert oder verlinkt 

message: An der Stelle bitte ich um Erläuterung zum Baustein: Was (welche Funktion) erfordert da eine Erklärung? Die Formulierung bei uns beschreibt doch umgangssprachlich, was zu tun ist, statt Funktionsnamen zu verwenden?! -- Pberndt (DS) 20:56, 4. Apr. 2010 (CEST)
replies: text: Hast du dir den engl. Artikel angesehn? Einfach die Erläuterung aus der engl. WP übersetzen.Was passiert bei 'Knoten in Q mit kleinstem Wert in abstand[]', u wird gelöscht,... Was passiert bei abstand_zwischen(u, v) insbesondere wenn ein Wert unendlich ist. Nur weil dir klar ist, heißt es ja nicht dass man es nicht ruhig erklären kann. Ohne die Erklärung erschwert es nur unnötig das Verständnis. Ich mach dass auch selber irgendwann aber hab grad keine Zeit für.--Schönen Gruß "Wohingenau" 21:25, 4. Apr. 2010 (CEST)
replies: text: Ja, auch dort finde ich die Erklärung ziemlich übertrieben. Wie der Algorithmus selbst funktioniert, ist weiter oben erklärt. Erklärungen à la „abstand_zwischen(a,b) bestimmt den Abstand zwischen a und b. Und wenn es keinen Weg oder keinen mit einer endlichen Länge gibt, gibt es ∞ zurück.“ unterstellen dem Leser einen Mangel an Fähigkeit zum Mitdenken, der wohl kaum bei jemandem vorhanden sein wird, der einen Artikel über den Dijkstra-Algorithmus ließt. Wiedemauchsei – schaden tut's natürlich auch niemandem, wenn da noch etwas zu steht. -- Pberndt (DS) 15:38, 5. Apr. 2010 (CEST)
replies: text: Mitdenken kann manchmal schief gehen, weil implizite Annahmen nicht immer zutreffen. Deshalb ist es gut, wenn man möglichst genau die Absicht beschreibt. Darüber hinaus wurde das "Mitdenken" schon abgenommen, indem fast neben jeder Zeile Kommentare standen. Ich habe das als Fließtext vor den Code verschoben, damit man nicht zweispaltig lesen muss (links Code, rechts Kommentar). Außerdem habe ich den Pseudocode etwas eingedeutscht (schließlich gibt es da keine Schlüsselwörter) und ein bisschen aufgeteilt, damit man die Methodik besser erkennt. Die Abfrage auf Nichterreichbarkeit habe ich entfernt, da sie an der Korrektheit des Vorgehens nichts ändert, nur an der Anzahl der Durchläufe. Den Lückenhaftbaustein habe ich entfernt; falls das zu voreilig war, ruhig wieder einfügen. --Zahnradzacken 18:08, 5. Apr. 2010 (CEST)
thread_title:  Algorithmus in Pseudocode 

message: Ich fände es angemessen, kurz darauf einzugehen, weshalb der Algorithmus nur für nicht-negative Gewichte funktioniert. Ich weiß zwar, dass dies so ist, und das kann ich hier auch nachlesen, aber weshalb ist mir nicht ganz klar. --89.204.153.5 15:45, 15. Mai 2010 (CEST)
thread_title:  negative Kantengewichte 

message: Mannheim bitte durchgehen im Beispiel mit 2 (!) n. (nicht signierter Beitrag von 188.99.36.179 (Diskussion) 20:13, 7. Aug. 2010 (CEST)
thread_title:  MaNNheim 

message: Sollte der Zweiseitige Dijkstra-Algorithmus hier nciht auch erwähnt werden? Den Algorithmus um Forwärts und Rückwärtsschritte zu ergänzen sollte nach der grundlegenden Einführen nciht allzu schwer sein. 
Oder sollte dazu ein neuer Artikel erstellt werden? (nicht signierter Beitrag von Rapunzel77 (Diskussion | Beiträge) 09:45, 26. Aug. 2005 (CEST)
thread_title:  Zweiseitige Dijkstra-Algorithmus 

message: Hallo, sollte nicht in der relax (u,v,w)-Routine erwähnt werden, daß mit dem Verändern der Distanz von v auch ein decreaseKey-Aufruf erfolgen muß, um die Priority Queue konsistent zu halten? Die aktuelle Beschreibung verführt dazu, diesen Schritt zu übergehen, und führt so zu falschen Ergebnissen. Insbesondere wird nur so verständlich, wieso die Queue bereits zu Beginn mit allen Vertices befüllt werden kann... (nicht signierter Beitrag von 134.96.194.50 (Diskussion | Beiträge) 14:13, 12. Okt. 2007 (CEST)
thread_title:  relax ohne decreaseKey? 

message: im Djikstra Algorithmus selber wird Zeile
16      // Es konnte kein Pfad gefunden werden
wird doch nie erreicht. Weil g-Endknoten auch in der Q drin ist,
und irgendwann u zugewiesen wird. Zeile 16 sagt dann was falsches aus.
Grüsse, Daniel (nicht signierter Beitrag von 87.234.158.86 (Diskussion | Beiträge) 00:57, 15. Nov. 2007 (CET)
thread_title:  dead code? 

message: Ich denke die Syntax dieses Codes ist nicht klar definiert.
Was ist π(n)? - runde Klammern. Ein Funktionszugriff? Wie ist diese Funktion definiert?
Insbesondere werden dem Spannbaum π[v] Werte zugewiesen - wird hier ein Array bearbeitet? 
siehe relax: "π[v] := u;" (nicht signierter Beitrag von 80.133.40.97 (Diskussion | Beiträge) 20:46, 19. Dez. 2007 (CET)
thread_title:  Syntax nicht klar definiert 

message: Hallo - ich fand die Erklärung in der niederländischen Wikipedia recht schön - vielleicht macht es ja Sinn, sie einzuarbeiten. Ich habe mich mal an einer Übersetzung versucht, bin aber nicht sicher, ob noch Dreher drin sind. (nicht signierter Beitrag von 85.181.180.135 (Diskussion | Beiträge) 16:32, 20. Jun. 2008 (CEST)
thread_title:  Übersetzung aus dem Niederländischen 

message: Der Algorithmus basiert auf der Beobachtung, dass der Abstand (die Länge des kürzesten Pfada) zwischen zwei beliebigen Knoten v und w eines gerichteten Graphen G wie folgt berechnet werden kann:
:Sei d(x) \! der Abstand zwischen v und x, für einen Knoten x \in G.
:Sei N_w = \{y \in G | y \rightarrow w\}, die Menge der Knoten y, die direkt mit w verbunden sind (über eine Kante von y "nach" w).
:Sei gew(y,w) \! das Gewicht der Kante zwischen zwei direkt miteinander verbundenen Knoten y und w.
:Der Abstand von v nach w ist d(w) = min \{d(y) + gew(y,w) | y \in N_w\}, das Minimum der Summe des Abstandes von v zu einem Knoten y in N plus dem direkten Abstand von diesem Knoten zu w. Oder - was kaum überrascht - wenn die Summe aller direkten Abstände von einem Knoten y in einem Pfad minimal ist, ist die die Gesamtlänge dieses Pfades (also die Summe) minimal.
:Desweiteren definieren wir M_v = \{y \in G | v \rightarrow y\} als die Menge der Knoten, die direkt mit v verbunden sind (über eine Kante von y "nach" w). (nicht signierter Beitrag von 85.181.180.135 (Diskussion | Beiträge) 16:32, 20. Jun. 2008 (CEST)
thread_title:  Grundlagen 

message: Der Algorithmus ist eigentlich eine Verallgemeinerung der oben beschriebenen Grundlagen. Der Algorithmus teilt die Knoten von G in drei Mengen ein:
:A: die Menge der Knoten, deren kleinster Abstand zu g_b berechnet ist
:X: Die Menge der Knoten zu denen zwar ein Pfad ausgehend von g_b bekannt ist, aber nicht notwendigerweise der kürzeste
:V(G) - A - X: die übrigen Knoten von V (diese Menge wird nicht vom Algorithmus gehalten und hat daher auch keinen Namen)
Hierfür gilt selbstverständlich, dass A \cap X = \emptyset, A und X haben keine gemeinsamen Knoten.
Außerdem gibt es ein Array d(v), indiziert mit den Knoten v von G. Für jeden Knoten g \in G wird dieses Array vom Algorithmus so befüllt, dass am Ende gilt d(g) = die Länge des kürzesten Pfads von g_b zu g.
Am Anfang gilt
:*A = \{g_b\}
:*X = M_{g_b}
:*d(g_b) = 0
:*\forall {g \in X} : d(g) = gew(g_b,g)
:*\forall {g \in V(G) - X - A} : d(g) = \infty
Der Algorithmus wiederholt nun die folgenden Schritte bis X zur leeren Menge wird (dann sind keine erreichbaren Punkte mehr übrig) ausgehend von g_b:
:#Wähle aus X den Knoten x mit dem minimalen Wert von d(x); das ist der Endwert von d(x) für diesen Knoten. Denn d(x) hat ja den Wert der Länge des kürzesten Pfads von x ausgehend von g_b, wie wir schon bewiesen haben. Jeder andere Pfad zu x muss über x gehen und ist daher länger, weil alle Kanten eine positive Länge haben.
:#Damit d(x) endgültig ist, verschieben wir x von X nach A. Für alle Knoten z, die von x aus erreicht werden können, und die noch nicht in A enthalten sind, gehen wir wie folgt vor:
:##Ist z nicht in X enthalten, dan fügen wir den Knoten zu X hinzu. Unsere erste Abschätzung des Abstands zwischen g_b und z ist dann d(x) + gew(x,z) -- diesen Wert schreiben wir in d(z).
:##Ist z schon in X enthalten, dann passen wir die Abschätzung in d(z) an -- der neue Wert ist das Minimum der Länge des neu gefundenen Pfads zu z (d(x) + gew(x,z)) und der Länge des kürzesten Pfads z, die wir schon gefunden haben.
Wenn sich der Algorithmus beendet (und das tut er, denn V(G) ist endlich und jeder Schritt verschiebt ein Element von X nach A), dann is d(v) befüllt mit den Abständen von g_b zu allen Knoten die von diesem Startknoten aus erreichbar sind. Wenn d(w) unendlich ist für ein w \in V(G), dann ist dieser Knoten von g_b aus nicht erreichbar. (nicht signierter Beitrag von 85.181.180.135 (Diskussion | Beiträge) 16:32, 20. Jun. 2008 (CEST)
thread_title: Der Algorithmus

message: a) Initialisierung: Die Menge der nicht-besuchten Knoten enthält n-1 Elemente. Falls ein Knoten aus dieser Menge direkt mit dem Startknoten verbunden ist, wir der Abstand gespeichert, sonst als "unerreichbar" markiert. Der Knoten mit minimalem Abstand zum Startknoten wird festgehalten.
b) Der Knoten mit minimalem Gesamtabstand zum Startknoten wird aus der Menge der nicht-besuchten Knoten entfernt.
c) Die Menge der nicht-besuchten Knoten enthält im i-ten Schritt n-i Knoten. Höchstens diese n-i Knoten werden auf ihren Gesamtabstand zum Startknoten überprüft.
Schritte a) und b) werden maximal n-1 mal widerholt. Es ergibt sich ein maximaler Auswand von  (n-1)+(n-2)+...+2+1=n(n-1)/2
Ist zwar sehr knapp und nicht gerade formal, aber nachvollziehbar. Machts besser, wenn euch das nicht reicht. Die Abhängigkeit von der Implementierung ist richtig und wichtig. Aber was momentan geschrieben ist ist zu kompliziert und umständlich für "Normalos". Wenn ich das meinen Studenten das Laufzeitverhalten erkären will fange ich mit einfachen Überlegungen an. Nicht mit formalem Overhead. In Details geht man nachdem die Idee verstanden wurde.-- Josy2011 21:50, 28. Jan. 2011 (CET)
thread_title:  Vorschlag zur Zeitkomplexitaet 

message: Meiner Meinung nach berechnet der Algorithmus bei normalem (nicht abgebrochenem) Durchlauf ALLE kürzesten Wege vom Startknoten zu ALLEN anderen Knoten. Wer auf der Seite des Algorithmus mal das Beispiel durchläuft wird auch sehen, dass nach der Terminierung des Algorithmus nicht nur der kürzeste Weg von Frankfurt nach München berechnet wurden, sondern Alle kürzesten Wege von Frankfurt zu jedem anderen Knoten.
-- Hyperjonny 21:24, 12. Dez. 2011 (CET)
replies: text: Steht doch im Artikel? --Zahnradzacken 00:09, 13. Dez. 2011 (CET)
thread_title:  Berechnet der Algorithmus einen oder alle Wege? 

message: Das Straßenbeispiel am Ende des Artikels muss ein Norddeutscher gemacht haben, oder es wurde ein Beispiel aus einem anderen Land importiert und die Städtenamen eingedeutscht.
Von Frankfurt nach Würzburg sind es keine 217 km, sondern nur 119, also gut halb so weit.
Von Würzburg kommt man über die A81 direkt und viel schneller nach Stuttgart als über Nürnberg...
Gpermant (Diskussion) 18:28, 18. Apr. 2012 (CEST)
thread_title:  Entfernungen und Verbindungen im Straßen-Beispiel 

message: Das Beispiel das aufzeigt, dass negative Kanten das Ergebnis verfälschen können ist ein schönes und plakatives Beispiel, das ist wahr! Aber es ist insofern ein falsches Beispiel als das der Dijkstra-Algorithmus in diesem Beispiel niemals den längeren Weg auswählen würde und somit auf das verfälschende -3 stoßen würde, da die Exploration des unteren Weges bereits beim ersten Kantengewicht von 4 aufhört und nicht wieder aufgenommen wird bevor das Ziel erreicht ist. Oder ist es tatsächlich so, dass in jedem Fall der untere Weg auch untersucht wird, obwohl oben schon ein Zielweg erreicht wurde, der insgesamt "kürzer" ist als der Weg zum ersten Knoten im unteren Weg? -- Ilker Savas (Diskussion) 11:29, 20. Mai 2012 (CEST)
replies: text: Einerseits ist es richtig, dass die Kante mit Gewicht -3 nie erreicht würde. Andererseits wundert es mich, dass du die Kante als "verfälschend" bezeichnest. Wenn man negative Kantengewichte will, dann verfälschen sie nichts. Der Fehler vom Dijkstra-Algorithmus ist, dass er den kürzeren Weg über -3 nicht findet (Summe 1) und den längeren Weg (Summe 2) für den Kürzeren hält. --Zahnradzacken (Diskussion) 18:10, 20. Mai 2012 (CEST)
replies: text: Ach soo rum ist das.. jetzt habe ich verstanden was da genau gemeint ist :), thx! -- Ilker Savas (Diskussion) 18:51, 20. Mai 2012 (CEST)
thread_title:  Besseres Beispiel (?) 

message: Es wird im Artikel kurz erwähnt, dass der Dijkstra-Algorithmus nur funktioniert, wenn alle Kanten nicht-negative gewichte haben. Hier ist ein kleines Beispiel für einen Graphen, auf dem Dijkstra ein falsches Ergebnis liefert:
Will das jemand einbinden? edit: Ich habe gerade gesehen, dass es so was schon gibt. --Martin Thoma 16:28, 14. Jul. 2012 (CEST)
replies: text: Der Artikel enthält einen ganzen Absatz darüber, inklusive das Bild . --Zahnradzacken (Diskussion) 17:24, 14. Jul. 2012 (CEST)
thread_title:  Minimalbeispiel für fehlerhaftes Ergebnis des Dijkstra-Algorithmus 

message: Warum steht im Pseudocode mal Methode, mal Funktion? Martin Thoma 10:19, 30. Jul. 2012 (CEST)
replies: text: Das ist wohl die Pascal-Brille, wonach Methoden im Gegensatz zu Funktionen keinen Rückgabewert haben. Eine Unterscheidung, die bei Pseudocode vielleicht nicht besonders zum Verständnis beiträgt. Kannst du gerne verbessern. Zahnradzacken (Diskussion) 12:18, 30. Jul. 2012 (CEST)
thread_title:  Pseudocode: Methode vs. Funktion 

message: Im o.g. Abschnitt steht  Eine einmal berechnete Distanz zwischen dem Startknoten und einem erreichten Knoten wird nicht mehr geändert.
Die Abbildung daneben (die mit drei Bildern á drei Knoten) zeigt aber das Gegenteil.
Ich bitte um Aufklärung (da ich selber nicht weiß wie es richtig ist).
92.74.109.204 17:41, 8. Jul. 2013 (CEST)
replies: text: Die informelle Beschreibung und die Grafik quetschen viel Information auf engen Raum. Folgendermaßen passen Bild und Grafik zusammen: Es werden Distanzen zu Knoten berechnet, die sich noch verringern können. Sobald aber ein Knoten als "erreicht" betrachtet wird, weil er unter allen Knoten, die einen Zwischenwert haben, den geringsten Zwischenwert hat, wird dieser Zwischenwert als "Distanz vom Startknoten zum erreichten Knoten" genommen und ab jetzt nicht mehr geändert. --Zahnradzacken (Diskussion) 00:17, 9. Jul. 2013 (CEST)
thread_title:  Inkonsistenz in "Informelle Darstellung" 

message: Im Beispiel beträgt die Entfernung von Frankfurt/M nach Würzburg 217 km. In der Realität sind es aber ca. 117 km. (nicht signierter Beitrag von 178.0.96.26 (Diskussion) 21:11, 22. Jun. 2014 (CEST)
replies: text: "Die Werte eines willkürlich gewählten Beispiels entsprechen nicht der Realität." mimimimimimi! (nicht signierter Beitrag von 89.204.135.47 (Diskussion) 08:33, 13. Aug. 2015 (CEST)
thread_title:  Entfernung Frankfurt - Würzburg 

message: Animation ist hübsch, aber unsinnig. So schnell kann man gar nicht schauen und rechnen, wie die Animation an einem vorbeirauscht. Didaktisch völlig daneben.2003:F7:AF14:7E00:4D90:4A1D:3B1E:8B80 00:35, 23. Sep. 2020 (CEST)
replies: text: Zum "in Ruhe verstehen" gibt es unten speziell das lange Beispiel. 10 große Bilder kann man aber nicht an den Anfang setzten. Die Animation ist eine visuelle Orientierung für Leute die mit "Dijkstra" nichts assoziieren: es geht um "Knoten", "Kanten", ein "Algo tackert" da durch. Ein paralleles Mitrechnen ist nicht das Ziel; man kann auch keine Geschwindigkeit finden die allen gerecht wird. Andererseits wäre es auch kein Problem die Frames etwas langsamer zu machen, wenn das Mehrheitsmeinung ist. --Jahobr (Diskussion) 11:45, 23. Sep. 2020 (CEST)
thread_title:  Animation