5 Bäume

Werbung
Praktische Informatik I - Algorithmen und Datenstrukturen
5
Wintersemester 2006/07
Bäume
5.1
Suchbäume
Sei T = (V; E ) ein geordneter binärer Wurzelbaum.
Sei s : V ! S eine Abbildung der Knotenmenge V in eine vollständig
geordnete Schlüsselwertmenge S .
T
heißt (schwach) sortiert, g.d.w. gilt:
8 v; v0 2 V : ( v0 2 T (v) ) s(v0) < () s(v) ) ^
( v0 2 T (v) ) s(v0) > () s(v) )
l
r
Falls T sortiert ist, so wird T auch kurz Suchbaum genannt.
Prof. Dr. Dietmar Seipel
211
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiel
S = f 2; 5; 6; 7; 8; 12; 13; 14; 15 g
12
7
5
2
Prof. Dr. Dietmar Seipel
15
8
6
13
14
212
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Durchläuft man die Knoten eines Suchbaumes T = (V; E ) in
LWR–Ordnung, so durchläuft man die Schlüsselwerte monoton steigend:
T ist (schwach) sortiert ,
( 8 v; v0 2 V : ( s(v) < () s(v0 )
, v <LWR v0 ) )
Deshalb kann man mit einem Suchbaum sortieren.
Offensichtlich sind in einem Suchbaum alle repräsentierten Schlüssel
paarweise verschieden: 8 v; v 0 2 V : v 6= v 0 ) s(v ) 6= s(v 0 ):
Wir wollen nun folgende Operationen auf Suchbäume betrachten:
Suchen,
Einfügen und
Löschen eines Schlüsselwerts s,
Generierung eines Suchbaumes zur Repräsentation einer Menge von
Schlüsselwerten.
Prof. Dr. Dietmar Seipel
213
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Implementierung
BinTreeNode
/**
* Knoten eines binaeren Baumes
*/
public class BinTreeNode {
/** Schluesselwert */
int key;
/** Linker Sohnknoten */
BinTreeNode lson;
/** Rechter Sohnknoten */
BinTreeNode rson;
Prof. Dr. Dietmar Seipel
214
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTreeNode
/**
* Konstruktor.
*/
BinTreeNode(int v) {
key = v;
lson = rson = null;
}
Prof. Dr. Dietmar Seipel
215
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTreeNode
/**
* Gibt die Anzahl der Soehne des Knotens
* zurueck (0, 1 oder 2)
*/
int countSons() {
if (lson == null)
return (rson == null)?0:1;
else
return (rson == null)?1:2;
}
Prof. Dr. Dietmar Seipel
216
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTreeNode
/**
* Liefert true, falls der Knoten ein
* Blatt ist, d.h. keine Kinder hat
*/
boolean isLeaf() {
return (lson == null) && (rson == null);
}
Prof. Dr. Dietmar Seipel
217
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTreeNode
/**
* Liefert true, falls der Knoten keinen
* Sohn auf der Seite hat, in der der Schluessel
* s zu suchen waere
*/
boolean isLeaf(int s) {
return ( (key > s) && (lson == null) )
|| ( (key < s) && (rson == null) );
}
Prof. Dr. Dietmar Seipel
218
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTreeNode
/**
* Liefert eine Textausgabe des Objektes, siehe
* {@link java.lang.Object#toString}
*/
public String toString() {
return "[" + key + "]";
}
}
Prof. Dr. Dietmar Seipel
219
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Binärer Suchbaum
*/
public class BinSearchTree {
/** der Wurzelknoten */
BinTreeNode root = null;
/**
* Leerer Konstruktor * erzeugt einen leeren Suchbaum
*/
public BinSearchTree() {
root = null;
}
Prof. Dr. Dietmar Seipel
220
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Generiert einen neuen binären
* Suchbaum aus dem Array s
*/
public BinSearchTree(int[] s) {
for (int i = 0; i < s.length; i++)
insert(s[i]);
}
Prof. Dr. Dietmar Seipel
221
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Sucht den Knoten mit Schlüssel s
* im Teilbaum von p
*/
BinTreeNode search(BinTreeNode p, int s) {
BinTreeNode q = null;
if (p != null) {
if (p.key == s) {
q = p;
Prof. Dr. Dietmar Seipel
222
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
} else {
if (p.key > s) {
q = search(p.lson, s);
} else {
q = search(p.rson, s);
}
}
}
return q;
}
Prof. Dr. Dietmar Seipel
223
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Sucht den Knoten mit Schlüssel s im Baum.
*/
BinTreeNode search(int s) {
return search(root, s);
}
Prof. Dr. Dietmar Seipel
224
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Einfügen eines neuen Blattes mit Schlüssel
* s in den Teilbaum von p
*/
void insert(BinTreeNode p, int s) {
BinTreeNode q = p, r = null;
while ( (q != null) && (q.key != s) ) {
r = q;
if (q.key > s)
q = r.lson;
else
q = r.rson;
}
Prof. Dr. Dietmar Seipel
225
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
// Abbruch bei vorhandenem Schlüssel
if (q != null) return;
if (r.key > s)
r.lson = new BinTreeNode(s);
else
r.rson = new BinTreeNode(s);
}
Prof. Dr. Dietmar Seipel
226
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Fügt ein neues Blatt mit Schlüssel
* s in den Baum ein
*/
void insert(int s) {
if (root != null) {
insert(root, s);
} else {
root = new BinTreeNode(s);
}
}
Prof. Dr. Dietmar Seipel
227
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Löscht den Knoten mit Schlüssel s aus dem Baum
*/
void remove(int s) {
BinTreeNode v = root, w = null, t;
// Suche Knoten v mit Schlüssel s
// (w ist Vater von v)
while ( (v != null) && (v.key != s) ) {
w = v;
if (v.key > s) v = v.lson;
else v = v.rson;
}
Prof. Dr. Dietmar Seipel
228
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
//Abbruch, falls Schlüssel nicht gefunden
if (v == null) return;
switch (v.countSons()) {
case 0:
changeSon(w, v, null);
break;
case 1:
//Der einzige Sohn von v ist t
t = (v.lson == null)?v.rson:v.lson;
// v durch einzigen Sohn t ersetzen
changeSon(w, v, t);
break;
Prof. Dr. Dietmar Seipel
229
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
case 2:
// v durch v.lson ersetzen
changeSon(w, v, v.lson);
// rechtesten Knoten suchen
t = findRight(v.lson);
// rechten Sohn von v an t hängen
t.rson = v.rson;
break;
}
}
Prof. Dr. Dietmar Seipel
230
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Tauscht den Sohn v von w gegen den Knoten x.
*/
void changeSon(BinTreeNode w, BinTreeNode v,
BinTreeNode x) {
if (w == null) {
if (v != root) return;
root = x;
} else {
if (w.lson == v)
w.lson = x;
else if (w.rson == v)
w.rson = x;
}
}
Prof. Dr. Dietmar Seipel
231
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
BinTree
/**
* Sucht den Knoten der am weitesten
* rechts im Teilbaum von p steht
*/
BinTreeNode findRight(BinTreeNode p) {
BinTreeNode q = p;
while (q.rson != null) q = q.rson;
return q;
}
}
Prof. Dr. Dietmar Seipel
232
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Einfügen
Um einen Schlüsselwert s in einen Suchbaum einzufügen, „suchen“ wir
s in dem Baum. Falls s schon vorhanden ist, so wird s nicht eingefügt.
Anderenfalls bricht die „Suche erfolglos“ in einem Knoten ab.
Wir können s nun als Sohn des erreichten Knotens einfügen.
Löschen
Zuerst muss der zu löschende Schlüsselwert s wieder in dem Baum
gesucht werden. Dabei merken wir uns nicht nur den Knoten v mit s(v)
= s, sondern auch den Vater „Vater(v)“ von v im Baum.
Wir unterscheiden nun drei Fälle:
1. v ist ein Blatt:
Dann kann v ohne Probleme gelöscht werden.
Prof. Dr. Dietmar Seipel
233
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
2. v hat genau einen Sohn:
Dann wird v im Baum gelöscht, und der Sohn von v wird zum
(entsprechenden) Sohn von Vater(v).
T:
T’:
Vater(v)
Vater(v)
v
v’
v’
Prof. Dr. Dietmar Seipel
234
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
3. v hat zwei Söhne:
Seien vl und vr der linke bzw. rechte Sohn von v, und sei vt der
rechteste Knoten des linken Teilbaums von v.
T:
Vater(v)
v
vl
vr
Tl(v)
Tr(v)
vt
Prof. Dr. Dietmar Seipel
235
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Dann wird v im Baum gelöscht, und vl wird zum (entsprechenden)
Sohn von Vater(v). Außerdem wird vr zum rechten Sohn von vt , d.h.
der rechte Teilbaum Tr (v) von v in T wird in den linken Teilbaum Tl (v)
von v in T „eingehängt“. Dies ergibt folgenden Baum:
T’:
Vater(v)
vl
Tl(v)
vt
vr
Tr(v)
Prof. Dr. Dietmar Seipel
236
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiel: Löschen nach Version 1
T:
v1
v2
v4
v6
Prof. Dr. Dietmar Seipel
v3
v5
v7
237
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
(i) Wenn wir in T den Schlüsselwert von v1 löschen, so erhalten wir
folgenden neuen Baum:
T’:
v2
v4
v6
Tl(v1)
v5
v7
v3
Tr(v1)
Prof. Dr. Dietmar Seipel
238
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
(ii) Wenn wir in T den Schlüsselwert von v2 löschen, so erhalten wir
folgenden neuen Baum:
T’:
Tl(v2)
v7
v1
v4
v3
v5
v7
Tr(v2)
Man beachte, dass der rechteste Knoten v4 von Tl (v2 ) in diesem Fall
kein Blatt ist.
Prof. Dr. Dietmar Seipel
239
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Löschen – Version 2
Der rechteste Knoten vt hat (natürlich) keinen rechten Sohn. Außerdem
ist s(vt ) sicher ein (geeigneter) Separator für Tl (v) und Tr (v).
T:
Vater(v)
v
vl
Tl(v)
vr
vt
Tr(v)
Prof. Dr. Dietmar Seipel
240
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Deshalb können wir v aus T löschen und durch vt ersetzen. Danach
müssen wir noch vt in Tl (v) löschen.
Da vt maximal einen Sohn hat, ist dies unproblematisch, vgl. a), b).
Es gilt: h(T 0 ) h(T )
T´:
Vater(v)
vt
vl
T´l(v)
Prof. Dr. Dietmar Seipel
vr
Tr(v)
241
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiel: Löschen nach Version 2
(i) Löschen von v1 in T:
T:
v7
v2
v4
v3
v5
v6
Prof. Dr. Dietmar Seipel
242
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
(ii) Löschen von v2 in T:
T:
v1
v4
v6
v3
v5
v7
Prof. Dr. Dietmar Seipel
243
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Der resultierende Baum T’ ist wieder ein Suchbaum, und zwar zur
Knotenmenge V’ = V n {v}.
Bei Version 1 ist die Höhe h(T’) häufig viel größer als die Höhe von T:
-1
Fall b)
Prof. Dr. Dietmar Seipel
<=
h(T’) - h(T)
Fall a)
<=
h(Tl(v))
Fall c)
244
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Der Aufwand für das Löschen beträgt wie beim Suchen O(h) Schritte.
Die Operation Löschen nach Version 1 ist kommutativ, d.h. löscht man in
einem Suchbaum zuerst einen Knoten v1 und dann einen anderen Knoten
v2 , so erhält man dasselbe Produkt wie wenn man zuerst v1 und dann v2
löscht.
Bei Löschen nach Version 2 gilt für die Höhen:
h(T 0 ) h(T ):
Prof. Dr. Dietmar Seipel
245
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Generieren:
Der Konstruktor:
BinSearchTree(int[] s)
erstellt einen Suchbaum für die Folge s.
Prof. Dr. Dietmar Seipel
246
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiel:
a) s = (12, 15, 7, 13, 5, 8) (8 Schritte)
12
7
5
Prof. Dr. Dietmar Seipel
15
8
13
247
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
b) s = (5, 7, 8, 12, 13, 15) (15 Schritte)
5
7
8
12
13
15
Prof. Dr. Dietmar Seipel
248
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Der Aufwand C(N) (gemessen in der Anzahl der Schlüsselvergleiche „s <,
=, > s’? “ ) und der resultierende Suchbaum T hängen stark von der
Reihenfolge der Schlüsselwerte s1 , ..., sN ab:
Ist die Eingabefolge s monoton, so degeneriert T zu einer linearen Liste
(siehe Beispiel b). Dann gilt:
C (N ) =
X
N
1
i=
N (N
2
i=1
und hat die maximale Höhe N
Prof. Dr. Dietmar Seipel
1) 2 (N 2)
1.
249
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Im günstigsten Fall erhält man einen Suchbaum T der Höhe
hT = blog2 N : Dann gilt:
C (N )
=
T
X
h
1
i2
i
+ h (N 2 T + 1)
h
T
i=0
= ( h 2 ) 2 T + 2 + h (N 2 T + 1)
= (N + 1) h 2 T +1 + 2 2 (N log2 N )
h
T
T
(im Beispiel a): N
T
h
h
= 6 ! C (N ) = 7 2 8 + 2 = 8)
Insgesamt gilt:
Cmin (N ) 2 (N log2 N ); Cmax (N ) 2 (N 2 ):
Prof. Dr. Dietmar Seipel
250
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Für den Erwartungswert Cmit (N) unter der Annahme, daß alle N !
Permutationen von s gleich wahrscheinlich sind, gilt:
Cmit (N ) 2 (N log2 N ):
Prof. Dr. Dietmar Seipel
251
Praktische Informatik I - Algorithmen und Datenstrukturen
5.2
Wintersemester 2006/07
AVL–Bäume
Definition (von Adelson–Velski und Landis (1962)):
= (V; R) ein geordneter binärer Wurzelbaum.
Balance: Die Balance eines Knotens v 2 V ist
(v) = h(T (v)) h(T (v));
Sei T
(i)
r
l
d.h. die Höhendifferenz zwischen dem rechten und dem linken
Teilbaum von v, wobei h(T 0 ) = 1 ist, falls T 0 leer ist.
Prof. Dr. Dietmar Seipel
252
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
v
vl
H(Tr(v))
H(Tl(v))
vr
Tl(v)
Tr(v)
ß(v)
Prof. Dr. Dietmar Seipel
253
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Falls v ein Blatt ist, so ist (v ) = 0.
Falls v kein Blatt ist und
–
T (v) leer ist, so ist
l
(v) = h(T (v)) + 1;
r
–
T (v) leer ist, so ist
r
(v) =
1 h(T (v)):
l
(ii) AVL–Baum: T heißt AVL–Baum, falls gilt:
8v 2 V : j (v)j 1:
Prof. Dr. Dietmar Seipel
254
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiele: AVL–Bäume
(i) Für die Folge s = (7, 4, 11, 8, 15, 12) erzeugt der Konstruktor folgenden
Baum T:
T:
7
4
11
8
15
12
Prof. Dr. Dietmar Seipel
255
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Dieser Baum ist kein AVL–Baum, denn er ist rechtslastig:
(7) = 2
v
(v)
Prof. Dr. Dietmar Seipel
0 = 2:
4 7 8 11 12 15
0 2 0 1 0 1
256
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
(ii) Für die Folge (11, 7, 4, 8, 12, 15) zur selben Schlüsselwertmenge wird
dagegen folgender Baum T’ generiert:
T’:
11
7
4
Prof. Dr. Dietmar Seipel
15
8
12
257
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
T 0 ist ein AVL–Baum. Hier gilt:
v
(v)
4 7 8 11 12 15
0 0 0 0 0 1
(iii) T und T’ unterscheiden sich dadurch, daß T um den Knoten 11 nach
„links rotiert“ ist.
Prof. Dr. Dietmar Seipel
258
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Linksrotation
eines Suchbaumes T bezüglich zweier Knoten v; v 0 mit v
T:
= V ater(v0)
T’:
V
V’
V’
Rotlinks(v, v')
V
Rotrechts(v', v)
Tl
Tl
Tr,1
Tr,1
Tr,2
Tr,2
Prof. Dr. Dietmar Seipel
259
Praktische Informatik I - Algorithmen und Datenstrukturen
Der neue Baum T 0
Wintersemester 2006/07
= Rotlinks (v; v0 )(T ) ist ebenfalls ein Suchbaum.
Für die Höhen von T und T 0 gilt:
Falls h(Tl (v )) < h(Tr (v )), so gilt h(T 0 ) h(T ).
Falls h(Tl (v )) < h(Tr (v )) und h(Tr;1 ) < h(Tr;2 ), so gilt
h(T 0 ) = h(T ) 1,
denn h(T 0 ) = h(Tr;2 ) + 1 und h(T ) = h(Tr;2 ) + 2.
Falls h(Tl (v )) h(Tr (v )), so gilt h(T 0 ) = h(T ) + 1,
denn h(T 0 ) = h(Tl ) + 2 und h(T ) = h(Tl ) + 1.
Prof. Dr. Dietmar Seipel
260
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Rechtsrotation
von T’ bezüglich v’, v (in T’ gilt: v’ = Vater(v)) liefert wieder T.
Rotrehts (v0 ; v) Æ Rotlinks (v; v0 )(T ) = T;
Rotlinks (v; v0 ) Æ Rotrehts (v0 ; v)(T 0 ) = T 0
Durch Links–, bzw. Rechtsrotation wird die LWR–Ordnung eines Baumes
nicht verändert.
Prof. Dr. Dietmar Seipel
261
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Satz:
Sei S = f s1 ; : : : ; sN g mit (o.B.d.A.) s1 < s2 < : : : < sN eine
Schlüsselwertmenge und T = (V; R) ein beliebiger Suchbaum für S .
Dann sind alle Suchbäume T’ für S durch endlich viele Anwendungen von
Rotlinks und Rotrechts aus T erzeugbar!
Beweis:
Wir können jeden Suchbaum T’ für S per Induktion aus der „linken linearen
Liste” erzeugen und umgekehrt:
Prof. Dr. Dietmar Seipel
262
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Sk
SN
TL:
SN-1
Sk+1
Sk-1
(N-k)-mal
Rotrechts
S1
SN
S1
(N-k-1)-mal
Sk
T’:
Sk-1
Rotlinks
Sk
Sk+1
Sk-1
per
SN
Induktion
S1
Prof. Dr. Dietmar Seipel
Sk+1
263
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Um nun T 0 aus T zu erzeugen, gehen wir wie folgt vor:
T
! T ! T0
l
2
Offenbar kann man mit einer der beiden Rotationen alleine nicht alle
Transformationen auf Suchbäumen realisieren.
Z.B. ist Rotlinks auf die linke lineare Liste Tl überhaupt nicht anwendbar.
Deshalb kann man Tl in keinen anderen Suchbaum transformieren, falls nur
Rotlinks zugelassen ist.
Prof. Dr. Dietmar Seipel
264
Praktische Informatik I - Algorithmen und Datenstrukturen
Sei T
Wintersemester 2006/07
= (V; R) ein Wurzelbaum.
(i) Der Außengrad g + (v ) und der Innengrad g (v ) eines Knotens v 2 V
geben die Anzahl der Nachfolger bzw. der Vorgänger von v in T an:
g+ (v)
g (v)
Prof. Dr. Dietmar Seipel
= j f w 2 V j (v; w) 2 R g j;
= j f w 2 V j (w; v) 2 R g j:
265
Praktische Informatik I - Algorithmen und Datenstrukturen
(ii)
Wintersemester 2006/07
T
heißt vollständig, falls jeder innere Knoten (= Nicht–Blatt) genau
zwei Söhne hat:
8v 2 V : (g+(v) 6= 0 ) g+ (v) = 2):
T1:
T2:
|V|
___
h(T2) = 2
Prof. Dr. Dietmar Seipel
266
Praktische Informatik I - Algorithmen und Datenstrukturen
(iii)
Wintersemester 2006/07
T heißt voll, falls alle Knoten auf allen Stufen außer den beiden
untersten genau zwei Söhne haben:
8v 2 V : ( h(v) h(T ) 2 ) g+(v) = 2 ):
T3:
Hier gilt:
2
h(T )
Prof. Dr. Dietmar Seipel
jV j < 2
h(T )+1
) h(t) 2 O(log2 jV j)
267
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Für geordnete binäre Wurzelbäume T gilt:
Ist T voll, so ist T ein AVL–Baum, denn alle Blätter haben die Höhe
h(T ) oder h(T ) 1.
T4 ist ein AVL–Baum, welcher nicht voll ist:
T4:
T1 und T2 sind vollständig, aber keine AVL–Bäume.
T4 ist ein AVL–Baum, welcher nicht vollständig ist.
Prof. Dr. Dietmar Seipel
268
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Fibonacci-Bäume: Abschätzung der Höhe von AVL–Bäumen
Wir betrachten im folgenden extremale AVL–Bäume, welche zu einer
vorgegebenen Höhe h eine minimale Anzahl von Knoten aufweisen:
n
Prof. Dr. Dietmar Seipel
h
= min f n j T ist ein AVL–Baum mit n Knoten und Höhe h g:
269
Praktische Informatik I - Algorithmen und Datenstrukturen
Es gilt n0
Wintersemester 2006/07
= 1 und n1 = 2.
Beispielbäume sind:
T0:
V1
T1:
V1
Höhe 0
Höhe 1
V2
Prof. Dr. Dietmar Seipel
270
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Sei T ein beliebiger knotenminimaler AVL–Baum der Höhe h 2.
Sei v die Wurzel von T und seien Tl (v ) und Tr (v ) der linke bzw. rechte
Teilbaum von v
T:
Tl(v)
Prof. Dr. Dietmar Seipel
v
Tr(v)
271
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Wegen h 2 hat (mindestens) einer der beiden Teilbäume die Höhe 1 und
ist somit nicht leer, und wegen j (v )j 1 ist auch der andere Teilbaum
nicht leer.
Aufgrund der Knotenminimalität von T gilt:
h(T (v)) = h 1 und h(T (v)) = h 2, oder
h(T (v)) = h 2 und h(T (v)) = h 1.
l
r
l
r
Außerdem müssen Tl (v) und Tr (v) auch wieder knotenminimale
AVL–Bäume sein, zu ihrer jeweiligen Höhe.
Prof. Dr. Dietmar Seipel
272
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Rekursionsformel:
n0 = 1
n1 = 2
n =1+n
h
h
1
+n
h
2
Diese Rekursionsformel erinnert an die Formel der Fibonacci–Zahlen:
f0 = 0
f1 = 1
f =f
h
Prof. Dr. Dietmar Seipel
h
1
+f
h
2
273
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Die Wertetabelle zeigt den Zusammenhang:
0 1 2 3 4 5 6 :::
n 1 2 4 7 12 20 33 : : :
f 0 1 1 2 3 5 8 :::
h
h
h
f
h
Prof. Dr. Dietmar Seipel
=n
h
3
+ 1; für h 3
274
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Definition (Fibonacci–Bäume, FB–Bäume)
Die Menge Fh der Fibonacci–Bäume der Höhe h ist rekursiv definiert:
1.
2.
F0 enthält alle Wurzelbäume T0 = (fvg; ;) mit genau einem Knoten
und der Höhe h = 0.
F , h 1, enthält alle geordneten binären Wurzelbäume
h
= < T 1; v; T 2 > bzw. T = < T 2; v; T 1 >;
wobei T 1 2 F 1 und T 2 2 F 2 .
Hierzu sei F 1 = f(;; ;)g, d.h. T 1 ist der leere Baum, und
T
h
h
h
h
h
h
h
h
h
h
< T; v; T 0 > bezeichne einen geordneten binären Wurzelbaum mit der
Wurzel v und dem linken bzw. rechten Teilbaum T bzw. T 0 von v .
Prof. Dr. Dietmar Seipel
275
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
v
T
T’
T0:
T1:
v
v
T3:
v
v
2 verschiedene
Bäume
Prof. Dr. Dietmar Seipel
T2:
4 verschiedene
Bäume
16 verschiedene
Bäume
276
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
ebenfalls in F3 :
T3’:
Prof. Dr. Dietmar Seipel
v
T3’’:
v
277
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Satz: Jeder FB–Baum ist auch ein AVL–Baum:
Beweis:
Sei der Baum von der Form
T
h
=< T 1; v; T
h
h
2
>.
Dann haben – per Induktion – alle Knoten v 0 in den kleineren Teilbäumen
Th 1 und Th 2 die Balance j (v0 )j 1: Für den Knoten v gilt:
j (v)j = jh(T 1) h(T 2)j = 1:
h
h
2
Dies zeigt ebenso gleich mit, dass alle Knoten v eines FB–Baumes die
Balance (v ) = += 1 haben.
Die FB–Bäume Th
Höhe h.
Prof. Dr. Dietmar Seipel
2F
h
sind genau die knotenminimalen AVL–Bäume der
278
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Satz:
Ein knotenminimaler AVL–Baum T zu einer vorgegebenen Höhe h mit n
Knoten ist gleichzeitig auch ein höhenmaximaler AVL–Baum zur
vorgegebenen Knotenanzahl n.
Beweis:
Angenommen, es gibt einen anderen AVL–Baum T 0 mit n Knoten und
h(T 0 ) > h(T ) = h:
Dann besitzt T 0 einen Teilbaum T 00 der Höhe h(T 00 ) = h: T 00 ist ebenfalls
ein AVL–Baum.
Prof. Dr. Dietmar Seipel
279
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Wegen der Knotenminimalität von T zur Höhe h gilt somit
n(T ) n(T 00 ):
Da T 00 aber ein echter Teilbaum von T 0 ist, muss gelten
n(T 00 ) < n(T 0 ) = n(T );
ein Widerspruch.
2
Also sind die FB-Bäume genau die höhenmaximalen AVL–Bäume zu einer
vorgegebenen Knotenzahl.
Prof. Dr. Dietmar Seipel
280
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Satz: (Höhenabschätzung für AVL–Bäume)
Sei T ein AVL–Baum mit n Knoten. Dann gilt:
h(T ) 2 log2 n:
Beweis:
Für die höhenmaximalen AVL–Bäume, d.h. die FB–Bäume, mit n Knoten
gilt die Rekursionsformel:
n0 = 1
n1 = 2
n =1+n
h
h
1
+n
h
2
Per Induktion kann man zeigen:
1.
2.
= f +3 1
p
p
f = 1= 5 (((1 + 5)=2)
n
Prof. Dr. Dietmar Seipel
h
h
h
h
((1
p
5)=2))
h
.
281
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
p
Der negative Term ((1
5)=2) ist dem Betrag nach kleiner als 1 und
seine Potenzen konvergieren daher mit wachsendem h gegen 0.
Daher gilt:
p
p
f 1= 5 ((1 + 5)=2) 0:45 1:62 ;
d.h. n 0:45 1:62 +3 1:
h
h
Prof. Dr. Dietmar Seipel
h
h
h
282
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Für alle h gilt:
p
p
f 1= 5 ((1 + 5)=2) 1:
Wegen n = f +3 1 gilt nun:
p
p
log2 (n + 2) log2 (1= 5) + (h + 3) log2 ((1 + 5)=2):
h
h
h
h
h
Daraus folgt die Abschätzung
h 2 log2 (n ):
h
2
Prof. Dr. Dietmar Seipel
283
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Doppelrotationen
Der resultierende Wurzelbaum T’ ist wiederum ein Suchbaum (falls T ein
Suchbaum war), und es gilt:
DoppelRotlinks (v; v0 ; v00 ) = Rotlinks (v; v00 ) Æ Rotrehts (v0 ; v00 );
DoppelRotrehts (v; v0 ; v00 ) = Rotrehts (v; v00 ) Æ Rotlinks (v0 ; v00 ):
Prof. Dr. Dietmar Seipel
284
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
V
T:
T’:
V’
V’’
DoppelRotlinks
(v, v', v'')
V’
V
V’’
Tl
Tr3
Tr1
Tl
Tr2
V
T:
Tr1
Tr3
Tr2
T’:
V’’
DoppelRotrechts
(v, v', v'')
V’
V
V’
V’’
Tr
Tl1
Tl2
Prof. Dr. Dietmar Seipel
Tl3
Tl1
Tl2
Tl3
Tr
285
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Satz: (Rebalancierung)
Sei T =< Tl ; v; Tr > ein geordneter binärer Wurzelbaum, mit der Wurzel v
und den Teilbäumen Tl , Tr , welche beide AVL–Bäume sind.
Ist j (v )j = 2, so kann T mittels einer Rotation oder Doppelrotation in
einen AVL–Baum T 0 überführt werden, mit
h(T )
Prof. Dr. Dietmar Seipel
1 h(T 0) h(T ):
286
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beweis:
Sei T o.B.d.A. „linkslastig“, d.h. (v ) =
2.
T:
V
Vl
Vr
Vl2
Vl1
hl
Tr
Tl1
Prof. Dr. Dietmar Seipel
Tl2
hr
2
287
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Wir betrachten nur den Fall, dass Tr nicht–leer ist. (Der andere Fall ist
leicht, da dann wegen (v ) = 2 die Teilbäume Tl;1 und Tl;2 jeweils
maximal einen Knoten haben können.)
Es gilt:
jh(T 2) h(T 1)j = j (v )j 1:
l;
Prof. Dr. Dietmar Seipel
l;
l
288
Praktische Informatik I - Algorithmen und Datenstrukturen
(i)
(v ) 2 f
l
Wintersemester 2006/07
1; 0 g, d.h. h(T 1) h(T 2):
l;
l;
Vl
Vl1
V
Vr
Vl2
Tl1
Tl2
Prof. Dr. Dietmar Seipel
Tr
289
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Dann betrachten wir den Wurzelbaum
T 0 = Rotrehts (v; v )(T ):
l
Alle Knoten in den AVL–Bäumen Tl;1 , Tl;2 und Tr haben dieselbe
Balance (0, +/- 1) wie in T .
Für den Knoten v gilt:
0 (v)
= h8(T ) h(T 2)
< h (h 1);
= :
h (h 2);
r
l;
r
8
< 1
= :
0
r
Prof. Dr. Dietmar Seipel
l
l
falls (vl ) = 0
falls (vl ) =
1
290
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Für den Knoten vl gilt wegen h(Tl;2 ) h(Tr ) auch
0 (v ) = h(T 2 ) + 1 h(T 1 ) = (v ) + 1 2 f
Also ist T 0 ein AVL–Baum, und es gilt:
l
l;
l;
8
<
h(T );
0
h(T ) =
: h(T ) 1;
Prof. Dr. Dietmar Seipel
l
falls (vl ) = 0
falls (vl ) =
1; 0 g:
1
291
Praktische Informatik I - Algorithmen und Datenstrukturen
(ii)
(v ) = +1, d.h. h(T
l
Wintersemester 2006/07
l;1
) = h(T 2) 1.
l;
Dann betrachten wir den Wurzelbaum
T 0 = DoppelRotrehts (v; v ; v
l
l;2
)(T ):
Alle Knoten in den AVL–Bäumen Tl;1 , T1 , T2 und Tr haben dieselbe
Balance (0, +/- 1) wie in T .
Prof. Dr. Dietmar Seipel
292
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
V
T:
T’:
Vl2
Vr
Vl
Vl
Vl2
Vl1
V1
Vl1
V2
V
V1
V2
Vr
Tr
Tl1
T1
Prof. Dr. Dietmar Seipel
T2
Tl1
T1
T2
Tr
293
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Für den Knoten v gilt:
0 (v)
= h8(T ) h(T2)
< h(T ) (h(T 2) 1);
= :
h(T ) (h(T 2 ) 2);
r
r
8
< (v) + 2 = 0
= :
(v) + 3 = 1
r
da (v ) = h(Tr )
Prof. Dr. Dietmar Seipel
l;
l;
falls (vl;2 ) 0
falls (vl;2 ) =
1
(h(T 2) + 1).
l;
294
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Für den Knoten vl gilt:
0 (v )
l
= h8(T1) h(T 1)
< (h(T 2) 1) h(T 1);
= :
(h(T 2) 2) h(T 1);
l;
l;
8
< (v ) 1 = 0
= :
(v ) 2 = 1
l;
l;
l;
falls (vl;2 ) 0
falls (vl;2 ) = 1
l
l
Prof. Dr. Dietmar Seipel
295
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Für den Knoten vl;2 gilt:
0 (v
) = (h(T ) + 2) (h(T 1) + 2)
= h(T ) h(T 1)
= (v) + 2 = 0;
da (v ) = h(T ) (h(T 1 ) + 2).
l;2
r
r
r
l;
l;
l;
Also ist T 0 ein AVL–Baum, und es gilt:
h(T 0 ) = h(T )
1:
2
Prof. Dr. Dietmar Seipel
296
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Definition (Klassen balancierter Bäume)
Sei f : N
! N eine Funktion.
Dann heißt eine Klasse B von Wurzelbäumen balanciert zur Höhe f (n),
g.d.w. gilt:
1. Jede n-elementige Schlüsselwertmenge S kann durch einen Baum
T 2 B der Höhe hT f (n) repräsentiert werden.
2. Die Wörterbuchoperationen Suchen, Einfügen und Löschen eines
Elements liefern für jeden Baum T 2 B einen (neuen) Baum T 0 2 B,
und sie können in O(hT ) Schritten ausgeführt werden.
Prof. Dr. Dietmar Seipel
297
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Satz (Adelson)
Die Klasse der AVL–Bäume ist zur Höhe
f (n) = 2 log2 n
balanciert.
Die notwendigen Rebalancierungen können nach dem Adelson–Verfahren
entlang des Suchpfades mit Hilfe von Rotationen und Doppelrotationen
erfolgen.
Prof. Dr. Dietmar Seipel
298
Praktische Informatik I - Algorithmen und Datenstrukturen
5.3
Wintersemester 2006/07
B–Bäume
(Rudolf Bayer, 1972)
Bei Suchproblemen in außerordentlich großen Schlüsselwertmengen S
müssen Sekundärspeicher verwendet werden.
Dann ist für den Suchaufwand neben den Schlüsselwertvergleichen vor
allen Dingen der Aufwand zum Aufsuchen und Laden von Seiten des
Sekundärspeichers entscheidend.
Um die Anzahl der Seitenwechsel von Seiten des Sekundärspeichers zu
minimieren, versucht man möglichst viele Schlüsselwerte entlang der
Zugriffswege beim binären Suchen in jeweils einer Seite zu speichern.
Prof. Dr. Dietmar Seipel
299
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Voller Baum
AVL-Baum
Seiten
12
18
7
2
1
Prof. Dr. Dietmar Seipel
9
8
5
3
22
15
4
6
14
10
11
13
20
17
16
19
24
21
23
25
300
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Definition (B–Baum vom Typ m)
Sei T = (V, R) ein geordneter Wurzelbaum mit einer Knotenmarkierung
s : V ! 2S ; welche jedem Knoten v 2 V eine Teilmenge s(v) S einer
Schlüsselwertmenge S zuordnet.
(im folgenden gilt: innerer Knoten: nicht die Wurzel und kein Blatt)
Prof. Dr. Dietmar Seipel
301
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Dann ist T ein B–Baum vom Typ m, welcher S repräsentiert, falls gilt:
1. Struktureigenschaften:
(a) Alle Blätter haben dieselbe Höhe hT .
(b) Alle Knoten enthalten höchstens 2 m Schlüssel.
Die Wurzel enthält mindestens einen Schlüssel;
alle anderen Knoten enthalten mindestens m Schlüssel.
(c) Enthält ein Knoten k Schlüssel, 1 k 2 m, so hat er genau
k + 1 Söhne. D.h. g+ (v) = js(v)j + 1.
(d) Folgerung aus (b) und (c):
Alle Knoten haben höchstens 2 m + 1 Söhne.
Die Wurzel hat mindestens 2 Söhne, falls sie kein Blatt ist.
Alle inneren Knoten haben mindestens m + 1 Söhne.
Prof. Dr. Dietmar Seipel
302
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
2. Suchbaumeigenschaft:
Die Schlüsselwertmenge S ist disjunkt auf die Knoten verteilt, und für
jeden Knoten v 2 V gilt: sei s(v ) = f s1 ; : : : ; sk g, mit
s1 < s2 < : : : < sk , und sei (v1 ; : : : ; vk+1 ) die Folge der Söhne von v
im Baum. Dann gilt:
(a) Alle Schlüsselwerte s im ersten Teilbaum T (v1 ) sind kleiner als s1 :
s < s1 .
(b) Alle Schlüsselwerte s im i–ten Teilbaum T (vi ), mit 2 i k, liegen
zwischen si 1 und si : si 1 < s < si .
(c) Alle Schlüsselwerte s im (k+1)–ten Teilbaum T (vk+1 ) sind größer als
sk : sk < s.
Prof. Dr. Dietmar Seipel
303
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
V
S1 S2
V1
V2
-----
Sk
Vk
Vk+1
Die Struktureigenschaft (1,b) besagt:
1 k 2 m:
Für alle anderen Knoten des B–Baumes gilt: m k 2 m:
Für die Wurzel des B–Baumes gilt:
Folgerung:
Alle Knoten außer der Wurzel sind garantiert zu mindestens 50% mit
Schlüsselwerten gefüllt.
Prof. Dr. Dietmar Seipel
304
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiel: B–Baum vom Typ m = 2, S
= h1; 25i
12
4
1 2 3
Prof. Dr. Dietmar Seipel
5 6
7
8 9 10 11
15 18 22
13 14
16 17
19 20 21 23 24 25
305
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Abschätzungen:
= (V; R) vom Typ m.
Sei n = jV j die Knotenanzahl und h = h die Höhe von T .
für einen B–Baum T
T
1. Knotenzahl:
Jeder innere Knoten hat mindestens m + 1 Söhne. Deshalb gilt:
n
1+2
X
h
(
m + 1)
(m + 1) = 1 + 2 m
1
i=0
h
i
1
Jeder Knoten hat maximal 2 m + 1 Söhne. Deshalb gilt:
X
(2
m + 1) +1 1
(2 m + 1) =
n 2m
=0
h
h
i
i
Prof. Dr. Dietmar Seipel
306
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
2. Höhe:
Gemäß 1. gilt:
h
h
log2 ( 21 (n 1) m + 1)
;
log2 (m + 1)
log2 (2 m n + 1)
1
log2 (2 m + 1)
Deshalb gilt h 2 (log2 n); für festes m.
Prof. Dr. Dietmar Seipel
307
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
3. Schlüsselanzahl:
Für alle Knoten gilt js(v )j 2 m. Deshalb gilt mit 1.:
jS j n 2 m (2 m + 1) +1 1
Für die Wurzel w des Baumes gilt js(w)j 1; und für alle anderen
Knoten v gilt js(v )j m:
h
Deshalb gilt mit 1.:
jS j 1 + m (n 1) 1 + 2 ((m + 1)
Deshalb gilt auch h 2 (log2 jS j); für festes m.
4. Blätterzahl b:
Analog zu 1. erhält man: 2 (m + 1)h
Prof. Dr. Dietmar Seipel
1
h
1)
b (2 m + 1)
h
308
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Satz (B–Bäume)
Die Klasse der B–Bäume vom Typ m ist zur Höhe
f (n) =
1
log2 (n)
log2 (m + 1)
balanciert.
h
1
log2 (m+1)
log2 j j2+1 ; und j j2+1 jS j; für jS j 1.
S
S
Zum Beweis dieses Satzes untersuchen wir im folgenden die
Wörterbuchoperationen und zeigen, dass diese in O(h) Schritten ausgeführt
werden können. Die Höhenbeschränkung erhalten wir mit 3. von oben.
Prof. Dr. Dietmar Seipel
309
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Realisierung der Wörterbuchoperationen
(i) Suchen nach einem Schlüsselwert s: search(s, T)
Innerhalb einer Schlüsselwertmenge s(v ) eines jeden Knotens, welche
in einer Seite des Sekundärspeichers ist, kann binär gesucht werden,
mit konstantem Aufwand dlog2 (2 m)e:
Prof. Dr. Dietmar Seipel
310
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Die Suche wird – wie bei AVL–Bäumen – von den Schlüsselwerten
dirigiert: s1 < : : : < sk
s < s1 : Fortsetzung der Suche im ersten Teilbaum
– s 1 < s < s , 2 i k: Fortsetzung der Suche im i–ten Teilbaum
– s < s: Fortsetzung der Suche im (k + 1)–ten Teilbaum
Nach maximal (h + 1)–maligem Durchsuchen eines Knotens findet
man s, oder stellt fest, dass s nicht im Baum enthalten ist.
–
i
i
k
T
Der Aufwand für die Suche ist also O(hT ).
Prof. Dr. Dietmar Seipel
311
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
(ii) Einfügen eines Schlüsselwertes s: insert(s, T)
Zunächst wird s im Baum „gesucht“. Ist s schon im Baum, so ist das
Einfügen unnötig.
Anderenfalls bricht die Suche „erfolglos“ in einem Blatt v ab, und der
Pfad zu diesem Blatt wird gespeichert.
Dann wird s in das Blatt v eingefügt.
Hat v nun immer noch höchstens 2 m Schlüssel, so kann man das
Einfügen terminieren.
Anderenfalls hat man einen Überlauf mit 2 m + 1 Schlüsseln in v .
Dann muß der so entstandene Baum T 0 rekursiv entlang des Pfades von
der Wurzel zu v „rebalanciert“ werden, beginnend mit v .
Prof. Dr. Dietmar Seipel
312
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Wir „rebalancieren“ einen übergelaufenen Knoten v wie folgt:
(a) Die Schlüsselwerte in v werden in drei Gruppen aufgeteilt (Splitting):
die Menge S1 der m kleinsten Schlüssel,
das mittlere Element sm+1 ,
die Menge S2 der m größten Schlüssel.
(b) Anstelle von v werden zwei neue Knoten v1 und v2 mit den
Schlüsselwerten S1 bzw. S2 erzeugt.
Der Schlüssel sm+1 wird in den Vater von v eingefügt, falls v nicht
die Wurzel des Baumes war.
In diesem Falle muß jetzt (rekursiv) der Vater von v rebalanciert
werden.
Falls v schon die Wurzel des Baumes war, so wird eine neue Wurzel
mit genau einem Schlüssel sm+1 erzeugt.
Prof. Dr. Dietmar Seipel
313
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
--V1
Sm+1
---
S1
--V2
S2
Aufwand für das Einfügen:
Beim Rebalancieren kann höchstens hT + 1–mal gesplittet werden.
Deshalb ist der Aufwand für das Einfügen in O(hT ).
Der beim Einfügen entstehende Baum T 0 kann eine um 1 größere Höhe
haben, falls die Wurzel gesplittet wurde:
„B–Bäume wachsen (und schrumpfen) an der Wurzel.“
Es gilt: hT
Prof. Dr. Dietmar Seipel
h h +1
T0
T
314
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiel: Einfügen
1. Das Einfügen von s = 26 in T stellt kein Problem dar, da das
zugehörige Blatt nur 3 Schlüssel hat. Sei T 0 der erzeugte Baum.
2. Beim Einfügen von s0
–
–
–
S1 = f 23; 24 g,
s3 = 25,
S2 = f 26; 27 g,
= 27 in T 0 muß ein Blatt gesplittet werden:
und wir erhalten folgenden neuen Baum T 00 :
Prof. Dr. Dietmar Seipel
315
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
15 18 22 25
13 14
Prof. Dr. Dietmar Seipel
16 17
19 20 21 23 24
26 27
316
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Alternativ kann man beim Einfügen von s0
Verschieben:
= 27 in T 0 auch nach links
15 18 22
19 20 21 23 24 25 26 27
Prof. Dr. Dietmar Seipel
317
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Dann erhält man folgenden Baum:
15 18 23
19 20 21 22
Prof. Dr. Dietmar Seipel
24 25 26 27
318
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
(iii) Löschen eines Schlüsselwertes s: delete(s, T)
Zunächst wird der Pfad von der Wurzel von T zu dem Knoten v von T
bestimmt, der s enthält. Sei s der i–te Schlüssel in v .
Ist v ein Blatt, so wird s aus v gelöscht, und man setzt v 0 = v .
Ist v kein Blatt, wo wird s auch aus v gelöscht. Aber jetzt benötigt man
einen neuen Separator s0 anstelle von s in v . Dazu wählen wir den
größten Schlüssel s0 im rechtesten Blatt v 0 des i–ten Teilbaums T (vi )
von v .
Wir löschen s0 aus v 0 und ziehen s0 nach v hoch.
Der so entstehende neue Baum T 0 erfüllt die Suchbaumeigenschaft für
S 0 = S n f s g.
Prof. Dr. Dietmar Seipel
319
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Um auch die Struktureigenschaft wieder herzustellen, muss T 0
„rebalanciert“ werden. Dies erfolgt rekursiv entlang des Pfades von der
Wurzel von T zu v 0 , beginnend mit v 0 .
Wir „rebalancieren“ einen Knoten v wie folgt:
(a) Falls v mindestens m Schlüssel enthält, oder die Wurzel des Baumes
ist, so ist nichts zu tun.
(b) Falls v nur m 1 Schlüssel enthält (Unterlauf ), so betrachten wir den
linken und rechten Bruder von v .
Enthält einer der beiden Brüder v 0 mindestens m + 1 Schlüssel, so kann
man einen dieser Schlüssel verschieben.
Danach kann man die gesamte Rebalancierung terminieren.
Enthalten beide Brüder nur m Schlüssel, so kann man v mit einem
Bruder v 0 verschmelzen.
Prof. Dr. Dietmar Seipel
320
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Vater(v*)
S*
---
---
---
S1 S2 ...
---
M-1 Schlüssel
T1
T2
Verschiebe S1 nach Vater(v*)
und s* nach v*
Vater(v*)
S1
---
--S2 ...
S*
T1
Prof. Dr. Dietmar Seipel
T2
321
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Vater(v*)
--- Si-1 Si Si+1
---
S*1...S*m-1
-----
S01 ... S0m
verschmelze v* und v0
Vater(v*)
--- Si-1 Si+1
---
Prof. Dr. Dietmar Seipel
---
S*1...S*m- 1 Si S01 ... S0m
---
322
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Danach müssen wir (eventuell) den Knoten V ater(v ) rebalancieren
(Rekursion).
Aufwand für das Löschen:
– Das Hochziehen eines neuen Separators wird höchstens einmal
ausgeführt.
– Das Verschieben wird bei der Rebalancierung ebenfalls höchstens
einmal ausgeführt.
– Das Verketten wird bei der Rebalancierung höchstens hT mal ausgeführt.
Deshalb ist der Gesamtaufwand für das Löschen in O(hT ).
Prof. Dr. Dietmar Seipel
323
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Falls beim Rebalancieren Söhne der Wurzel verschoben werden, so
verliert die Wurzel einen Schlüssel.
Falls die Wurzel dann nur genau einen Schlüssel hätte, so schrumpft die
Höhe des Baumes um 1.
Im allgemeinen gilt:
h
T
Prof. Dr. Dietmar Seipel
1h h :
T0
T
324
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiel: Löschen
1. Das Löschen von s = 11 stellt kein Problem dar, da das zugehörige
Blatt 4 Schlüssel enthält.
2. Beim Löschen von s = 5 kann man verschieben und erhält:
3
1 2
Prof. Dr. Dietmar Seipel
4 6
7
8 9 10 11
325
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
3. Beim Löschen von s = 13 kann man verschmelzen und erhält:
18 22
14 15 16 17
19 20 21 23 24 25
4. Beim Löschen von s = 18 wird der rechte Schlüssel s0 = 17 des „linken
Teilbaums“ von 18 hochgezogen. Danach wird der Baum rebalanciert.
Prof. Dr. Dietmar Seipel
326
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Seitengrößen bei B–Bäumen:
Seitengröße 1KB = 210 Bytes
für einen Schlüsselwert + einen Zeiger: 10 Bytes
) pro Seite maximal k = 100 Schlüsselwerte, d.h. m = 50:
50 k 100:
Beispiel: Typ m = 50
)
h=0:
h=1:
h=2:
h=3:
Prof. Dr. Dietmar Seipel
2 51 1 jS j 101 +1 1
1 jS j 100;
101 jS j 10:200;
5:201 jS j 1:030:300;
265:301 jS j 104:060:400
h
h
327
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Bei praktischen Problemstellungen sind die Höhen der B–Bäume
gewöhnlich höchstens 3.
Bei jeder Basisoperation sind dann höchstens 8 Seitenwechsel nötig.
Höhenvergleich:
B–Bäume:
n = jS j
1
1
log2 (n + 1) 1 h log (m + 1) (log2 (n + 1) 1)
log2 (2 m + 1)
2
AVL–Bäume:
log2 (n + 1)
Prof. Dr. Dietmar Seipel
1 h 1:44 (log2 (n + 1) + 1=2 log2 (5)) 3
328
Praktische Informatik I - Algorithmen und Datenstrukturen
Beispiel:
Wintersemester 2006/07
m = 50, jS j = 50 000 000
25 hAVL 35
3 hB 4
Hier gilt:
25:57 = log2 (jS j + 1),
5:67 = log2 (m + 1),
6:66 = log2 (2 m + 1)
Prof. Dr. Dietmar Seipel
329
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Bearbeitungszeit für eine Seite
(beim Suchen im B–Baum)
Seien k Schlüsselwerte in der Seite gespeichert:
t = + + (log2 k) :
:
:
Aufwand zum Positionieren des Schreiblesekopfes der Platte auf die
gewünschte Seite (mittlere Zugriffszeit)
Aufwand für das Laden der Seite
Aufwand für einen Schlüsselwertvergleich im Hauptspeicher (beim
binären Suchen innerhalb einer Seite)
Prof. Dr. Dietmar Seipel
330
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Realistische Größenordnungen sind etwa
Beispiel Seagate Cheetah:
10 000 U/min, Ultra-Wide SCSI, Vibre-channel Anschluß
mittlere Zugriffszeit: 7.5 ms
Durchsatz: 16.8 MByte/s
Dann gilt:
Prof. Dr. Dietmar Seipel
= 7:5 ms;
= 60 s (Faktor 116 langsamer als );
= 0 (vernachlässigbar gegenüber und )
331
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
B –Bäume
(blätterorientierte Version der B–Bäume)
Relation: Datensatz
i
!
Schlüssel si + beschreibende Attribute bi
Die Nicht–Blatt–Knoten dienen – wie üblich – als Wegweiser zu den
Schlüsselwerten. Sie bilden einen B–Baum vom Typ m für eine Menge
S von Separatoren.
Die Datensätze werden entsprechend ihrer Schlüsselwerte aus S
disjunkt auf die Blätter verteilt, welche zwischen m0 und 2 m0
Datensätze enthalten.
Die Separatoren separieren alle Knoten des Baumes – auch die Blätter
– entsprechend der Suchbaumeigenschaften (a), (b), (c) mit „“ (
anstelle von „<“)
Prof. Dr. Dietmar Seipel
332
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Beispiel: B –Baum vom Typ m = 2, m0
=1
7 12 21
M=2
3
M’=1
Prof. Dr. Dietmar Seipel
1 2
3 4
5
5 6
9
11
14 16 18 19
23 25
7 8 9 10 11 12 13 14 1516 17 18 19 20 21 22 23 24 25
333
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
n Blätter (n = 14)
n 1 Separatoren (n 1 = 13)
S = h1; 25i
S = f 3; 5; 7; 9; 11; 12; 14; 16; 18; 19; 21; 23; 25 g
Auf der Blätterebene des B –Baums ist bereits die gesamte Information mit
den vollständigen Datensätzen (si ; bi ) repräsentiert.
Prof. Dr. Dietmar Seipel
334
Praktische Informatik I - Algorithmen und Datenstrukturen
Wintersemester 2006/07
Anwendung:
B –Bäume werden benutzt, wenn zu den zu den Schlüsseln si auch
beschreibende Attribute mit viel Speicherverbrauch gespeichert werden
sollen.
So müssen nicht bei jeder Suche auch alle vorhergehenden Daten, sondern
nur die gesuchten eingelesen werden.
Prof. Dr. Dietmar Seipel
335
Herunterladen