Übungen zur Vorlesung Datenstrukturen und Algorithmen SS 2006 Blatt 13 Sven Grothklags University of Paderborn 10. Juli 2006 Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 1 / 13 Aufgabe 39 a) P = {{b, h}, {c, c}, {d, k}, {j, l}} b LCA(u) 1 2 3 4 5 6 7 8 9 10 a c d Make-Set(u) e f g h i j ancestor [Find-Set(u)] ← u for alle Kinder v von u do LCA(v ) k l Union(u, v ) ancestor [Find-Set(u)] ← u color [u] ← BLACK for alle Knoten v mit {u, v } ∈ P do if color [v ] = BLACK then print ’LCA(’ u ’,’ v ’)=’ ancestor [Find-Set(v )] Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 2 / 13 Aufgabe 39 b) Zeigen Sie, dass Zeile 10 des Algorithmus für jedes Paar {u, v } ∈ P genau einmal ausgeführt wird. Beobachtungen: I Der Algorithmus LCA durchläuft wegen seines rekursiven Aufbaus den gesamten Baum. I Für jeden Knoten u des Baumes wird deshalb genau einmal LCA(u) aufgerufen. I Die Knoten werden dabei in Postorder-Reihenfolge schwarz gefärbt. Daraus folgt: I Zeile 9 wird für jedes Paar {u, v } genau zweimal ausgeführt. (Falls u = v nur einmal.) I Da Knoten erst nach der Bearbeitung aller Nachkommen schwarz gefärbt werden, wird Zeile 10 nur für den Knoten mit der höheren Postorder-Nummer ausgeführt. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 3 / 13 Aufgabe 39 c) Zeigen Sie, dass zum Zeitpunkt, an dem LCA(u) aufgerufen wird, die Anzahl der in der Union-Find-Datenstruktur verwalteten disjunkten Mengen gleich der Tiefe von u in T ist. Induktion über die Tiefe t des Knotens u: I Induktionsanfang: t = 0 (Wurzel) Für die Wurzel root[T ] gilt, dass zum Zeitpunkt des Aufrufs LCA(root[T ]) noch keine disjunkten Mengen verwaltet werden. I Induktionsschritt: t − 1 → t, t > 0 Sei p der Vater von u. Zum Zeitpunkt des Aufrufs von LCA(p) werden nach Induktionsvoraussetzung t − 1 Mengen verwaltet. In Zeile 1 wird dann eine zusätzliche Menge erzeugt. Falls u das erste betrachtete Kind von p ist, ist nichts weiter zu zeigen. Ansonsten hat jeder vor u betrachtete Bruder b nach dem Aufruf LCA(b) eine neue Menge erzeugt, die aber in Zeile 5 mit der Menge des Vaters p vereinigt wird. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 4 / 13 Aufgabe 39 c) Hilfslemma Der Aufruf LCA(u) erzeugt eine neue Menge, die alle Knoten des Unterbaums mit Wurzel u enthält. Induktion über die Höhe h des Knotens u: I I Induktionsanfang: h = 0 (Blatt) Für ein Blatt u gilt, dass in Zeile 1 eine neue Menge {u} erzeugt wird. Da u keine Kinder hat, werden keine weiteren Mengenmanipulationen“ durchgeführt. ” Induktionsschritt: h > 0 In Zeile 1 wird die Menge {u} erzeugt. Anschließend wird diese Menge nach Induktionsvoraussetzung um die Knoten aller der Unterbäume erweitert, deren Wurzeln Kinder von u sind (Zeile 5). Am Ende enthält die neue Menge also alle Knoten des Unterbaums mit Wurzel u. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 5 / 13 Aufgabe 39 d) Zeigen Sie, dass der Algorithmus LCA für jedes Paar {u, v } ∈ P den jüngsten gemeinsame Vorfahren ausgibt. Wir zeigen: Vor/nach jedem Schleifendurchlauf (Zeile 3 bis 6) während der Bearbeitung von LCA(u) gilt, dass in ancestor [Find-Set(v )] der jüngste gemeinsame Vorfahre von u und v für alle Knoten v , die sich aktuell in der Union-Find-Datenstruktur befinden, steht. Da sich alle aktuell schwarzen Knoten auch in der Union-Find-Datenstruktur befinden, gilt damit insbesondere für Zeile 10, dass dort der jüngste gemeinsame Vorfahre von u und v ausgegeben wird. Nach 39 a) wird Zeile 10 für jedes Paar genau einmal aufgerufen. Der Algorithmus arbeitet somit korrekt. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 6 / 13 Aufgabe 39 d) Vor/nach jedem Schleifendurchlauf (Zeile 3 bis 6) während der Bearbeitung von LCA(u) gilt, dass in ancestor [Find-Set(v )] der jüngste gemeinsame Vorfahre von u und v für alle Knoten v , die sich aktuell in der Union-Find-Datenstruktur befinden, steht. Betrachte LCA(u) für einen Knoten u. I Vor erstem Schleifendurchlauf: In den Zeilen 1 und 2 wird {u} mit ancestor [Find-Set(u)] = u der Union-Find-Datenstruktur neu hinzugefügt. Somit ist für Knoten u die Aussage korrekt. Falls u die Wurzel ist, befinden sich keine weiteren Knoten in der Union-Find-Datenstruktur. Ansonsten sei p der Vorfahre von u und die Aussage gelte für p vor dem Aufruf von LCA(u). Die einzigen Knoten, für die sich die LCAs bezüglich u bzw. p unterscheiden, sind die Knoten im Unterbaum mit Wurzel u. Von denen befindet sich aber nur u in der Datenstruktur. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 7 / 13 Aufgabe 39 d) Vor/nach jedem Schleifendurchlauf (Zeile 3 bis 6) während der Bearbeitung von LCA(u) gilt, dass in ancestor [Find-Set(v )] der jüngste gemeinsame Vorfahre von u und v für alle Knoten v , die sich aktuell in der Union-Find-Datenstruktur befinden, steht. Betrachte LCA(u) für einen Knoten u. I Nach Schleifendurchlauf mit Kind v : Die Aussage gelte vor dem Schleifendurchlauf. Während des Schleifendurchlaufs werden (gemäß des Hilfslemmas) alle Knoten des Unterbaums mit Wurzel v der Menge, in der u sich befindet, hinzugefügt. Für alle diese Knoten w gilt am Ende des Durchlaufs ancestor [Find-Set(w )] = u, was der richtige LCA bezüglich u ist, da alle diese Knoten Nachkommen von u sind. Die LCAs aller anderen Knoten in der Union-Find-Datenstruktur ändern sich dadurch nicht. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 8 / 13 Aufgabe 39 e) Bestimmen Sie die Laufzeit von LCA, wenn die Union-Find-Datenstruktur aus der Vorlesung verwendet wird. Sei n die Anzahl der Knoten des Baumes T und p = |P|. Die Gesamtlaufzeit des Algorithmus LCA(root[T ]) lässt sich in drei Teile aufteilen: I Das reine Durchsuchen des Baumes geht in Zeit O(n). I Die Ausgabe der LCAs (Zeile 8 bis 10) kann (aufsummiert über alle Aufrufe von LCA) in Zeit O(p + n) durchgeführt werden (siehe 39a). Dazu muss die Menge P ähnlich einer Adjazenzliste gespeichert sein. I Nach Satz 16.8 verursachen die Mengenmanipulationen“ insgesamt ” Aufwand O(p + n log n), da insgesamt n Make-Set-Aufrufe stattfinden und ansonsten O(p + n) weitere Mengenoperationen verwendet werden. Der Gesamtaufwand ist also O(p + n log n) Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 9 / 13 Aufgabe 40 a) Beim Problem Münz-Minimierung besitzen Sie jeweils eine beliebig große Menge von 10-, 5-, 2- und 1-Centmünzen. Gegeben ist weiter ein Betrag b. Dieser Betrag soll mit möglichst wenigen Münzen bezahlt werden. I Entwerfen Sie einen Greedy-Algorithmus (in Pseudocode), der das Problem Münz-Minimierung optimal löst. Idee: Durchlaufe die Münzen nach absteigender Wertigkeit. Nimm so viele Münzen wie möglich von der aktuellen Münzsorte. Coin-Minimization(b) I I 1 COINS ← {10, 5, 2, 1} 2 for i ← 1 to jlength[COINS] k 3 4 5 do n ← b COINS[i] print n ’ Münzen mit Wertigkeit ’ COINS[i] b ← b − n · COINS[i] Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 10 / 13 Aufgabe 40 b) Beweisen Sie die Optimalität Ihres Algorithmus. Sei (n10 , n5 , n2 , n1 ) eine münz-minimale Auszahlung des Betrags b. Dann gilt: I n5 < 2, da ansonsten zwei 5er-Münzen durch eine 10er-Münze ersetzt werden könnten. I n2 < 3, da ansonsten drei 2er-Münzen durch eine 5er- und eine 1er-Münze ersetzt werden könnten. I n1 < 2, da ansonsten zwei 1er-Münzen durch eine 2er-Münze ersetzt werden könnten. I ¬(n2 = 2 ∧ n1 = 1), da ansonsten die 2er- und 1er-Münzen durch eine 5er-Münze ersetzt werden könnten. Maximal kann also mit der kleinsten (den zwei kleinsten, den drei kleinsten) Münzsorte ein Betrag von 1 (4, 9) erreicht werden. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 11 / 13 Aufgabe 40 b) Beweisen Sie die Optimalität Ihres Algorithmus. Sei (n10 , n5 , n2 , n1 ) eine münz-minimale Auszahlung des Betrags b. Dann gilt: I n5 < 2, da ansonsten zwei 5er-Münzen durch eine 10er-Münze ersetzt werden könnten. I n2 < 3, da ansonsten drei 2er-Münzen durch eine 5er- und eine 1er-Münze ersetzt werden könnten. I n1 < 2, da ansonsten zwei 1er-Münzen durch eine 2er-Münze ersetzt werden könnten. I ¬(n2 = 2 ∧ n1 = 1), da ansonsten die 2er- und 1er-Münzen durch eine 5er-Münze ersetzt werden könnten. Maximal kann also mit der kleinsten (den zwei kleinsten, den drei kleinsten) Münzsorte ein Betrag von 1 (4, 9) erreicht werden. Daraus folgt: Die optimale Lösung ist eindeutig und der Algorithmus berechnet genau diese Lösung. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 11 / 13 Aufgabe 40 c) Bestimmen Sie die Laufzeit Ihres Algorithmus. Coin-Minimization(b) 1 COINS ← {10, 5, 2, 1} 2 for i ← 1 to jlength[COINS] k 3 4 5 do n ← b COINS[i] print n ’ Münzen mit Wertigkeit ’ COINS[i] b ← b − n · COINS[i] Sei c die Anzahl der verfügbaren Münzsorten. Dann ist die Laufzeit offensichtlich O(c). Im konkreten Fall ist c = 4, die Laufzeit also O(1). Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 12 / 13 Aufgabe 40 c) Bestimmen Sie die Laufzeit Ihres Algorithmus. Coin-Minimization(b) 1 COINS ← {10, 5, 2, 1} 2 for i ← 1 to jlength[COINS] k 3 4 5 do n ← b COINS[i] print n ’ Münzen mit Wertigkeit ’ COINS[i] b ← b − n · COINS[i] Sei c die Anzahl der verfügbaren Münzsorten. Dann ist die Laufzeit offensichtlich O(c). Im konkreten Fall ist c = 4, die Laufzeit also O(1). (All dieses gilt nur, wenn wir davon ausgehen, dass elementare Rechenoperationen in konstanter Zeit ausgeführt werden können - egal, wie groß die beteiligten Zahlen sind!) Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 12 / 13 Aufgabe 40 d) Die Europäische Zentralbank plant die Einführung von 4-Centmünzen. Arbeitet Ihre Greedy-Strategie dann immer noch optimal? Coin-Minimization’(b) 1 COINS ← {10, 5, 4, 2, 1} 2 for i ← 1 to jlength[COINS] k 3 4 5 do n ← b COINS[i] print n ’ Münzen mit Wertigkeit ’ COINS[i] b ← b − n · COINS[i] Nein, die Greedy-Strategie liefert hier nicht immer eine optimale Lösung. Aufruf Coin-Minimization’(8) liefert eine 5er-, eine 2er- und eine 1er-Münze. Optimal wären aber zwei 4er-Münzen. Sven Grothklags (University of Paderborn) DuA Übungsblatt 13 10. Juli 2006 13 / 13