Dijkstra-Algorithmus: Unterschied zwischen den Versionen
Sn (Diskussion | Beiträge) K (Beispielgraphen durch Vorlageneinbindung ersetzt (sooooo guuuuuut...)) |
Sn (Diskussion | Beiträge) K (Beispielgraphen durch Vorlageneinbindung ersetzt (sooooo guuuuuut...)) |
||
Zeile 22: | Zeile 22: | ||
|INHALT= | |INHALT= | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (∞)")); b(("B (0)")); c(("C (∞)")); d(("D (∞)")); e(("E (∞)"))}} | ||
a(("A (∞)")) | |||
b(("B (0)")) | |||
c(("C (∞)")) | |||
d(("D (∞)")) | |||
e(("E (∞)")) | |||
}} | |||
|CAPTION=Vorbereitung: Startknoten B erhält Entfernung 0,<br>alle anderen Knoten erhalten Entfernung <math>\infty</math>. | |CAPTION=Vorbereitung: Startknoten B erhält Entfernung 0,<br>alle anderen Knoten erhalten Entfernung <math>\infty</math>. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 42: | Zeile 28: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (7)")); d(("D (5)")); e(("E (1)"))|B=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (7)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 1: markiere B als besucht und berechne für alle seine Nachbarn die Entfernung zu B. | |CAPTION=Schritt 1: markiere B als besucht und berechne für alle seine Nachbarn die Entfernung zu B. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 63: | Zeile 34: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (7)")); d(("D (5)")); e(("E (1)"))|B=#00B169|BE=#00B169|E=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (7)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 2: Von den unbesuchten Knoten hat E die kürzeste Entfernung zum Startknoten:<br>markiere E als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>es ergeben sich keine Verbesserungen. | |CAPTION=Schritt 2: Von den unbesuchten Knoten hat E die kürzeste Entfernung zum Startknoten:<br>markiere E als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>es ergeben sich keine Verbesserungen. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 86: | Zeile 40: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (4)")); d(("D (5)")); e(("E (1)"))|B=#00B169|BE=#00B169|E=#00B169|AB=#00B169|A=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (4)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 3: Von den unbesuchten Knoten hat A die kürzeste Entfernung zum Startknoten:<br>markiere A als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>für Knoten C ergibt sich dadurch eine Verbesserung von 7 auf 4. | |CAPTION=Schritt 3: Von den unbesuchten Knoten hat A die kürzeste Entfernung zum Startknoten:<br>markiere A als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>für Knoten C ergibt sich dadurch eine Verbesserung von 7 auf 4. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 111: | Zeile 46: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (4)")); d(("D (5)")); e(("E (1)"))|B=#00B169|BE=#00B169|E=#00B169|AB=#00B169|A=#00B169|AC=#00B169|C=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (4)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 3: Von den unbesuchten Knoten hat C die kürzeste Entfernung zum Startknoten:<br>markiere C als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>es ergeben sich keine Verbesserungen. | |CAPTION=Schritt 3: Von den unbesuchten Knoten hat C die kürzeste Entfernung zum Startknoten:<br>markiere C als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>es ergeben sich keine Verbesserungen. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 138: | Zeile 52: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (4)")); d(("D (5)")); e(("E (1)"))|B=#00B169|BE=#00B169|E=#00B169|AB=#00B169|A=#00B169|AC=#00B169|C=#00B169|BD=#00B169|D=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (4)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 3: Von den unbesuchten Knoten hat D die kürzeste Entfernung zum Startknoten:<br>markiere D als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>diese sind alle schon besucht worden. | |CAPTION=Schritt 3: Von den unbesuchten Knoten hat D die kürzeste Entfernung zum Startknoten:<br>markiere D als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>diese sind alle schon besucht worden. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 171: | Zeile 62: | ||
== Weblinks == | == Weblinks == | ||
* [https://visualgo.net/en/sssp Visualisierung des Dijkstra-Algorithmus auf VisuAlgo.net | * [https://visualgo.net/en/sssp Visualisierung des Dijkstra-Algorithmus auf VisuAlgo.net {{Flagge|GB}}] | ||
{{Navigationsleiste Graphalgorithmen}} | {{Navigationsleiste Graphalgorithmen}} | ||
[[Kategorie:Graphen]] | [[Kategorie:Graphen]] | ||
[[Kategorie:Algorithmen]] | [[Kategorie:Algorithmen]] |
Version vom 4. Dezember 2023, 15:01 Uhr
Der Dijkstra-Algorithmus ist ein Algorithmus zum Finden kürzester Wege in einem gewichteten Graphen. Konkret findet dieser Algorithmus von einem gegebenen Startknoten aus die kürzesten Wege zu allen anderen Knoten im Graphen.
Er wurde 1956 von Edsger Dijkstra entdeckt und funktioniert nur bei Graphen mit ausschließlich positiven Kantenlängen. Die Idee dahinter ist nämlich Folgende:
Wir betrachten zunächst alle Nachbarn des Startknoten. Derjenige von ihnen mit der kürzesten Entfernung zum Startknoten kann auch über Umwege nicht schneller erreicht werden, da der Weg zu all seinen Nachbarn schon länger ist und dies auch durch eine negative Kante nicht ausgeglichen werden kann. Diesen Knoten können wir also als gesetzt betrachten und auch all seine Nachbarn hinzuziehen. Wieder gilt: derjenige Knoten mit der kürzesten Entfernung zum Startknoten kann nicht schneller erreicht werden... und so weiter, bis alle Entfernungen berechnet sind.
- Markiere alle Knoten des Graphen als noch nicht besucht.
- Weise jedem Knoten des Graphen seine Entfernung vom Startknoten zu. Für den Startknoten ist diese offensichtlich 0, für alle anderen Knoten wird sie vorerst auf gesetzt.
- Solange es noch unbesuchte Knoten mit einer Entfernung gibt, führe folgende Schritte aus:
- Wähle einen unbesuchten Knoten mit der kürzesten Entfernung zum Startknoten aus.
- Markiere als besucht.
- Betrachte nun alle Nachbarknoten von :
- Wenn die Entfernung von zum Startknoten größer ist als die Entfernung vom Startknoten zu plus die Länge der Kante zwischen und , dann setze die Entfernung von zum Startknoten auf die Entfernung vom Startknoten zu plus die Länge der Kante zwischen und
Beispiel
In diesem Beispiel suchen wir die kürzesten Wege vom Knoten B aus.
Nun enthält der Graph keine unbesuchten Knoten mehr, der Algorithmus terminiert.