13. Übung

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