Blatt 09

Werbung
Dozent: Dr. Christoph Garbe
Tutoren: Niels Buwen, Marcel Gutsche, Alexander König, Daniel Stoll, Timo Wiese
9. Übungsblatt
Algorithmen und Datenstrukturen SS 2015
Abgabe bis Donnerstag, den 02.07.2015
Aufgabe 1: Algorithmus von Kruskal
(15 P.)
Aus der Vorlesung ist Ihnen der Algorithmus vom Kruskal zum Auffinden eines minimal aufspannenden Baumes bekannt.
a) Minimaler Spannbaum
(4 P.)
Erstellen Sie aus dem in Abbildung 1 gezeigten, kantengewichteten Graph einen minimalen
Spannbaum, wie ihn der Algorithmus von Kruskal erzeugen würde. Erläutern Sie ihre Vorgehensweise und visualisieren Sie das Ergebnis.
A
12
4
B
C
10
8
7
11
6
D
E
11
5
5
F
G
4
Abbildung 1: Gewichteter Graph.
b) Vergleich mit Prims Algorithmus
(4 P.)
Wo liegt der fundamentale Unterschied zu Prims Algorithmus?
1
c) Speed Improvements
(7 P.)
Nehmen Sie an, dass alle Kantengewichte des Graphs Ganzzahlen zwischen 1 und |V | sind
(|V | ist die Anzahl der Knoten). Wie schnell könnte der Algorithmus unter dieser Annahme
ausgeführt werden? Wie schnell, wenn die Kantengewichte zwischen 1 und einem konstanten
Wert W liegen?
Hinweis: Sie können annehmen, dass die Aufrufe der Methoden der Disjoint-Set Datenstruktur eine Laufzeit von O(Eα(V )) haben. Dabei ist α eine sehr langsam wachsende Funktion
(s. Cormen 3rd Edition, Kapitel 23-2).
Aufgabe 2: Dijkstra-Algorithmus
(15 P.)
In der Vorlesung haben Sie den Dijkstra-Algorithmus zur Bestimmung aller kürzesten Wege von
einem gegebene Startknoten aus kennengelernt. Im Folgenden werden Sie diesen Algorithmus
genauer betrachten.
a) Kürzester Weg
(6 P.)
Führen Sie auf dem gegebenen Graphen den Algorithmus von Dijkstra vollständig aus, um alle
vom Startknoten – mit der eingetragenen Distanz 0 – ausgehenden, kürzesten Pfade zu bestimmen. Zeichnen Sie dafür für jeden Schritt den Graphen mit den jeweils bekannten Distanzen
und kennzeichnen Sie den im aktuellen Schritt betrachteten Knoten.
2
3
∞
∞
∞
6
18
7
0
2
9
3
∞
5
3
8
∞
∞
Abbildung 2: Gewichteter Graph.
b) Negative Gewichte
(9 P.)
Warum würde der Algorithmus nicht funktionieren, wenn negative Kantengewichte erlaubt
wären? Welcher Algorithmus kann unter welchen Bedingungen mit negativen Kantengewichten
umgehen?
2
Aufgabe 3: Bellman-Ford-Algorithmus in Python
(20 P.)
In der Vorlesung haben Sie den Bellman-Ford-Algorithmus kennen gelernt. Diesen werden Sie
nun in Python mit Hilfe von Python-Dictionaries implementieren. Importieren Sie das Projekt
aus AlgoDat09.zip. Bitte übernehmen Sie das Codegerüst, da auf dessen Grundlage ihr Code
auf Korrektheit überprüft wird. Sollten Sie davon abweichen und es infolge dessen zu einem
Fehler kommen, können dafür keine Punkte vergeben werden.
Im Code werden sie die folgenden Datenstrukturen verwenden:
• Knoten: Ein einfacher String (z.B. die Buchstaben a-z)
• Graph: Ein Dictionary welches als Schlüssel die Knoten beinhaltet und als Wert wiederum
ein Dictionary mit den nachfolgenden Knoten als Schlüssel und den Kantengewichten als
Wert (s. Beispiel unten).
• Distanz: Ein Dictionary welches als Schlüssel den Knoten und als zugehörigen Wert die
Distanz zum Startknoten speichert
• Vorgänger: Ein Dictionary welches als Schlüssel die Knoten und als Wert den Vorgängerknoten
speichert. Daraus lässt sich der kürzeste Weg zu jedem Knoten rekonstruieren.
Beispiel für einen gültigen Graphen:
graph = {
’a’: {’d’: -1, ’c’:
’b’: {’e’: 3, ’d’:
’c’: {’b’: 1},
’d’: {’b’: 1, ’c’:
’e’: {’d’: -3}
}
4},
2, ’e’:
2},
5},
a) Initialize
(5 P.)
Vervollständigen sie die Methode initialize. Als Parameter übergeben Sie den Graphen, sowie
den Startknoten. Als Rückgabewert wird die Distanz, sowie die Vorgänger erwartet.
b) Relax
(5 P.)
Vervollständigen sie die Methode relax. Als Parameter übergeben Sie den aktuellen Knoten,
den gerade betrachteten Nachbarn, den Graphen, das Dictionary mit den Distanzen, sowie das
Dictionary mit den Vorgängern. Es wird nichts zurückgegeben.
3
c) Bellman-Ford
(10 P.)
Vervollständigen sie die Methode bellman ford. Als Parameter übergeben Sie den Graphen,
sowie den Startknoten. Als Rückgabe werden die Dictionaries mit den Distanzen, sowie den
Vorgängern erwartet. Beachten Sie dabei, das Zyklen mit negativem Gesamtkantengewicht
erkannt werden müssen! Falls so ein Fall auftritt, soll dieser einen Fehler produzieren. Dies
können Sie mit raise ValueError(”Fehlertext”) erreichen.
4
Herunterladen