Datenstrukturen und Algorithmen WS 01 Universität Konstanz Lehrstuhl für Praktische Informatik Prof. Dr. D. Wagner / T. Willhalm 8. Übungsblatt Abgabe: 14. Dezember 2001, 12 Uhr in den Fächern vor dem Sekretariat E212 Aufgabe 1 (4 Punkte) Geben Sie eine Folge von m MakeSet-, Union- und Find-Operationen an, wobei n ∈ IN der Operationen vom Typ MakeSet sind, die Ω(m log n) Zeit benötigt, wenn zwar weighted-Union aber keine Pfadkompression genutzt wird. Was passiert, wenn bei ihrem Beispiel Pfadkompression benutzt wird? Aufgabe 2 (4 Punkte) Zeigen Sie, dass jede Folge von m MakeSet-, Union- und Find-Operationen, in der alle UnionOperationen vor der ersten Find-Operation ausgeführt werden, nur O(m) Zeit benötigt, wenn sowohl Pfadkompression als auch weighted-Union benutzt werden. Wie sieht es aus, wenn nur Pfadkompression aber kein weighted-Union benutzt wird? Aufgabe 3 (4 Punkte) In der Vorlesung wurde eine Prozedur weighted-Union(i, j) angegeben, bei der immer der Baum mit weniger Elementen an den Baum mit mehr Elementen angehängt“ wird. Betrachten Sie ” nun die Prozedur balanced-Union(i, j), bei der immer der Baum kleinerer Höhe an den Baum größerer Höhe angehängt wird. (a) Geben Sie die Prozedur balanced-Union(i, j) in Pseudocode an. Gehen Sie analog zur Vorgehensweise bei weighted-Union davon aus, daß für die Wurzel r eines Baumes anstelle des Vorgängers die Höhe des Baumes in Vor[r], mit negativem Vorzeichen versehen, gespeichert ist. (b) In der Vorlesung wurde ein Lemma angegeben, das die Anzahl der Elemente in einem aus einer Folge von Makeset- und weighted-Union-Operationen entstandenen Baum mit der Höhe des Baumes in Beziehung setzt. Zeigen Sie ein entsprechendes Lemma, wenn statt weighted-Union nun balanced-Union angewendet wird. b.w. Aufgabe 4 (4 Punkte) Der kleinste gemeinsame Vorfahr zweier Knoten u und v in einem Wurzelbaum T ist der Knoten w, der ein Vorfahr beider Knoten u und v ist und die größte Tiefe in T besitzt. Im Problem offline kleinster gemeinsamer Vorfahr“ ist ein Wurzelbaum T gegeben und eine Menge P von un” geordneten Paaren von Knoten aus T ; es soll für alle Paare in P der kleinste gemeinsame Vorfahre bestimmt werden. Um das Problem zu lösen, wird der folgende Algorithmus für die Wurzel des Baumes aufgerufen. Zuvor werden alle Knoten als unbesucht markiert. Algorithmus LCA(u) 1 MakeSet(u) 2 V orf ahr[Find(u)] := u 3 für alle Kinder v von u in T führe aus: 4 LCA(v) 5 Union(u, v) 6 setze V orf ahr[Find(u)] := u 7 markiere u als besucht 8 für alle Knoten v mit {u, v} ∈ P führe aus: 9 falls v als besucht markiert ist 10 gib aus: Der kleinste gemeinsame Vorfahr von ” u und v ist V orf ahr[Find(v)]“ (a) Zeigen Sie, dass die Zeile 10 für jedes Paar {u, v} ∈ P genau einmal ausgeführt wird. (b) Zeigen Sie, dass für jeden Knoten u ∈ T beim Aufruf von LCA(u) die Anzahl der Mengen in der Union-Find-Datenstruktur gleich der Tiefe von u in T ist. (c) Zeigen Sie, dass LCA korrekt ist, d.h. für alle Paare {u, v} ∈ P die kleinsten gemeinsamen Vorfahren von u und v ausgibt.