Einleitung
- kürzesten Weg finden
- wie BFS, aber jede Kante hat ein Gewicht
- minimale Distanz ist die mit der geringsten Summer der Gewichte
- Hier: keine Gewichte negativ, siehe → Bellman Ford
Step by step
- Obere Schranken für Distanzen zu Startknoten festlegen: Startknoten 0, Rest unendlich
- Starte bei dem Startknoten und verbessere die anliegenden Knoten
- Wenn obere Schranke vom vorherigen Knoten + Wert der Kante < Knotenwert (zu Beginn $\infty$), dann ersetze obere Schranke mit neuen oberen Schranke.
- Nach den anliegenden Knoten, mache weiter mit dem Knoten mit der tiefsten Schranke
- Minimale Distanz zu einem Knoten gefunden wenn alle eingehenden Kanten abgedeckt
Hmm…
- Wenn Weg einen Knoten deckt dann ist obere Schranke fixiert
- “jedes mal vom Minimum ausgehen”
- Kind-of Invariante: PQ.extractMin → v
Pseudocode
- PriorityQueue hat Toupel, für jeden Knoten ist aktuelle Distanz gespeichert (s,0), Rest $\infty$ (Achtung in Java,
Integer.MAX_VALUE+1gibt overflow error, alsoInteger.MAX_VALUE/2nutzen) - PQ.poll() ist PQ.extractMin
- Laufzeit: $O((|V|+|E|)\cdot \log(n))$
Datenstruktur
Priority Queue, wie Min-Heap (vgl. Max-Heap aber umgekehrt)
Operationen
- Insert
- ExtractMin / Poll
- DecreaseKey
- Laufzeit der Operationen: $O(\log n)$