Prof. Dr. Burkhard Monien Paderborn, den 03. Juli 2006 Abgabe 10. Juli 2006, 11 Uhr, Kästen Flur D3 Übungen zur Vorlesung Datenstrukturen und Algorithmen SS 2006 Blatt 13 AUFGABE 39 (12 Punkte): Der jüngste gemeinsame Vorfahre (least common ancestor) zweier Knoten u und v eines (allgemeinen) Baumes T ist der Knoten w, der sowohl Vorfahre von u als auch von v ist und der die größte Tiefe in T besitzt. Der folgende Algorithmus berechnet bei Eingabe eines Baumes T und einer Menge von (ungeordneten) Knotenpaaren P = {{u, v}} zu jedem Paar seinen jüngsten gemeinsamen Vorfahren in T . Dabei gehen wir davon aus, dass am Anfang color[u] = W HIT E für alles Knoten u des Baumes ist und der Algorithmus mit LCA(root[T ]) aufgerufen wird. LCA(u) 1 2 3 4 5 6 7 8 9 10 a Make-Set(u) ancestor[Find-Set(u)] ← u b c d for alle Kinder v von u do LCA(v) e f g h i Union(u, v) ancestor[Find-Set(u)] ← u color[u] ← BLACK k l for alle Knoten v mit {u, v} ∈ P do if color[v] = BLACK then print ’LCA von ’ u ’ und ’ v ’ ist ’ ancestor[Find-Set(v)] j a) Illustrieren Sie die Arbeitsweise von LCA(a) anhand des gegebenen Baumes auf den Knotenpaaren P = {{b, h}, {c, c}, {d, k}, {j, l}}. Geben Sie dazu für jede Ausgabe in Zeile 10 die aktuelle Menge der schwarzen Knoten, den Inhalt des ancestor-Arrays und den Inhalt der Union-Find-Datenstruktur an. Benutzen Sie dazu die in der Vorlesung vorgestellte Implementierung der Union-Find-Datenstruktur. b) Zeigen Sie, dass Zeile 10 des Algorithmus für jedes Paar {u, v} ∈ P genau einmal ausgeführt wird. 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. (Die Wurzel des Baumes besitzt dabei Tiefe 0.) d) Zeigen Sie, dass der Algorithmus LCA für jedes Paar {u, v} ∈ P den jüngsten gemeinsame Vorfahren ausgibt. e) Bestimmen Sie die Laufzeit von LCA, wenn die Union-Find-Datenstruktur aus der Vorlesung verwendet wird. AUFGABE 40 (12 Punkte): 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. a) Entwerfen Sie einen Greedy-Algorithmus (in Pseudocode), der das Problem MünzMinimierung optimal löst. b) Beweisen Sie die Optimalität Ihres Algorithmus. c) Bestimmen Sie die Laufzeit Ihres Algorithmus. d) Die Europäische Zentralbank plant die Einführung von 4-Centmünzen. Arbeitet Ihre Greedy-Strategie dann immer noch optimal? Beweisen Sie Ihre Aussage.