Sie sind auf Seite 1von 2

FOP-Projekt 18/19 -Theorieaufgaben -

Referenzlösung

3.1.4 Wege finden II


Aufgabenteile a und b
Wir beantworten die beiden Aufgabenteile in gemischter Reihenfolge, zuerst im ab-
strakten Fall (Teil b) und dann im speziellen (Teil a).
Bezeichnen wir im folgenden mit Q die Datenstruktur, in der wir die noch nicht
abgearbeiteten Knoten speichern. Außerdem bezeichnen wir mit n die Anzahl an
Knoten und mit m die Anzahl an Kanten. Außerdem bezeichnen wir mit TEM
die Laufzeit um in Q das Minimum zu finden und zu extrahieren und mit TU V die
Laufzeit um den tempörären Distanzwert zu updaten. Die Gesamtlaufzeit liegt dann
in O(TEM · n + TU V · m) (Aufgabenteil b).
Bei einer Liste liegen die beiden Laufzeiten für das Update und das Extrahieren in
O(n). Für Aufgabenteil a ergibt sich also eine gesuchte Laufzeit in O(n · n + n · m) =
O(n2 + nm) = O(n2 ).

Hinweis: In unserer Methode den geringsten Knoten zu finden, wird einmal die
Zuordnung über eine Hashmap gemacht. Unter der Annahme eines Zugriffs in O(1)
ergibt sich die oben beschriebene Laufzeit. Für den Worst-Case liegt der Zugriff
jedoch schätzungsweise selbst in linearer Laufzeit, sodass wir am Ende sogar in
O(n3 ) landen würden. Beide Lösungen werden akzeptiert.

Zusätzlich war in Aufgabenteil b nach einer Datenstruktur gefragt, welche die Gesamt-
laufzeit minimiert. Hier wär beispielsweise ein Fibonacci Heap denkbar.

Aufgabenteil c
Sei s der Startknoten, δ(v) ein temporärer Distanzwert und ∆(v) der kürzeste (v, s)-
Pfad. Nach h ≥ 0 Durchläufen gilt:

1. Die Liste enthält alle Knoten bis auf s und h weitere Knoten.

2. Für die noch nicht abgearbeiteten Knoten v ist δ(v) die Länge eines kürzesten
Pfades (s, v), welche nur Knoten betrachtet, welche bereits abgearbeitet wur-
den.

3. Für die Knoten v welche bereits abgearbeitet wurden gilt δ(v) = ∆(v).
3.1.5 Kürzester Pfad zu allen Knoten
Aufgabenteil a
Bei einem Zykel der Länge m, stehen spätestens in Iteration m − 1 bei allen Knoten,
die in diesem Zykel sind, negative Werte auf der Hauptdiagonalen. Daher funk-
tioniert der Algorithmus für negative Zykel nicht mehr korrekt. Man könnte einen
immer kleineren Weg bauen, indem man immer wieder über den Zykel läuft und
erreicht niemals DEN kürzesten Weg.
Beispiel:

Aufgabenteil b
Wir updaten pro Iteration n2 -Matrixeinträge. Das Updaten eines Matrixeintrages
liegt in Θ(n), da wir für das Updaten für Pfad (v, w) in konstanter Laufzeit für alle
Knoten x den Pfad (v, x) nachschlagen und auf (x, w) addieren und mit dem alten
Wert vergleichen. Insgesamt läuft der Algorithmus n − 1 Iterationen, sodass wir
insgesamt eine asymptotische Komplexität von Θ(n4 ) haben.