Algorithmen und Datenstrukturen SS 2016 – ¨Ubung 12

Werbung
TU Ilmenau, Fakultät für Informatik und Automatisierung
FG Komplexitätstheorie und Effiziente Algorithmen
Univ.-Prof. Dr. M. Dietzfelbinger, Dr. C. Mattern, M.Sc. Stefan Walzer
http://www.tu-ilmenau.de/iti/lehre/lehre-ss-2016/aud/
Algorithmen und Datenstrukturen SS 2016 – Übung 12
Besprechung: 25. Kalenderwoche (27. Juni - 1. Juli 2016)
Aufgabe 1 (Ablauf des Dijkstra-Algorithmus)
Führen Sie den Algorithmus von Dijkstra an folgendem Eingabegraphen startend vom Knoten S aus.
Zeichnen Sie exemplarisch zu selbst gewählten Zeitpunkten ein mögliches Aussehen des Binärheaps.
Wie viele insert-, extractMin-, bzw. decreaseKey-Operationen werden auf diesem Beispiel ausgeführt?
Beschriften Sie die Knoten wie folgt: Wenn Knoten v in Runde i vom Algorithmus bearbeitet wird,
dann tragen Sie . .i . v “ an der markierten Stelle ein. Wenn der dist-Wert eines Knotens v in Runde i
”
verändert wird, tragen Sie in die dem Knoten zugehörige Tabelle eine neue Spalte für Runde i mit Runde
”
i“, dem neuen dist-Wert“, und dem neuen Vorgänger ( pred“) des Knotens ein. (Ein Beispiel für das
”
”
mögliche Aussehen dieser Tabelle sehen Sie rechts unten.)
Runde
dist
pred
0
0
–
Runde
dist
pred
S
....
0
∞
–
A
1
....
4
6
Runde
dist
pred
5
....
2
Runde
dist
pred
D
0
∞
–
1
....
B
Runde
dist
pred
0
∞
–
0
∞
–
E
1
....
3
C ....
1
Runde
dist
pred
0
∞
–
Aufgabe 2 (Bidirektionaler Dijkstra-Algorithmus)
Beispiel: Knoten U wird in Runde 25 bearbeitet.
. .25
...
U
Runde
dist
pred
0
∞
–
2
24
X
5
12
Y
11
10
Z
In dieser Aufgabe betrachten wir das folgende Problem: Gegeben sei ein gerichteter Graph G = (V, E, c)
mit nichtnegativen Kantengewichten und zwei ausgezeichnete Knoten s,t ∈ V . Wir nehmen an, dass in
dem Graphen mindestens ein (s,t)-Weg (also ein einfacher Weg von s nach t) existiert. Wir suchen in G
einen kürzesten Weg von s nach t.
Dieses Problem können wir mit dem Algorithmus von Dijkstra lösen. Dabei brechen wir den Algorithmus
ab, wenn der Knoten t abgearbeitet – also in die Menge S aufgenommen – wird.
2
Algorithmen und Datenstrukturen SS 2016 – Übung 12
Wir betrachten die folgende Variation: Der Algorithmus wird sowohl vom Start- als auch vom Zielknoten
gleichzeitig gestartet mit zwei Prioritätswarteschlangen PQ1 bzw. PQ2 und zwei dist-Arrays dist1 bzw.
dist2 . Der zweite Dijkstra-Ablauf findet dabei im Umkehrgraphen statt. In jeder Runde wird genau ein
Knoten bearbeitet – entweder aus PQ1 oder PQ2 –, nämlich derjenige Knoten mit insgesamt kleinster
Priorität. Für diesen Knoten wird nun eine komplette Runde im Dijkstra-Algorithmus ausgeführt. Der
eigentliche Algorithmus-Ablauf stoppt, falls man einen Knoten gefunden hat, der von beiden DijkstraAbläufen abgearbeitet worden ist. Sei v∗ ein solcher Knoten.
(a) Geben Sie ein Beispiel an, in dem ein kürzester (s,t)-Weg nicht über v∗ läuft.
In einem Nachverarbeitungsschritt macht man nun noch Folgendes: Man entnimmt jeden Knoten aus
PQ1 . Falls dieser Knoten von der zweiten Instanz bearbeitet worden ist, so betrachtet man, ob über
diesen Knoten ein kürzerer Weg von s nach t führt. Wenn ja, ist dieser Weg der aktuell kürzeste Weg von
s nach t; ansonsten ignoriert man ihn.
(b) Beweisen Sie, dass diese Variante einen kürzesten (s,t)-Weg findet.
Hinweis: Sei p ein (beliebiger) kürzester (s,t)-Weg. Betrachten Sie den Zeitpunkt, an dem der
Knoten v∗ gefunden wird. Unterscheiden Sie die folgenden drei Fälle: (i) v∗ liegt auf p. (ii) p nutzt
nur Knoten, die jeweils von einer der beiden Dijkstra-Abläufe abgearbeitet wurde. (iii) p enthält
einen Knoten, der von keinem der beiden Algorithmen betrachtet worden ist.
Herunterladen