Beweis: (durch Induktion über k) Induktionsanfang: k = 1 Da es sich

Werbung
Beweis: (durch Induktion über k)
Induktionsanfang: k = 1 Da es sich um einen einzelnen Knoten handelt, ist
die Höhe h = 0. Dann gilt für die Formel 2h ≤ k:
20 = 1 X
Induktionsvoraussetzung: Sei die Behauptung wahr für alle Bäume mit ≤
k − 1 Knoten.
Induktionsschluss: Zeige, dass die Behauptung für Bäume mit k Knoten gilt:
Sei T ein Baum mit k Knoten. Dann betrachtet man die VEREINIGE-Operation
bei der T entstanden ist.
T ist aus zwei Bäumen T1 und T2 entstanden: T1 hat k1 Elemente und Höhe h1
und T2 hat k2 Elemente und Höhe h2 .
Für die Höhe h von T gilt: h = max(h1 , h2 + 1).
Außerdem gilt für die Anzahl der Elemente von T: k = k1 + k2 und h1 ≥ h2 .
Jetzt betrachten wir die folgenden 2 Fälle:
1. Fall: h = h1
k |{z}
= k1 + k2 ≥ k1 ≥ 2h1 = 2h
|{z}
s.o.
I.V.
2. Fall: h = h2 + 1
Dann muss h1 = h2 gelten.
(Sonst müsste h2 < h1 gelten und damit wäre h nicht die Gesamthöhe.)
k |{z}
= k1 + k2 ≥ 2h1 + 2h2 = 2 ∗ 2h2 = 2h2 +1 = 2h
|{z}
s.o.
I.V.
Aufgrund des Höhenausgleichs hat die VEREINIGE-Operation O(1) (also konstante) und die FINDE-Operation O(h) = O(log(n)) Laufzeit.
(Die Höheninformation der Wurzel ist in konstanter Zeit aktualisierbar.)
Die Laufzeit der FINDE-Operation ist noch nicht zufriedenstellend, daher versuchen wir diese noch zu verbessern.
Im folgenden versuchen wir dies durch Pfadkompression zu erreichen.
58
3.2.1
Pfadkompression:
Bei der FINDE-Operation werden alle Knoten auf dem Pfad bis zur Wurzel auf”
gesammelt“ und direkt an die Wurzel angehangen. Dies verkürzt dann spätere
FINDE-Operationen.
Frage: Wie stark werden diese verkürzt?
Wenn man experimentell viele FINDE-Operationen mit diesem Prinzip durchführt,
dann lässt das Ergebnis vermuten, dass dies in konstanter Zeit möglich ist.
Dies stimmt aber nicht ganz. Man braucht O(f (n)) Zeit, wobei f eine Funktion
ist, die sehr langsam wächst (weniger als log(log(n))).
Analyse der Pfadkompression:
Zunächst definieren wir zwei Funktionen F, G : N → N mit den Eigenschaften:
F (0) = 1
F (i) = 2F (i−1) ∀i ≥ 1
G(n) = min {k|F (k) ≥ n}
Von den beiden Funktionen wächst eine sehr schnell und eine sehr langsam.:
i
F (i)
G(n)
n
0
1
1
0
1
2
2
1
2
4
3, 4
2
3
16
5, .., 16
3
4
65536
17, .., 65536
4
5
265536 (etwa 22000 Stellen)
65537, .., 265536 5
...
... ...
...
F wächst also sehr schnell. Man kann sich F als Stapel von zweien“ vorstellen:
”
(2(..)))))
(2(2
F (i) = 2| (2 {z
}
i 2en
G wächst extrem schwach, aber strebt nach ∞ für n → ∞. G wird auch als log ∗
bezeichnet. log ∗ entspricht der Anzahl der Anwendungen von log auf n bis man
einen Wert ≤ 1 erhält.
Im Mittel benötigen alle FINDE-Operationen log ∗ Zeit.
Wir betrachten nun folgende Situation:
Sei Si = {i} für alle i = 1, .., n.
Nun betrachten wir eine Folge σ von m FINDE- und höchstens n−1 VEREINIGEOperationen.
Wir definieren den Rang eines Knotens v in der Datenstruktur. Hierfür streichen wir die FINDE-Operationen aus σ und schauen uns nur die VEREINIGEOperationen an. σ 0 ist die Folge von VEREINIGE-Operationen.
59
Rang(v) = Höhe des Baumes Tv mit der Wurzel v nachdem σ 0 ausgeführt wurde.
(Die Höhe kann durch Höhenbalancierung höchstens log(n) betragen.)
Es gilt für alle Knoten v:
a) Der Baum Tv hat mindestens 2Rang(v) Knoten.
(Dies wurde bereits im Lemma gezeigt.)
b) Es gibt höchstens 2nr Knoten mit Rang r ∈ N.
(Dies folgt direkt aus 1.)
c) Alle Ränge sind ≤ log(n).
(Dies folgt aus dem Höhenausgleich und 2.)
d) Falls bei der Ausführung von σ (besteht aus VEREINIGE- und FINDEOperationen) irgendwann w Nachkomme von v (↔ w ist Element des
Unterbaumes mit Wurzel v) ist, dann ist der Rang(w) < Rang(v).
(Denn: falls w Nachkomme von v bei Ausführung von σ ist, dann ist er
das auch bei Ausführung von σ 0 . ⇒ Rang(w) < Rang(v)
Im nächsten Schritt teilen wir die Ränge in Gruppen auf.:
r → Gruppe G(r)
0, 1 → Gruppe 0
2 → Gruppe 1
3, 4 → Gruppe 2
5, .., 16 → Gruppe 3
Wir betrachten die Folge σ:
Jede VEREINIGE-Operation kostet O(1) Zeit. Die Kosten der FINDE-Operationen
verteilen sich auf die Knoten der Bäume und die FINDE-Operationen selbst (→
accounting, übersetzt“: Buchhalter-Analyse“):
”
”
Die Kosten für FINDE(i) sind proportional zur Länge des Weges von i zur
Wurzel. D.h. für jeden Knoten v ergeben sich konstante Kosten und diese werden angerechnet
60
1. der FINDE-Operation, falls v die Wurzel oder der Vater von v in einer
anderen Ranggruppe als v ist.
2. dem Knoten v sonst (d.h. G(Rang(V ater(v))) = G(Rang(v))).
Mit Fall 1 gilt, dass keine FINDE-Operation mit mehr als O(G(n)) Kosten belastet wird.
Bergründung:
Die Ränge sind auf dem Weg von i zur Wurzel aufsteigend (aus d) folgt, dass
die Folge der Ränge streng monoton wächst) und die Ranggruppen ändern sich
höchstens G(n) mal (sogar nur G(log(n)), aber G(n) und G(log(n)) unterscheiden sich nur um 1).
Mit Fall 2 gilt: v ist selbst nicht die Wurzel und wird nach oben bewegt. v
wird Kind eines Knotens mit Rang größer dem Rang seines bisherigen Vaters (nach d)). ⇒ Falls g := G(RAN G(v)) > 0 gilt, dann kann v höchstens
F (g) − F (g − 1)
mal belastet werden.
|
{z
}
Anzahl der Ränge in Gruppe g
Gesamtkosten dieser Art:
N (g) :=Anzahl der Knoten in der Ranggruppe g
FP
(g)
n
1 1
n
N (g) ≤
= 2F (g−1)+1
∗ (1 + + + ...) ≤
r
2
r=F (g−1)+1 |{z}
| 2 {z 4
}
=
n
F (g)
≤2
nach b)
Jeder Knoten wird höchsten F (g)
n
2F (g−1)
−F (g − 1)
| {z }
mal belastet.
kann weggelassen werden
Also sind die Kosten für jede Ranggruppe G insgesamt ≤ F n(g) ∗ F (g) = n.
Insgesamt sind die Kosten für jede FINDE-Operation für Fall 1 O(G(n)) und
für Fall 2 O(n ∗ G(n)).
Zusammenfassend ergibt sich der folgende
Satz:
Ausgehend von Si = {i} für i = 1, .., n werde eine Folge σ von m FINDE- und
beliebig vielen VEREINIGE-Operartionen mit Höhenausgleich und Pfadkompression ausgeführt.
Dann ist die Laufzeit insgesamt O(m ∗ log ∗ (n) + n ∗ log ∗ (n)). (Die Kosten der
VEREINIGE-Operationen sind konstant und fallen hierbei nicht ins Gewicht.)
61
O(m ∗ log ∗ (n) + n ∗ log ∗ (n)) ist die amortisierte Laufzeit“, d.h. die einzelnen
”
Operationen können mehr kosten, aber die Gesamtfolge ist günstig pro Operation.
Diese Laufzeit ist nah an einer konstanten Laufzeit.
Allerdings geht es noch besser!
Satz: (Ohne Beweis)
Sei wie oben Si = {i} für i = 1, .., n. Es werde eine Folge σ von m FINDE- und
n VEREINIGE-Operartionen mit Höhenausgleich und Pfadkompression ausgeführt, die O(m
wobei
∗ α(m, n)) Zeit
brauchen,
)
>
log(n)
, wobei A die Ackermann-Funktion
α(m, n) = min z ≥ 1, A(z, 4 ∗ m
n
sei.
Es handelt sich hier ebenfalls um eine amortisierte Laufzeit.
Ackermann-Funktion:
A : N X N → N definiert durch:
A(0, 0) = 0
A(i, 0) = 1 ∀i ∈ N
A(0, x) = 2 ∗ x ∀x ∈ N
A(i + 1, x) = A(i, A(i + 1, x − 1))
Schauen wir uns num mal einige Werte der Ackermann-Funktion an.
i\x 0 1 2
3
4
5
0
0 2 4
6
8
10
1
1 2 4
8
16
32
1 2 4
16
65536 26 5536
2
3
1 2 4 65536
A(1, x) = A(0, A(1, x − 1)) = 2 ∗ A(1, x − 1)
A(2, x) = A(1, A(2, x − 1)) = 2A(2,x−1)
α ist die inverse Ackermann-Funktion“ und wächst gering, strebt aber nach ∞
”
für n → ∞.
62
Herunterladen