Hanno Lefmann S. Droste/M. Müller-Olm/H. Tatlıtürk/H. Yoo Dortmund, den 13.12.1999 Abgabe bis 20.12.1999 um 14:00 Uhr Übungen zur Vorlesung Datenstrukturen WS 1999/2000 Blatt 10 Aufgabe 10.1 (5 Punkte) Es sei die erste UNION-FIND Datenstruktur gegeben, d. h. ein n-elementiges Array A, so dass in A(i) die Menge steht, in der Element i ∈ {1, . . . , n} enthalten ist. Zusätzlich ist für jede Menge ihre Größe und eine Liste der Elemente in der Menge gegeben. Es wurde in der Vorlesung gezeigt, dass die Laufzeit für jede Folge von UNION-Befehlen auf n Elementen höchstens O(n log(n)) ist. Geben Sie eine Folge von UNION-Befehlen auf n Elementen an, deren Laufzeit wirklich Θ(n log(n)) beträgt, wobei Sie n als Zweierpotenz annehmen können. Aufgabe 10.2 (5 Punkte) Es sei die zweite UNION-FIND Datenstruktur gegeben, d. h. für jede Menge ein Baum, in dessen Knoten die Elemente stehen und in dessen Wurzel zusätzlich der Mengenname vermerkt ist. Dabei wird jeder Baum durch ein Array dargestellt, so dass in dem i-ten Arrayelement der Elter von Knoten i steht. Betrachten Sie den Fall, dass eine Menge durch einen vollständigen binären Baum der Tiefe k gegeben ist, an dessen Blättern von links nach rechts die Elemente 1 bis n = 2k stehen. Welche Kosten erzeugt die Folge F IN D(1), . . . , F IN D(n) von Befehlen ohne bzw. mit PfadKompression? Beweisen Sie Ihre Antwort. Hinweis: Überlegen Sie zu der Variante mit Pfad-Kompression, wie oft jeder Knoten bei der Folge von FIND-Befehlen besucht wird. Zeigen Sie zusätzlich, dass ein vollständiger binärer Baum der Tiefe k ≥ 2 nicht durch eine Folge von UNION-Befehlen aus einelementigen Mengen entstehen kann. Aufgabe 10.3 (5 Punkte) Der Tiefensuchalgorithmus kann in Zeit O(|V |+|E|) entscheiden, ob ein ungerichteter Graph G = (V, E) einen Kreis enthält. Zeigen Sie, dass - etwa durch eine kleine Modifikation des Algorithmus - auch eine Laufzeit von O(|V |) erreicht werden kann. Aufgabe 10.4 (5 Punkte) Es sei ein gerichteter Graph G = (V, E) mit einer Längenfunktion c : E → N0 gegeben. Das Problem der kürzesten Pfade besteht darin, zu einem gegebenen Startknoten a ∈ V für alle von a aus erreichbaren Knoten v die Länge eines kürzesten gerichteten Pfades (d. h. einfachen Weges) von a zu v zu berechnen. Dabei ist die Länge eines Pfades (v1 , . . . , vk ) (mit (vi , vi+1 ) ∈ E für alle i ∈ {1, . . . , k − 1}) gleich der Summe der c((vi , vi+1 )) (über alle i ∈ {1, . . . , k − 1}), d. h. der Längen der Kanten des Pfades. Betrachten Sie den folgenden Algorithmus von Dijkstra: Dijkstra(a): 1. Für alle v ∈ V : färbe v weiss und setze dist(v) := ∞. 2. Färbe a grau und setze dist(a) := 0. 3. Solange es einen grauen Knoten gibt: 3.1. Wähle einen grauen Knoten w, der den kleinsten dist-Wert hat. 3.2. Färbe w schwarz. 3.3. Für alle v ∈ Adj(w): 3.3.1. Setze dist(v) := min{dist(v), dist(w) + c((w, v))}. 3.3.2. Falls v weiss ist, färbe v grau. Zeigen Sie, dass dieser Algorithmus das Problem der kürzesten Pfade löst, d. h., dass am Ende genau alle von a aus erreichbaren Knoten schwarz sind und der dist-Wert jeweils die Länge der kürzesten Pfades von a aus ist. Hinweis: Beweisen Sie per Induktion über die Zahl i der erfolgten Schleifendurchläufe 3. 3.3.2.: a) Für alle i schwarzen Knoten v ist dist(v) die Länge des kürzesten Pfades von a nach v in G. b) Alle schwarzen Knoten haben nur schwarze oder graue Knoten als Nachbarn. Für jeden grauen Knoten v ist dist(v) gleich der Länge des kürzesten Pfades von a zu v, der nur über schwarze Knoten läuft. Die Ausgabe der Übungszettel erfolgt immer montags in der Vorlesung. Die Bearbeitungen müssen bis zum darauffolgenden Montag 14:00 Uhr in die gekennzeichneten Briefkästen im Pav. 6 eingeworfen werden. Bitte Namen und die Gruppennummer nicht vergessen.