Wörterbücher

Werbung
Algorithmen und Datenstrukturen SS09
Foliensatz 9
Michael Brinkmeier
Technische Universität Ilmenau
Institut für Theoretische Informatik
Sommersemester 2009
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 1 / 63
Wörterbücher
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 2 / 63
Wörterbücher
Ein Wörterbuch (Englisch: Dictionary, Synonym: dynamische Abbildung) ist
eine partielle Abbildung von einer Schlüsselmenge U in einen Wertebereich R
(engl. range).
Manchen Schlüsseln x ∈ U soll ein Wert f (x) ∈ R zugeordnet werden.
Man kann ein Wörterbuch als eine Menge von Paaren in D = U × R
auffassen, wobei jedes x ∈ U in höchstens einem Paar vorkommt.
Ein Wörterbuch soll es ermöglichen
nachzusehen, ob und welcher Wert einem Schlüssel zugeordnet ist
(lookup)
Schlüssel-Wert-Paare einzufügen, bzw. zu ersetzen (insert)
ein Paar anhand des Schlüssels zu löschen (delete)
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 3 / 63
Die Signatur Dictionary
Die Signatur Dictionary
Sorten:
Keys
Elements
Dictionary
Operationen:
empty: → Dictionary
lookup: Dictionary × Keys → Elements
insert: Dictionary × Keys × Elements → Dictionary
delete: Dictionary × Keys → Dictionary
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 4 / 63
Die Modellalgebra
Die Modellalgebra für Dictionary
Keys =
ˆ die nichtleere Menge U aller Schlüssel
Elements =
ˆ
Dictionary =
ˆ
die nichtleere Menge R aller Werte
{f | f : S → R für ein endliches S ⊆ U}
Für die Operationen nutzen wir die relationale Formulierung partieller
Abbildungen:
Ist f eine Abbildung von S nach R, dann kann f als Teilmenge von U × R
aufgefasst werden, so dass für alle x ∈ U höchstens ein r ∈ R mit
(x, r ) ∈ f existiert.
Die Menge aller Schlüssel x, für die ein Wert r ∈ R mit (x, r ) ∈ f existiert,
heisst Definitionsbereich D(f ), d.h.
D(f ) := {x ∈ U | ∃r ∈ R : (x, r ) ∈ f } .
Für x ∈ D(f ) ist f (x) das eindeutig bestimmte r ∈ R mit (x, r ) ∈ f .
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 5 / 63
Die Modellalgebra
Die Modellalgebra für Dictionary (Fortsetzung)
empty() := ∅
(
lookup(f , x) :=
f (x)
⊥
falls x ∈ D(f )
sonst
delete(f , x) :=
(
f \ {(x, f (x))}
⊥
insert(f , x, r ) :=
(
delete(f , x) ∪ {(x, r )}
f ∪ {(x, r )}
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 6 / 63
falls x ∈ D(f )
sonst
falls x ∈ D(f )
sonst
Ein Beispiel
U = Seq({a, . . . , z, A, . . . , Z }) = R
Befehl
Wörterbuch
empty()
∅
Ausgabe
insert(Homer , zuHause) {(Homer , zuHause)}
insert(Marge, zuHause)
{(Homer , zuHause), (Marge, zuHause)}
insert(Bart, Schule)
{(Homer , zuHause), (Marge, zuHause),
(Bart, Schule)}
insert(Lisa, Schule)
{(Homer , zuHause), (Marge, zuHause),
(Bart, Schule), (Lisa, Schule)}
lookup(Homer )
”
zuHause
lookup(Maggie)
”
⊥
insert(Homer , AKW )
{(Homer , AKW ), (Marge, zuHause),
(Bart, Schule), (Lisa, Schule)}
lookup(Homer )
delete(Lisa)
”
AKW
{(Homer , AKW ), (Marge, zuHause),
(Bart, Schule)}
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 7 / 63
Implementierungen
Listen/Arrays mit Einträgen aus U × R
mit Wiederholung: das erste Auftreten des Schlüssels zählt
ohne Wiederholung
Wenn U = {1, . . . , N} kann ein Array A[1 . . . N] mit Einträgen aus
R ∪ {⊥} verwendet werden.
Hashtabellen (später)
Suchbäume
Die Operationen der Array/Listen-Implementierungen benötigen die gleiche
Zeit wie die für Sets.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 8 / 63
Binäre Suchbäume
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 9 / 63
Binäre Suchbäume
(Binäre) Suchbäume implementieren den Datentyp Dictionary auf einer
total geordneten Schlüsselmenge (U, <).
Beispiel
G
4
E
7
B
9
Jeder Knoten v enthält zwei Einträge:
K
2
I
4
D
2
M
11
key(v ) ∈ U ist der Schlüssel
data(v ) ∈ R ist der Wert, bzw. sind die
Daten (oft Zeiger oder Referenz)
Def (f ) = {G , E , K , B, I , M, D} und f (B) = 9,
f (D) = 2, f (E ) = 7 . . .
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 10 / 63
Binäre Suchbäume
Definition (Binärer Suchbaum)
(U, <) sei eine total geordnete Schlüsselmenge und R ein Wertebereich.
Ein Binärbaum T mit Einträgen aus U × R ist ein binärer Suchbaum
((U, R)-BSB oder (U, R)-BST), wenn für jeden Knoten v in T folgendes
gilt:
Ist w im linken Unterbaum von Tv , dann gilt key(w ) < key(v ).
Ist w im rechten Unterbaum von Tv , dann gilt key(w ) > key(v ).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 11 / 63
Binäre Suchbäume
Definition (Binäre Suchbäume – rekursive Definition)
1
2
ist ein (U, S)-BSB mit Schlüsselmenge S = ∅
Wenn x ∈ U und r ∈ R
und wenn T1 und T2 (U, R)-BSB sind mit Schlüsselmengen S1 und S2 ,
und wenn key(v ) < x für alle Knoten v ∈ S1
und wenn key(v ) > x für alle v ∈ S1
dann ist (T1 , (x, r ), T2 ) ein (U, R)-BSB.
3
Nichts sonst ist ein (U, R)-BSB.
Im zweiten Fall setzen wir key(T ) := x und data(T ) := t.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 12 / 63
Inorder-Durchlauf auf Binäresn Suchbäumen
Proposition
Wenn man die Einträge eines (U, R)-BSB in Inorder-Reihenfolge ausgibt,
dann sind sie aufsteigend nach den Schlüsseln sortiert.
Beweisskizze
Die Behauptung kann mittels Induktion über den rekursiven Aufbau von
binären Suchbäumen bewiesen werden.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 13 / 63
Implementierung von BSB
T:
(G,4)
(E,3)
(K,7)
(B,1)
(I,5)
(D,2)
(M,8)
(J,6)
Man kann einen (U, R)-BSB als Binärbaum mit leeren äußeren Knoten
implementieren.
Die Knoten enthalten Paare aus U × R als Eintrag.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 14 / 63
Suche in BSB
lookup
Eingabe: (U, R)-BSB T und x ∈ U
if T == then return ⊥;
// Leerer Baum
if T = (T1 , (x, r ), T2 ) then return r und Zeiger auf T ; // in der Wurzel
if T = (T1 , (y , r ), T2 ) then
if x < y then return lookup(T1 , x);
if x > y then return lookup(T2 , x);
// linker Unterbaum
// rechter Unterbaum
end
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 15 / 63
Suche in BSB
Beispiel
H
D
K
lookup(Q)
B
b
b
F
b
W
b
O
b
Y
S
b
Q
b
Z
b
V
U
b
b
b
b
Q
Q
Q
Q
Q
Q
b
b
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 16 / 63
>H
>K
<W
>O
<S
=Q
⇒
⇒
⇒
⇒
⇒
⇒
rechts
rechts
links
rechts
links
gefunden
Suche in BSB
Beispiel
H
D
B
K
b
b
F
b
lookup(X )
W
b
O
b
S
b
Z
b
Q
b
X >H
X >K
X >W
X <Y
Blatt
Y
V
U
b
b
b
b
⇒
rechts
⇒
rechts
⇒
rechts
⇒
links
⇒
nicht gefunden
b
b
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 17 / 63
Korrektheit und Zeitaufwand von lookup
Die Korrektheit ergibt sich direkt aus der Struktur.
Formal läßt sie sich über den rekursiven Aufbau von binären Suchbäumen
beweisen.
Wenn x in Knoten vx ist, wird für jeden Knoten auf dem Weg von der
Wurzel zu vx konstante Zeit (O(1)) benötigt.
Es gibt d(vx ) ≤ d(T ) solche Knoten.
Wenn x nicht in T vorhanden ist, dann endet die Suche in einem externen
Knoten lx .
Wiederum benötigt man konstante Zeit für jeden der d(lx ) ≤ d(T ) + 1
Knoten auf dem Weg von der Wurzel zu lx .
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 18 / 63
Einfügen in BSB
insert
Eingabe: (U, R)-BSB T , x ∈ U und r ∈ R
if T == then Erzeuge einen neuen Knoten T neu mit Eintrag (x, r ) ;
if T = (T1 , (x, r ′ ), T2 ) then T neu = (T1 , (x, r ), T2 );
if T = (T1 , (y , r ), T2 ) then
if x < y then
T1neu = insert(T1 , x, r );
T neu = (T1neu , (y , r ′ ), T2 );
end
if x > y then
T2neu = insert(T2 , x, r );
T neu = (T1 , (y , r ′ ), T2neu );
end
end
return T neu
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 19 / 63
Einfügen in BSB
Beispiel
H
insert(E )
D
B
b
F
E
b
E <H
E >D
E <F
Blatt
K
W
b
O
b
⇒
⇒
⇒
⇒
links
rechts
links
neuer Knoten
Y
insert(N)
b
b
N
S
Q
b
Z
b
V
U
b
b
b
b
b
N>H
N>K
N<W
N<O
Blatt
b
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 20 / 63
⇒
rechts
⇒
rechts
⇒
links
⇒
links
⇒
neuer Knoten
Korrektheit und Zeitaufwand von insert
Man beweist durch Induktion über den rekursiven Aufbau von T , dass
insert(T , x, r ) einen binären Suchbaum T neu erzeugt, der die Funktion
insert(f , x, r ) darstellt.
Wenn der Schlüssel x bereits in Knoten vx vorhanden ist, dann benötigt man
Zeit O(1) für jeden der d(vx ) ≤ d(T ) Knoten auf dem Weg zu vx .
Wenn der Schlüssel x noch nicht vorhanden ist, dann benötigt man Zeit
O(1) für jeden Knoten auf dem Weg zu dem Blatt lx in dem (x, r ) eingefügt
wird.
Es gibt d(lx ) ≤ d(T ) + 1 solcher Knoten.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 21 / 63
Löschen in BSB
delete
Eingabe: (U, R)-BSB T und x ∈ U
if T == then Tue nichts;
if T = (T1 , (y , r ), T2 ) und y 6= x then
if x < y then
T1neu = delete(T1 , x);
T neu = (T1neu , (y , r ), T2 );
end
if x > y then
T2neu = delete(T2 , x);
T neu = (T1 , (y , r ′ ), T2neu );
end
end
if T = (T1 , (x, r ), T2 ) then Lösche die Wurzel;
return T neu
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 22 / 63
Löschen der Wurzel
1. Fall:
T1 = x
b
⇒
T2
⇒
T1
T2
3. Fall: T2 = x
b
T1
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 23 / 63
Löschen der Wurzel
xy
3. Fall:
T1 6= und T2 6= y
T2
T1
Suche den Eintrag (y , r ′ ) in T2 mit minimalem Schlüssel y .
Lösche ihn aus T2 und kopiere (y , r ′ ) in die Wurzel (bzw. aktualisiere
Zeiger).
Frage
Wie findet und löscht man den Eintrag mit minimalem Schlüssel?
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 24 / 63
Lösche die Wurzel eines BSB
deleteRoot
Eingabe: (U, R)-BSB T = (T1 , (x, r ), T2 )
if T1 == then T neu = T2 ;
if T2 == then T neu = T1 ;
if T1 ! = und T2 ! = then
Suche in T2 den Eintrag (y , r ′ ) mit minimalem y ;
T2neu = deleteMin(T2 , y );
T neu = (T1 , (y , r ′ ), T2neu );
end
return T neu
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 25 / 63
Extraktion des Minimums
deleteMin
Eingabe: (U, R)-BSB T = (T1 , (x, r ), T2 )
Ausgabe: Der Baum T neu ohne das Minimum und den Eintrag (y , r ′ ) mit
minimalem Schlüssel
if T1 == then T neu = T2 , (y , r ′ ) = (x, r );
if T1 ! = then
(T neu , (y , r ′ )) = deleteMin(T1 )
end
return T neu und (y , r ′ )
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 26 / 63
Extraktion des Minimums
Prinzipielles Vorgehen: Gehe nach Links, bis das linke Kind ein leerer
äußerer Knoten () ist.
Der jeweilige Knoten hat kein linkes Kind.
v
(y,r’)
Löschen von v führt zum Hochrutschen“ von T2
”
T2
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 27 / 63
Löschen in BSB
Beispiel
H
D
K
delete(Q)
B
b
b
F
b
W
b
O
b
Y
S
b
Z
b
V
b
U
b
b
b
Q
Q
Q
Q
Q
Q
b
b
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 28 / 63
>H
>K
<W
>O
<S
=Q
⇒
⇒
⇒
⇒
⇒
⇒
rechts
rechts
links
rechts
links
löschen
Löschen in BSB
Beispiel
H
D
K
B
F
W
b
delete(K )
b
b
O
b
b
Y
S
b
b
Z
b
Q
V
b
U
b
b
K >H
K =K
⇒
⇒
rechts
löschen
⇒
löschen
b
b
b
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 29 / 63
Löschen in BSB
Beispiel
HO
D
B
W
b
b
F
b
delete(H)
O
b
S
b
V
U
b
b
deleteMin(W )
Z
b
Q
b
H=H
Y
b
b
O nach H kopieren Knoten löschen
b
b
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 30 / 63
Korrektheit von delete
Lemma
delete(T , x) erzeugt einen binären Suchbaum T neu , der die Funktion
delete(fT , x) darstellt.
Beweisskizze
Die Behauptung wird mittels Induktion über den rekursiven Aufbau von
Binärbäumen bewiesen.
Dabei muss man gesondert zeigen, dass die Prozedur deleteMin(T ) auf
einem nichtleeren Baum das verlangte Resultat liefert. Das kann man
ebenfalls per Induktion über den rekursiven Aufbau machen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 31 / 63
Zeitaufwand von delete
Wenn x im Knoten vx vorhanden ist und eines seiner Kinder leer ist,
dann benötigt das Löschen lediglich Zeit O(1) für jeden der
d(vx ) ≤ d(T ) Knoten auf dem Weg.
Wenn x im Knoten vx vorhanden ist und beide Kinder nicht leer sind,
benötigen wir O(1) Zeit für jeden der d(vx ) Knoten auf dem Weg zu vx .
Außerdem benötigen wir O(1) Zeit für die d(u) − d(vx ) Knoten auf
dem Weg von vx zum Inorder-Nachfolger u (Minimum unter vx ).
Insgesamt ergibt sich also eine Laufzeit von O(d(T )).
Wenn x nicht im Baum vorhanden ist, dann Kostet es Zeit O(1) für
jeden Knoten auf dem Weg zum Blatt lx bei dem dies festgestellt wird.
Davon gibt es insgesamt d(lx ) ≤ d(T ) + 1 Stück.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 32 / 63
Der Zeitaufwand
Wie wir gesehen haben, ist die Zeit, die für einen Aufruf von insert,
lookup oder delete benötigt wird in O(d(T )).
Im Folgenden wollen wir uns exemplarisch die lookup-Operation genauer
ansehen.
Ist x vorhanden, ist die Laufzeit in O(d(vx )), wobei vx der innere Knoten
von T ist, der x enthält.
Ist x nicht vorhanden, ist die Laufzeit in O(d(lx )), wobei lx der äußere
Knoten ist, zu dem uns die Suche nach x führt.
Um ein Gefühl für die mittlere Laufzeit zu erhalten, ist es also nötig die
Tiefen der inneren und äußeren Knoten zu untersuchen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 33 / 63
Totale innere und äußere Weglänge von
Binärbäumen
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 34 / 63
Die totale innere Weglänge
Frage
Wieviele Knoten werden insgesamt besucht, wenn man zu jedem inneren
Knoten einmal hinläuft?
Beispiel
1 + 2 + 2 + 3 + 3 + 3 + 4 + 4 + 4 + 5 = 31
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 35 / 63
Die totale innere Weglänge
Definition (Totale innere Weglänge)
Die totale innere Weglänge (total inner path length) ist definiert als
X
TIPL(T ) :=
d(v ).
v∈V
Damit ist die Gesamtzahl der besuchten Knoten n + TIPL(T ).
Die mittlere Weglänge ist n1 TIPL(T )
Die mittlere Anzahl besuchter Knoten ist 1 + n1 TIPL(T )
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 36 / 63
Die totale äußere Weglänge
Frage
Wieviele innere und äußere Knoten werden insgesamt besucht, wenn man zu
jedem äußeren Knoten einmal hinläuft?
Beispiel
3 + 4 + 4 + 4 + 5 + 5 + 5 + 5 + 5 + 6 + 6 = 52
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 37 / 63
Die totale äußere Weglänge
Definition (Totale äußere Weglänge)
Die totale äußere Weglänge (total external path length) ist definiert als
X
TEPL(T ) :=
d(l).
l∈L
Die Gesamtzahl der besuchten Knoten ist (n + 1) + TEPL(T )
Die Mittlere äußere Weglänge ist
1
n+1 TEPL(T )
Die Mittlere Anzahl der besuchten Knoten ist 1 +
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 38 / 63
1
n+1 TEPL(T )
Totale äußere und innere Weglänge
Proposition
Für jeden Binärbaum mit n inneren Knoten gilt:
TEPL(T ) = TIPL(T ) + 2n
Beweis
Induktion über die Anzahl n innerer Knoten des Binärbaumes
Induktionsanfang: T = (z), d.h. n = 0.
Es gilt TIPL((z)) = 0 = TEPL((z)), was die Behauptung beweist.
Induktionsannahme: Für n > 0 gilt die Behauptung gilt für alle Bäume
mit weniger als n inneren Knoten.
...
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 39 / 63
Totale äußere und innere Weglänge
Beweis (Fortsetzung)
Induktionsschritt: T = (T1 , x, T2 )
ni sei die Anzahl innerer Knoten in Ti für i = 1, 2. Offensichtlich gilt
n = n1 + n2 + 1 und somit n1 , n2 < n.
Nach Induktionsbehauptung gilt somit
TEPL(Ti ) = TIPL(Ti ) + 2ni für i = 1, 2.
Da die Tiefe der externen Knoten in T um eins höher ist, als in den
Teilbäumen, gilt
TEPL(T ) = (TEPL(T1 ) + (n1 + 1)) + (TEPL(T2 ) + (n2 + 1)).
Das gleiche gilt für die inneren Knoten, und somit
TIPL(T ) = (TIPL(T1 ) + n1 ) + (TIPL(T2 ) + n2 ).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 40 / 63
Totale äußere und innere Weglänge
Beweis (Fortsetzung)
Damit gilt
TEPL(T ) − TIPL(T )
= (TEPL(T1 ) − TIPL(T1 )) + (TEPL(T2 ) − TIPL(T1 )) + 2
IV
= 2n1 + 2n2 + 2 = 2n
(1)
Unser nächstes Ziel ist es nachzuweisen, dass die mittlere Weglänge in
Binärbäumen mindestens logarithmisch mit der Knotenzahl wächst.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 41 / 63
Was Sie schon immer über Binärbäume wissen
wollten ...
Lemma
Es sei L die Menge der externen Knoten in einem Binärbaum T . Dann gilt:
X
2−d(l) = 1.
l∈L
Beispiel
1 1 1 1
1
1
1
1
1
1
1
+ + + +
+
+
+
+
+
+
=1
4 8 8 8 16 16 16 16 16 32 32
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 42 / 63
Was Sie schon immer über Binärbäume wissen
wollten ...
Beweis
Wie in einem Codierungsbaum, markieren wir an jedem inneren Knoten die
Kante zum linken Kind mit 0 und die zum rechten Kind mit 1.
Jedem Blatt l ∈ L entspricht dann eine eindeutige Bitfolge ωl = b1 . . . bd(l) .
Die Bitfolgen für alle Blätter sind präfixfrei, d.h. kei ωl ist Präfix der Folge
ωl ′ für ein anderes Blatt l ′ .
Sei D = d(T ) die Tiefe des tiefsten Blatts.
Jedes ωl kann man auf 2D−d(l) Arten zu einer Bitfolge der Länge D
verlängern. Oder anders ausgedrückt: ωl ist Präfix von 2D−d(l) Bitstrings der
Länge D.
Außerdem hat jeder Bitstring der Länge D genau ein ωl als Präfix.
...
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 43 / 63
Was Sie schon immer über Binärbäume wissen
wollten ...
Beweis (Fortsetzung)
Zählen wir für jedes Blatt l die Anzahl aller Bitstrings der Länge D, die ωl
als Präfix haben, erhalten wir alle möglichen, d.h.
X
X
D
D−d(l)
D
2 =
2
=2
2−d(l) ,
l∈L
l∈L
was die Behauptung beweist.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 44 / 63
Was Sie schon immer über Binärbäume wissen
wollten ...
Proposition
T sei ein Binärbaum mit N = n + 1 externen Knoten. Dann gilt
TEPL(T ) ≥ N log N.
Beweis
Die Logarithmusfunktion ist konkav, d.h. für M ≥ 2 und a1 , . . . , aM > 0 gilt:
!
M
M
X
1 X
1
ai ≥
log(ai ).
log
M
M
i =0
i =1
...
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 45 / 63
Was Sie schon immer über Binärbäume wissen
wollten ...
Beweis (Fortsetzung)
1.4
log x
Sekante
1.2
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
0.8
1
1.2
1.4
1.6
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 46 / 63
1.8
2
2.2
Was Sie schon immer über Binärbäume wissen
wollten ...
Beweis (Fortsetzung)
Mit m = N = n + 1 und al = 2−d(l) für l ∈ L ergibt sich
!
X
1
1
1 X
−d(l)
log
2
−d(l) = − TEPL(T ).
≥
N
N
N
l∈L
l∈L
Das führt zu



 X

1
−d(l) 
2
TEPL(T ) ≥ −N log 
 = N log N.
N

 l∈L
| {z }
=1
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 47 / 63
Was Sie schon immer über Binärbäume wissen
wollten ...
Fazit
Die mittlere äußere Weglänge eines Binärbaumes mit N äußeren Knoten ist
≥ log(N).
Da TEPL(T ) = TIPL(T ) + 2n, ergibt sich
TIPL(T ) = TEPL(T ) − 2n ≥ (n + 1) log(n + 1) − 2n ≥ n(log n − 2).
Fazit
Die mittlere innere Weglänge eines Binärbaumes mit n inneren Knoten ist
≥ log(n) − 2.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 48 / 63
Zufällig erzeugte binäre Suchbäume
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 49 / 63
Zufällig erzeugte binäre Suchbäume
T wird auf die folgende Art zufällig erzeugt:
Starte mit einem leeren Baum.
Füge alle Schlüssel aus der Menge S = {x1 , x2 , . . . , xn } in zufälliger
1
.
Reihenfolge ein, d.h. jede Reihenfolge hat die Wahrscheinlichkeit n!
Dann ist der erwartete (über die Eingabereihenfolgen gemittelte) mittlere
(über n Schlüssel x ∈ S gemittelte) Aufwand für lookup(x):
1+
A(n)
n
mit
A(n) = E (TIPL(T )).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 50 / 63
Die erwartete innere Weglänge
Wie kann A(n) = E (TIPL(T )) abgeschätzt werden?
Offensichtlich gilt A(0) = 0, denn TIPL() = 0.
A(1) = 0, denn der Baum hat nur einen inneren Knoten mit Tiefe 0.
Außerdem A(2) = 1, denn in diesem Fall ist TIPL(T ) = 1.
b
b
b
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 51 / 63
Die erwartete innere Weglänge
Für n = 3 gibt es 6 Enfügereihenfolgen für {x1 , x2 , x3 } = {1, 2, 3}.
123
132
1
1
2
3
3
312
321
3
3
1
2
2
1
2
213
231
2
2
3
A(3) =
1
1
TIPL = 2
3
1
8
· (4 · 3 + 2 · 2) = .
6
3
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 52 / 63
TIPL = 3
Eine Rekursionsformel
Wenn xi der erste eingefügte Schlüssel ist, dann enthält der linke Unterbaum
i − 1 Schlüssel und der rechte n − i.
xi
x1 , . . . , xi −1
xi +1 , . . . , xn
Die Unterbäume sind selbst zufällig erzeugte binäre Suchbäume.
Da der Weg in T zu jedem der n − 1 Knoten in den beiden Unterbäumen um
eins Länger ist, gilt
TIPL(T ) = (i − 1) + TIPL(T1 ) + (n − i) + TIPL(T2 )
= (n − 1) + TIPL(T1 ) + TIPL(T2 ).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 53 / 63
Eine Rekursionsformel
Für den Erwartungswert gilt dann:
E (TIPL(n) | falls xi als erster ) = (n − 1) + A(i − 1) + A(n − i)
Da jeder Schlüssel mit der Wahrscheinlichkeit
ergibt sich
1
n
als erster eingefügt wird,
n
1X
A(n) =
E (TIPL(n) | falls xi als erster )
n
=
1
n
i =1
n
X
((n − 1) + A(i − 1) + A(n − i))
i =1
n
1X
= (n − 1) +
(A(i − 1) + A(n − i)) .
n
i =1
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 54 / 63
Eine Rekursionsformel
Umordnen und Ausnutzen von A(0) = 0 ergibt
n−1
2X
A(n) = (n − 1) +
A(i)
n
i =1
Man erhält
A(1) = (1 − 1) +
A(2) = (2 − 1) +
A(3) = (3 − 1) +
A(4) = (4 − 1) +
A(5) = (5 − 1) +
2
1
2
2
2
3
2
4
2
5
·0
=0
·0
=1
8
3
8
29
· (0 + 1 + )
=
3
6
8 29
37
· (0 + 1 + + )=
3
6
5
· (0 + 1)
=
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 55 / 63
Eine Rekursionsformel
Um eine geschlossene Darstellung von A(n) zu erhalten, stellen wir zuerst
einen direkten Zusammenhang zwischen A(n) und A(n − 1) her.
Multiplikation mit n ergibt:
nA(n) = n(n − 1) + 2 ·
n−1
X
A(i)
i =1
und für n − 1:
(n − 1)A(n − 1) = (n − 1)(n − 2) + 2 ·
n−2
X
A(i)
i =1
Wie man sieht, kommen alle Terme für i ≤ n − 2 in beiden Ausdrücken vor.
Subtraktion führt daher zu
nA(n) − (n − 1)A(n − 1) = n(n − 1) − (n − 1)(n − 2) + 2 · A(n − 1)
= 2(n − 1) + 2 · A(n − 1).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 56 / 63
Eine Rekursionsformel
n · A(n) − (n − 1) · A(n − 1) = 2(n − 1) + 2 · A(n − 1)
ist äquivalent zu
n · A(n) − (n + 1) · A(n − 1) = 2(n − 1)
Division durch n(n + 1) ergibt
A(n − 1)
2(n − 1)
A(n)
−
=
.
n+1
n
n(n + 1)
Mittels Z (n) :=
A(n)
n+1
erhält man
Z (0) = 0
Z (n) − Z (n − 1) =
2(n − 1)
n(n + 1)
für n ≥ 1.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 57 / 63
Eine Rekursionsformel
Z (n) = Z (n − 1) +
2(n − 1)
;
n(n + 1)
Z (0) = 0
Für n ≥ 1 ergibt sich induktiv
n
X
2(i − 1)
Z (n) =
i(i + 1)
i =1
n
X
2(i + 1) − 4
i(i + 1)
i =1
n X
4
2
−
.
=
i
i(i + 1)
=
i =1
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 58 / 63
Eine Rekursionsformel
Z (n) =
n X
2
4
−
i
i(i + 1)
i =1
Mit
Hn =
n
X
1
i =1
und
n
X
i =1
n
X
1
=
i(i + 1)
i =1
1
1
−
i
i +1
=
i
n
X
1
i =1
gibt dies
Z (n) = 2Hn − 4 +
i
−
n+1
X
1
i =2
4
.
n+1
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 59 / 63
Eine Rekursionsformel
Z (n) = 2Hn − 4 +
4
n+1
Mit der Definition von Z (n) ergibt sich
A(n) = 2(n + 1)Hn − 4(n + 1) + 4
Die erwartete mittlere Knotentiefe ist also
A(n)
Hn
= 2Hn − 4 + 2 .
n
n
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 60 / 63
i
=1−
1
n+1
Eine Rekursionsformel
A(n)
Hn
= 2Hn − 4 + 2
n
n
Aus der Übung wissen wir
ln(n) < ln(n + 1) ≤ Hn ≤ 1 + ln n
für n ≥ 2
und somit
2 ln n − 4 + 2
ln n
A(n)
1 + ln n
<
≤ 2(1 + ln n) − 4 + 2
.
n
n
n
Da für n → ∞ der letzte Term gegen 0 geht, ergibt sich
2 ln n − 4 + o(1) <
A(n)
≤ 2 ln n − 2 + o(1).
n
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 61 / 63
Fazit
In zufällig erzeugten binären Suchbäumen ist die erwartete mittlere
Knotentiefe logarithmisch, d.h. A(n)
n ∈ Θ(log n).
Konsequenz
Die erwartete mittlere Laufzeit von lookup, insert und delete liegt in
Θ(log n).
Da die minimale Tiefe in Ω(log n) liegt, ist die erwartete Laufzeit
asymptotisch optimal.
In der Regel ist die Einfügereihenfolge nicht zufällig.
Ungünstig sind partiell geordnete Reihenfolgen, da dann tiefe Teilbäume
entstehen.
Häufiges Löschen mit deleteMin zerstört die Balancierung, da nur aus
dem linken Teilbaum Knoten entfernt werden.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 62 / 63
Herunterladen