ETH Zürich Institut für Theoretische Informatik Prof. Dr. Angelika Steger, Prof. Dr. Thomas Holenstein Ralph Keusch HS 2015 Algorithmen und Komplexität Lösungsvorschlag zu Übungsblatt 9 Lösungsvorschlag zu Aufgabe 1 Wir nehmen an, dass sich die k Operationen aufteilen in eine erste Phase von k1 MakeNewSet- oder Union-Operationen und eine zweite Phase von k2 = k − k1 Find-Operationen. Da die MakeNewSetund Union-Operationen jeweils in konstanter Zeit O(1) ausführbar sind, sind die Gesamtkosten der ersten Phase O(k1 ). Um die Laufzeit der zweiten Phase zu berechnen, definieren wir die Potentialfunktion φ( j) als die Anzahl der Knoten, die nach insgesamt j Operationen von ihrer Wurzel mindestens Abstand 2 haben. Während der ersten Phase können wir höchstens k1 viele Knoten in die Struktur einfügen, damit gilt sicher φ(k1 ) ≤ k1 . Wenn nun mit der i-ten Find-Operation ein Knoten der Tiefe mi aufgerufen wird, so verursacht das Zurücklaufen zur Wurzel (und die Path-Compression) Kosten Cmi für eine geeignet gewählte Konstante C. Da wir aber gleichzeitig Path-Compression durchführen, d.h. die mi − 1 Knoten, die wir auf dem Weg zur Wurzel besuchen, direkt an die Wurzel hängen, verringert sich gleichzeitig das Potential um mi − 1. Wir haben während der zweiten Phase keine anderen Operationen, somit verringert sich das Potential während der zweiten Phase insgesamt um ∑ik=2 1 (mi − 1). Nun stellen wir aber fest, das per Definition φ( j) ≥ 0 für alle j gilt. Deshalb gilt insbesondere k2 k2 i =1 i =1 0 ≤ φ ( k ) = φ ( k 1 ) − ∑ ( m i − 1) ≤ k 1 − ∑ ( m i − 1). Darus folgt dann k2 ∑ ( m i − 1) ≤ k 1 . i =1 Die Gesamtkosten betragen deshalb höchstens k2 O(k1 ) + ∑ Cmi = O(k1 ) + C i =1 k2 ∑ ( m i − 1) + k 2 ! ≤ O(k1 ) + C (k1 + k2 ) = O(k) . i =1 Lösungsvorschlag zu Aufgabe 2 Unsere Implementation verwendet zwei Stacks S1 und S2 . Für die Queue implementieren wir die Operationen E NQUEUE ( x ) und D EQUEUE () wie folgt: Algorithm 1 E NQUEUE ( x ) S1 .P USH ( x ) Korrektheit: Wir zeigen, dass D EQUEUE () immer jenes Objekt y zurückgibt, welches unter allen Objekten in der Queue als erstes mit E NQUEUE (y) eingefügt wurde. Das ist so, da das oberste Objekt in S2 immer dieses y ist und der Algorithmus immer das oberste Objekt aus S2 zurückgibt. 1 Algorithm 2 D EQUEUE () if S2 .isEmpty then while not S1 .isEmpty do S2 .P USH (S1 .P OP ) end while end if return S2 .P OP () Amortisierte Laufzeit: Wir definieren die Potentialfunktion φ(i ) und die Funktion t(i ) wie folgt: φ(i ) := 2 · (Anzahl Objekte in S1 nach den ersten i Operationen) t(i ) := Zeit, die während den ersten i Operationen aufgewendet wurde. Wir nehmen an, dass die Operationen P OP und P USH jeweils nur einen Zeitschritt brauchen. Offensichtlich gilt φ(0) = t(0) = 0 und φ(i ) ist immer positiv. Wir zeigen per Induktion über i, dass t(i ) + φ(i ) ≤ 3i. (Dies ergibt die obere Schranke t(i ) ≤ t(i ) + φ(i ) ≤ 3i, da φ(i ) ≥ 0.) Die Induktionsverankerung i = 0 ist trivial. Die Induktionshypothese ist t(i − 1) + φ(i − 1) ≤ 3(i − 1) = 3i − 3. Falls nun die die i-te Operation E NQUEUE ist, finden wir t ( i ) + φ ( i ) = t ( i − 1) + 1 + φ ( i − 1) + 2 = t(i − 1) + φ(i − 1) + 3 ≤ 3i − 3 + 3 = 3i. Falls die i-te Operation D EQUEUE ist, unterscheiden wir, ob S2 leer ist oder nicht. Wenn S2 nicht leer ist, ergibt sich t ( i ) + φ ( i ) = t ( i − 1) + 1 + φ ( i − 1) = t(i − 1) + φ(i − 1) + 1 ≤ 3i − 3 + 1 < 3i. Falls S2 leer ist, müssen für jedes Objekt in S1 genau 2 Operationen (ein P OP von S1 und ein P USH auf S2 ) ausgeführt werden. Am Ende wird ein zusätzliches P OP auf S2 aufgerufen. Gemäss Definition von φ ist die Anzahl benötigter Operationen genau φ(i − 1) + 1 und folglich gilt t ( i ) + φ ( i ) = t ( i − 1) + φ ( i − 1) + 1 + 0 ≤ 3i − 3 + 1 + 0 < 3i. Lösungsvorschlag zu Aufgabe 3 Nein. Nach Lemma 4.12 der Vorlesung müsste mindestens eines der drei Blätter ein Kind haben; der Baum kann deswegen kein Baum eines Fibonacci-Heaps sein. 2