8. Übung - Universität Konstanz

Werbung
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.
Herunterladen