BÄUME BALANCIERTE BÄUME

Werbung
10. Kapitel (Teil 2) BÄUME BALANCIERTE BÄUME Algorithmen & Datenstrukturen Prof. Dr. Wolfgang Schramm Übersicht 1 1.  Einführung 2.  Algorithmen 3.  EigenschaDen von Programmiersprachen 4.  Algorithmenparadigmen 5.  Suchen & SorMeren 6.  Hashing 7.  Komplexität von Algorithmen 8.  Abstrakte Datentypen (ADT) 9.  Listen 10. Bäume 11. Graphen Lernziele des Kapitels 2 2
¨ 
¨ 
¨ 
Verstehen, wie balancierter Baum aussieht? Kennenlernen verschiedener Arten balancierter Bäume. Kennenlernen der speziellen OperaMonen, um balancierte Bäume im Gleichgewicht zu halten. Inhalt 3 1.  Balancierte Bäume n  AVL-­‐Bäume n  B-­‐Bäume 2.  Weitere Bäume Ausgeglichene Bäume 4 Problem 4
4
4
insert (6)
insert (8)
6
6
8
4
6
8
11
Ausgeglichene Bäume 5 ¨ 
¨ 
¨ 
Man muss dafür sorgen, dass ein Baum bei einer ungünsMgen Einfügereihenfolge nicht entartet. Idee: bei jeder Einfüge-­‐ oder LöschoperaMon versucht man den Baum auszugleichen. Beispiel: insert A
G
F
J
E
C
A
F
I
ausgleichen
A
I
C
E
G
J
Ausgeglichene Bäume 6 o 
AVL-­‐Bäume (nach G.M. Adelson-­‐Velskii und E.M. Landis): sind höhenbalanciert. Halten den Aufwand beim Ausgleichen begrenzt. o 
B-­‐Bäume (B wie balanciert, breit, buschig oder Bayer) sind n-­‐äre Bäume: sind höhenbalanciert mit unausgeglichenem Verzweigungsgrad. o 
Es gibt noch weitere ausgeglichene Bäume. AVL -­‐ Bäume 7 ¨ 
¨ 
AVL-­‐Kriterium: Für jeden inneren Knoten ist der absolute Betrag der Differenz der Höhen des linken und des rechten Teilbaums maximal 1. Beispiel: Welcher Baum erfüllt die AVL-­‐EigenschaD und welcher nicht? G
I
J
D
F
C
E
AVL-Baum
I
J
D
F
C
E
G
Kein AVL-Baum
AVL -­‐ Bäume 8 o 
Balance eines Knotens k: b(k) = height(k.leD) – height(k.right) o 
Mit AVL-­‐Kriterium: b(k) ∈ { -­‐1, 0, +1 } o 
Einfügen in AVL-­‐Baum: ¤ 
¤ 
¤ 
¤ 
¤ 
Knoten wird wie in normalen binären Suchbaum als Blao eingefügt. Durch das Einfügen kann die AVL-­‐EigenschaD verletzt werden, d.h. die Balance eines Knotens kann auch die Werte –2 oder +2 annehmen → b(k) ∈ { -­‐2, -­‐1, 0, +1, +2 }. Der Knoten ist somit außer Balance. Die Verletzung der AVL-­‐EigenschaD muss durch Ausgleichen behoben werden. Das Ausgleichen erfolgt durch die Vertauschung von Knoten und damit einem neuen „Layout“ des Baums. Diese Vertauschungen nennt man RotaMonen. AVL – Bäume Ausgleichsregeln 9 Wie wird bei Verletzungen der AVL-­‐EigenschaDen ausgeglichen? ⇒  Fallunterscheidungen: 1)  Einfügen im linken Teilbaum des linken Kindes à RotaMon mit dem linken Kind. 2)  Einfügen im rechten Teilbaum des linken Kindes à DoppelrotaMon mit dem linken Kind. 3)  Einfügen im rechten Teilbaum des rechten Kindes à RotaMon mit dem rechten Kind. 4)  Einfügen im linken Teilbaum des rechten Kindes à DoppelrotaMon mit dem rechten Kind. Wegen der Symmetrie der Fälle 1. und 3. bzw. 2. und 4. à Beschränkung auf 1. und 2. AVL-­‐Bäume -­‐ Balancierung 10 +2
+1
0
0
k3
Einfache Rotation
(R) nach rechts
k2
k1
0
k2
k1
k3
Rotation von k2 über k3
+2
-1
k2
0
k3
0
k1
0
Doppelrotation (LR)
erst nach links, dann
nach rechts
Rotation von k1 über k2 und k3
0
k2
k1
0
k3
Einfügen im linken Teilbaum des linken Kindes 1/2 11 1. Einfügen
rot = Balance 1
2
7
7
0
5
1
Einfügen 2
0
2
5
Einfügen im linken Teilbaum des linken Kindes 2/2 12 2. Ausgleich durch RotaMon (einfache Darstellung) Einfache RotaQon rot = Balance 2
0
7
1
0
2
5
0
Einfache Rotation
nach rechts
2
5
0
7
Einfügen im rechtenTeilbaum des linken Kindes 1/2 13 1.  Einfügen
rot = Balance 2
1
7
7
-1
0
5
Einfügen 6
5
0
6
Einfügen im rechtenTeilbaum des linken Kindes 2/2 14 2. Ausgleich durch RotaMon (einfache Darstellung) DoppelrotaQon (LR) = RotaMon nach links und dann nach rechts.
rot = Balance 2
2
7
-1
Rota
5
7
tion
(
L)
0
6
0
5
1
6
Rota
0
tion
(
R)
0
5
6
0
7
AVL – Bäume Anwendung der Ausgleichsregeln 15 o 
o 
Ausgleichen für den Knoten k für den das AVL-­‐Kriterium verletzt ist. Fälle: 1.  Einfügen im linken Teilbaum des linken Kindes à RotaMon des Knotens mit linkem Kind 2.  Einfügen im rechten Teilbaum des linken Kindes. à DoppelrotaMon à RotaMon linkes Kind mit seinem rechten Kind à RotaMon des Knotens mit linken Kind Die Fälle „Einfügen … des rechten Kindes“ sind symmetrisch à hier nicht betrachtet. Einfügen – Änderung der Struktur 1/2 16 o 
RotaMon (genaue Darstellung): LinksrotaMon von k. Wurzel
linkes Kind der Wurzel
rechte Kind der Wurzel
li. Ki. des li. Ki. der Wurzel
re.Ki. des li. Ki. der Wurzel
li. Ki. des re. Ki. der Wurzel
re.Ki. des re. Ki. der Wurzel
vorher
nachher k
k.leD
k.right
k.leD k.leD.leD k k.leD.leD k.leD.right
k.leD.leD.leD k.leD.leD.right k.right.leD k.right.right
k.leD.right k.right Die „nachher“-Position bezieht sich immer auf den den
neuen Wurzelknoten, der Pfad zu dem entsprechenden
Knoten beginnt immer beim alten Wurzelknoten k.
Einfügen – Änderung der Struktur 2/2 17 ¨ 
RotaMonen (genaue Darstellung): Einfache RotaQon 2
10
0
1
0
7
13
1
0
5
9
rot = Balance 0
1
2
0
2
Nur die blau markierten
Referenzen werden geändert
7
5
0
10
0
0
9
13
ImplemenMerung – AVL-­‐Baum 1/4 20 public class AVLTreeNode {
Element value;
TreeNode left;
TreeNode right;
int balance;
// reicht aus
boolean isbalanced; // redundant !
// Konstruktor
public AVLTreeNode (Element value,
AVLTreeNode left,
AVLTreeNode right) {
this.value = value;
this.left = left;
this.right = right;
balance = 0;
}
}
ImplemenMerung AVL-­‐Baum 2/4 21 public class AVLTree {
AVLTreeNode root;
// Konstruktoren
public AVLTree ( ) {
}
public AVLTree (Element v) {
root = new AVLTreeNode (v, null, null);
}
...
ImplemenMerung – AVL-­‐Baum 3/4 22 o 
RotaMon (Methode in AVLTree) private TreeNode rotateLeft (TreeNode t) {
TreeNode tmp = t.right;
t.right = t.right.left;
tmp.left = t;
return tmp;
}
o 
Analog rotateRight
ImplemenMerung – AVL-­‐Baum 4/4 23 o 
DoppelrotaMon (verwendet in AVLTree) ¤ 
¤ 
2 RotaMonen DoppelrotaMon links = Rot. Rechts + Rot. Links ...
r.right = rotateRight (r.right);
TreeNode tmp = rotateLeft (r);
// tmp ist neue Wurzel
...
ImplemenMerung – AVL-­‐Baum -­‐ Einfügen 1/8 24 o 
o 
Idee ¤  Einfügen des neuen Knotens als Blao (wie Binärbaum). ¤  Anschließend ggf. Ausgleichen durch RotaMon. ¤  Es gilt n  Es müssen höchstens Knoten auf dem Weg vom eingefügten Blao zur Wurzel ausgeglichen werden. n  Es muss höchstens ein Knoten ausgeglichen werden (d.h. höchstens eine RotataMon oder DoppelrotaMon) . Grundlage ¤  Rekursives insert (= insertR) für Binärbaum. ¤  Rekursiv, da dann Weg von Einfügeknoten zu Wurzel verfügbar ist. ImplemenMerung – AVL-­‐Baum -­‐ Einfügen 2/8 25 o 
(Methode in AVLTree) public void insert (Element p) {
if (root == null) {
root = new AVLTreeNode (p);
} else {
root = insertR (root, p);
}
}
ImplemenMerung – AVL-­‐Baum -­‐ Einfügen 3/8 26 private AVLTreeNode insertR (
AVLTreeNode t, Element p) { ... }
1.  Grundlage: rekursives Einfügen des Binärbaums. 2.  Erweiterung: Rebalancieren a) Feststellen, ob rebalanciert werden soll: I.  ein Knoten hat die Balance 1 (linker Unterbaum größer) UND es wurde im linken Unterbaum eingefügt II.  Der Baum wurde noch nicht rebalanciert (nur ein Rebalancieren notwendig bei Einfügen!) b) Rebalancieren & Balance aktualisieren ImplemenMerung – AVL-­‐Baum -­‐ Einfügen 4/8 27 private TreeNode insertR (TreeNode t, int i) {
// t not equal null!
Zu 1. Grundlage:
if (i < t.val) {
rekursives Einfügen
// left subtree
im Binärbaum
if (t.left == null) {
// no subtree – insert node
t.left = new TreeNode (i);
} else {
// insert in right subtree
t.left = insertR (t.left, i);
}
} else if (i == t.val) {
// nothing to do
} else {
// i > t.val
// right subtree analogue left subtree
}
}
ImplemenMerung – AVL-­‐Baum -­‐ Einfügen 5/8 28 Zu 2 a I: linker Unterbaum größer (Balance 1) UND in linken Unterbaum wurde eingefügt ¤ 
Nach dem Einfügen (rekursiver insertR-­‐Aufruf): t.balance == 1 &&
Math.abs (t.left.balance) == 1
Anmerkung:
nach dem Einfügen kann die
Balance auf 0 sein – in dem Fall
ist der Baum jedoch bereits
balanciert
ImplemenMerung – AVL-­‐Baum -­‐ Einfügen 6/8 29 Zu 2 a II: Baum noch nicht rebalanciert ¤  Beim „Absteigen“ durch die rekursiven Aufrufe: in jedem besuchten Knoten t: t.isbalanced = false
¤  Beim „Aufsteigen“: 1.  t.isbalanced = t.left.isbalanced
falls der Unterbaum bereits balanciert wurde, dann ist auch der übergeordnete balanciert 2.  Setze t.isbalanced = true
falls der Baum balanciert wird bzw. ist: n  RotaMonen n  Es gibt Knoten gleichen Niveaus Baum hat die
mit eingefügtem Knoten in rechten Balance 0
Unterbaum ImplemenMerung – AVL-­‐Baum -­‐ Einfügen 7/8 30 Zu 2 b Balancieren (nur falls noch nicht balanciert wurde) ¤  Balance der Wurzel erhöht sich um 1 ¤  Falls Balance == 2 n  Balancierregeln anwenden n  RotaMon oder DoppelrotaMon n  Balancen neu berechnen n  Neue Wurzel: Balance = 0 n  RechtsrotaMon right (ehemalige Wurzel): Balance = 0 n  DoppelrotaMon: neue Balancen = alte Balance der neuen Wurzel 1
-­‐1 leD
0
1 right
-­‐1
0 ImplemenMerung – AVL-­‐Baum -­‐ Einfügen 8/8 31 ¨ 
Java Programm AVL-­‐Bäume Beispiel für Balancierung 32 +1
0
0
Tb1
Tb4
Tb2
Tb3
Welche Aussagen kann man über die Höhenverhältnisse der Teilbäume machen? In welche Teilbäume kann man noch Knoten einfügen, ohne dass einer der angegebenen Knoten aus der Balance gerät? AVL-­‐Bäume Beispiel für Balancierung 33 -1 k
1
k2 0
k1 0
0 k2
Tb1
Tb2
Tb3
Tb1
Tb2
Tb3
Welche Aussagen kann man über die Höhenverhältnisse der Teilbäume machen? In welche Teilbäume kann man noch Knoten einfügen, ohne dass einer der angegebenen Knoten aus der Balance gerät? ImplemenMerung – AVL-­‐Baum -­‐ Löschen 34 1.  Grundlage: rekursives Löschen im Binärbaum 2.  Erweiterung: Rebalancieren a) Feststellen, ob rebalanciert werden soll n  Betrachten des ganzen Pfades von der Wurzel bis zum gelöschten Element und zurück. n  Balancieren mehrerer Knoten möglich. b) Rebalancieren & Balance aktualisieren Mehrwegbäume: MoMvaMon 1/2 36 o 
o 
o 
Mit AVL-­‐Bäumen: Bäume sind ausgeglichen à Anzahl der OperaMonen ist begrenzt. Was ist, wenn der Baum zu groß für den Hauptspeicher ist? Externe Datenspeicherung → Speicherhierarchie: ¤ 
¤ 
¤ 
¤ 
Register (< 1kB)
Cache (L2) (0,5-­‐2 MB)
Hauptspeicher (512 MB – 8 GB)
Festplaoe (20 – 512 GB)
1 ns 3 ns 20 ns 7 ms Zugriffsverhältnis zwischen Hauptspeicher und Festplaoe: t(Plaoe) / t(Hauptspeicher) = (7·∙10-­‐3) / (20·∙10-­‐9) = 3.5·∙105 o 
Mehrwegbäume: MoMvaMon 2/2 37 è Zugriff auf (externe) Knoten sehr teuer. Beispiele: o  Dateibaum des Datei-­‐Systems. o  Tabellen von Datenbanken (DB2 (IBM), Sybase, Oracle, ...). à Man häoe gerne einen Baum, der noch geringere Tiefe hat als log2 n. Idee: o  Erhöhe die Basis des Logarithmus (à Mehrweg-­‐Baum). o  Speichere mehrere "aufeinanderfolgende" Baum-­‐Knoten auf derselben Seite (Page) auf der Plaoe. à Reduziere damit die Anzahl der Seitenzugriffe. m-­‐Wege-­‐Baum 38 o 
Ein m-­‐Wege-­‐Suchbaum ist eine Verallgemeinerung eines binären Suchbaumes (d. h., ein binärer Suchbaum ist ein 2-­‐
Wege-­‐ Suchbaum). 1 Seite
Wenn die Knoten des Baums jeweils wie eingerahmt auf einer Seite liegen, findet man einen Wert mit maximal 2 Zugriffen auf einem externen Speicher, stao mit max. 5 Zugriffen, wenn das nicht garanMert ist. Mehrwegebaum: DefiniMon 39 o 
In einem m-­‐Wege-­‐Baum haben alle Knoten den Grad ≤ m. o 
Der Baum ist entweder leer oder besitzt folgende EigenschaDen: o 
Jeder Knoten hat folgende Struktur: ¤ 
¤ 
¤ 
o 
o 
o 
k2
t1
k3
t2
k4
t3
t4
Beispiel: m = 5
Schlüssel innerhalb eines Knotens sind aufsteigend geordnet: ¤ 
o 
t0
ki sind die Schlüssel, 1 ≤ i ≤ m-­‐1. m-­‐1 ist die Anzahl der Schlüssel im Knoten. ti sind die Zeiger zu den Unterbäumen des Knotens. k1
k1 ≤ k2 ≤ ... ≤ km-­‐1 Alle Schlüssel im Unterbaum ti sind kleiner als ki+1 , für 0 ≤ i < m-­‐1. Alle Schlüssel im Unterbaum tm-­‐1 sind größer als km-­‐1. Die Unterbäume ti , für 0 ≤ i ≤ m-­‐1, sind ebenfalls m-­‐Wege-­‐Bäume. EigenschaDen von m-­‐Wege-­‐Bäumen 40 Baum ist nicht ausgeglichen. o  Bläoer sind auf verschiedenen Stufen o  Bei Veränderungen gibt es keinen Ausgleichsalgorithmus. o  Schlechte Speicherausnutzung, kann zu verkeoeten Listen degenerieren. o  Anzahl der Knoten im vollständigen m-­‐Wege Baum mit Höhe h: −1
m
=
=
∑
ANZ
m m −1
o  Maximale Anzahl n von Schlüsseln: o 
h−1
h
i
K
i=0
¤ 
o 
o 
n ≤ AnzK*(m-­‐1) = mh -­‐1 Völlig degenerierter Baum: n = AnzK = h Grenze für die Höhe eines m-­‐Wege-­‐Baumes: logm(n+1) ≤ h ≤ n. Prinzip des B-­‐Baums 41 o 
B-­‐Baum-­‐Kriterium ¤  Alle Pfade von der Wurzel bis zu den Bläoern sind gleich lang. ¤  Jeder Knoten – außer der Wurzel – enthält zwischen m und 2m Schlüsselwerte. ¤  Jeder Knoten (außer der Wurzel) hat zwischen m+1 und 2m+1 Kinder (Unterbäume). ¤  Die Wurzel ist entweder ein Blao oder hat mindestens 2 Kinder. o 
B-­‐Baum ¤  Ein B-­‐Baum ist ein Baum, der das B-­‐Baum-­‐Kriterium erfüllt (für ein gegebenes m). ¤  m heißt Ordnung eines B-­‐Baums. B-­‐Baum – EigenschaDen der Knoten 1/2 42 e1
e2
e3
geordnet:
e4
∀ Knoten k aus b2:
∀ Elemente e aus k:
e 1 < e < e2
b1
b2
b3
b4
b5
B-­‐Baum – EigenschaDen der Knoten 2/2 43 Baum der Ordnung m:
m < i < 2m
…
e1
e2
e3
ei
Max. Anzahl von
Elementen: 2m
Max. Anzahl von
Unterbäumen: 2m+1
b1
b2
b3
bi
bi+1
B-­‐Baum -­‐ Beispiel 44 25
8
2
4
5
35
15
11
63
12
19
21
22
28
43
31
56
B-­‐Baum: DefiniMon 46 Ein Baum heißt B-­‐Baum der Ordnung m, wenn er folgende EigenschaDen erfüllt: 1.  Jeder Knoten enthält höchstens 2 ⋅ m Elemente. 2.  Jeder Knoten außer dem Wurzelknoten enthält mindestens m Elemente. Der Wurzelknoten enthält mindestens ein Element. 3.  Jeder Knoten ist entweder ein Blao ohne Nachfolger oder hat i+1 Nachfolger, falls i die Anzahl der Elemente ist. 4.  Alle Bläoer liegen auf dem gleichen Niveau. 5.  Ist ei ein Element, dann sind im linken Nachfolgeknoten (vi) alle Schlüssel kleiner und im rechten (vi+1) alle größer (Ordnungskriterium). Bemerkung: Die Terminologie im Zusammenhang mit B-Bäumen ist in der Literatur nicht ganz einheitlich. Oft
wird auch der maximale Verzweigungsgrad (in unserem Fall 2 ⋅ m + 1) als Ordnung bezeichnet –
etwa von D. Knuth. Deshalb muss man die jeweilige Definition immer genau beachten!
B-­‐Bäume: 2-­‐3 Bäume 47 o 
o 
Ein B-­‐Baum der Ordnung 1 hat ¤ 
pro Knoten mindestens 1 höchstens 2 Elemente. ¤ 
pro Knoten mindestens 2 höchstens 3 Kinder. Man nennt einen B-­‐Baum der Ordnung 1 auch 2-­‐3 Baum, wenn man damit die minimale und maximale Anzahl der Kinder eines Knotens angibt. Diese Art der KlassifikaMon von B-­‐Bäumen wird insbesondere dann verwendet, wenn man den maximalen Verzweigungsgrad für die Ordnungsangabe heranzieht. B-­‐Bäume Aufnahmekapazität 48 o 
Maximale Höhe eines B-­‐Baums der Ordnung m bei minimaler Füllung: o 
Sind dort n Knoten unterzubringen, gilt für die Höhe h = logm n. o 
o 
o 
Die Höhe eines B-­‐Baums ist logarithmisch in der Anzahl der gespeicherten Schlüssel beschränkt. Die Ordnung eines B-­‐Baums liegt üblicher Weise bei 50 – 100. B-­‐Bäume sind auch bei einer sehr großen Zahl von gespeicherten Schlüsselwerten besonders niedrig. Frage: Wie viele Schlüssel kann ein B-­‐Baum der Ordnung m = 50 bei einer Höhe von h = 4 maximal aufnehmen? B-­‐Bäume: Suchen 49 o 
o 
o 
Suchen = KombinaMon des Verfolgens von Verweisen (wie im binären Suchbaum) und der Suche in einer sorMerten Folge. Gesucht wird nach dem Wert w. Man beginnt im Wurzelknoten und besMmmt dort den Eintrag, für den gilt: ei ≥ w. o 
Ist ei = w, dann ist man ferMg (man hat w gefunden). o 
Sonst geht man zum Knoten vi , d.h. man folgt dem Verweis, der vor ei liegt. o 
Gibt es kein Element mit ei ≥ w, dann folgt man dem letzen Verweis des Knotens. o 
Findet man den Wert w auch auf einer erreichten Blaoseite nicht, dann ist der Wert nicht im Baum enthalten. Ein Beispiel B-­‐Baum 50 25
31 40
10 20
2
5
7
8
13 14 17 18
22 24
26 27 28
32 38
42 43
B-­‐Baum Einfügen 1/2 51 o 
o 
Ziel: Einfügen eines Wertes (Elements) w in den B-­‐Baum. Die B-­‐Baum EigenschaD (m ≤ Anzahl der Elemente pro Knoten ≤ 2m) darf nicht verletzt werden. 1.  Suchen des Blaoknotens, in dem eingefügt werden muss (müsste). 2.  PosiMon im gefundenen Knoten – mit 3 Fallunterscheidungen: a)  Es gibt 2 Elemente s und b mit s < w < b. b)  Ein Element s als kleinstes Element des Knotens mit w < s; dabei ist s das am weitesten links stehende Element. c)  Ein Element b als größtes Element des Knotens mit b < w; dabei ist b das am weitesten rechts stehende Element. 3.  Einfügen des Elements mit 2 Fallunterscheidungen : a)  Der Knoten enthält bisher < 2m Elemente: dann muss man nur noch an der richMgen PosiMon einfügen. b)  Der Knoten enthält bereits 2m Elemente. Dann platzt der Knoten beim Einfügen eines weiteren Elements. D.h. es muss ein neuer Knoten eingeführt werden, dadurch ändert sich auch die Knotenstruktur des Baums. B-­‐Baum Einfügen 2/2 52 o 
Erzeugen eines neuen Knotens: 1.  Die ersten m Werte bleiben im Originalknoten. 2.  Die letzten m Werte werden in den neuen Knoten verschoben. 3.  Das miolere Element wandert in den Elternknoten nach oben. o 
o 
o 
Da der Elternknoten ein Element mehr aufnimmt, kann er auch platzen (Anzahl der Elemente in Elternknoten > 2m) → der Prozess des Erzeugens eines neuen Knotens beginnt von neuem und setzt sich rekursiv fort bis in den Wurzelknoten. Platzt auch der Wurzelknoten, dann wird auch er geteilt und ein neuer Elternknoten (ein neuer Wurzelknoten) erzeugt, d.h. wächst der Baum um eine Ebene. Feststellung: B-­‐Bäume wachsen in Richtung Wurzel – anders als die bisherigen Bäume. Es gibt eine Ausgleichsvariante è später B-­‐Baum Einfügen 1/2 53 insert 16
25
10 20
2
5
7
8
22 24
13 14 17 18
13 14 16 17 18
13 14
Der Blattknoten platzt !
17 18
Split in 2 Knoten (alten + einen neuen)
B-­‐Baum Einfügen 2/2 54 25
10 16 20
2
5
7
8
13 14
17 18
22 24
B-­‐Baum Löschen 1/3 55 o 
Im Prinzip ähnlich wie Einfügen – nur mit umgekehrten Effekten. Ein Knoten kann defizitär werden, d.h. durch Entnahme kann die Anzahl der Elemente im Knoten < m werden. 1.  Suchen des Knotens, aus dem das Element w en•ernt werden soll. 2.  En•ernen im gefundenen Knoten – mit 2 Fallunterscheidungen: a)  Liegt w in einem Blaoknoten, dann kann das Element gelöscht werden. Bleiben auf dem Blaoknoten weniger als m Elemente übrig, dann ist ein Defizit (Unterlauf) zu behandeln. b)  Liegt w in einem inneren Knoten, dann wird das Element gelöscht und durch das nächst kleinere Element von einem Blaoknoten ersetzt (ähnlich wie beim binärem Suchbaum, wo man das größte Element im linken Teilbaum einsetzte). Bleiben auf dem Blaoknoten weniger als m Elemente übrig, dann ist ein Defizit zu behandeln. Man ist am Ende immer in einem Blaoknoten angekommen. B-­‐Baum Löschen 2/3 56 3.  Behandlung des Defizits (Unterlaufs) mit 2 Fallunterscheidungen: a)  Ausgleichen zweier benachbarter Knoten: wenn der Nachbarknoten n (n > m) Elemente enthält, dann kann sie einen Knoten „abgeben“. Dabei werden die Elemente der beiden beteiligten Knoten sowie das „eingeschlossene“ Element auf dem Elternknoten neu verteilt, so dass beide Kinder(knoten) mindestens m Elemente enthalten. b)  Vereinigen zweier benachbarter Knoten: wenn ein Ausgleich nicht möglich ist – das ist dann der Fall, wenn der Nachbarknoten n = m Elemente enthält – werden die beiden Knoten zusammengefasst. Zusätzlich wird noch das „eingeschlossene“ Element aus dem Elternknoten herunter gezogen. Dieser neue Blaoknoten hat jetzt n = 2m Elemente (m-­‐1 von dem Knoten, wo ein Element en•ernt wurde, m vom Nachbarknoten und 1 vom Elternknoten). c)  Jetzt kann auch der Elternknoten defizitär werden (es wurde ja ein Element entnommen) → der Prozess der Unterlau‚ehandlung eines Knotens beginnt von neuem und setzt sich rekursiv fort bis in den Wurzelknoten. B-­‐Baum Löschen 3/3 57 o 
Wird auch das letzte und einzige Element im Wurzelknoten en•ernt, dann werden die beiden darunter liegenden Knoten vereinigt. Der Baum schrumpD um eine Ebene von der Wurzel her. o 
Feststellung: B-­‐Bäume schrumpfen an der Wurzel – anders als die bisherigen Bäume. B-­‐Baum Löschen mit Ausgleichen 58 delete 22
25
10 20
2
5
7
8
13 14 17 18
31 40
22 24
26 27 28
32 38
42 43
10 18
2
5
7
8
13 14 17
20 24
B-­‐Baum Löschen mit Vereinigen 59 delete 43
25
10 20
2
5
7
8
31 40 50
13 14 17 18
22 24
31 50
26 27 28
32 38 40 42
26 27 28
32 38
42 43
B-­‐Baum Einfügen-­‐Variante 1/2 60 insert 16
25
10 20
2
5
7
8
13 14 17 18
13 14 16 17 18
22 24
Der Blattknoten platzt !
Ausgleich mit Nachbarknoten statt Split.
B-­‐Baum Einfügen-­‐Variante 2/2 61 25
10 18
2
5
7
8
13 14 16 17
20 22 24
B*-­‐Baum (nach Donald Knuth, 1973) ¨ 
¨ 
Knoten müssen mindestens zu 2/3 gefüllt sein (anstao nur 1/2). Durch veränderte Split-­‐Strategie: 2 volle Knoten auf 3 Knoten mit einem Füllgrad von 2/3 auDeilen. B-­‐Bäume: Zusammenfassung 62 o 
o 
o 
Vielleicht die Datenstruktur, die in der Praxis am meisten benutzt wird. B-­‐Bäume sind ausgeglichene m-­‐Wege-­‐Bäume. Man wählt i.A. die Ordnung m gerade so groß, dass jeweils alle Schlüssel eines B-­‐Knotens genau einer page ( = Übertra-­‐
gungseinheit, d.h. Blockgröße bei einem Lesezugriff – typisch 4-­‐16 kByte) entsprechen: ¤ 
¤ 
¤ 
Typische Größen, z.B. m = 50 oder m = 2500. Sehr flache Bäume. Kurzer Weg von der Wurzel zu den Bläoern. Weitere Bäume 63 o 
o 
o 
Bruderbäume „AVL-­‐Bäume mit Bläoern gleichen Niveaus“ ¤  Innere Knoten dürfen nur ein Kind haben Treaps „randomisierte Suchbäume“ ¤  Problem: Einfügen einer Folge geordneter Elemente erzeugt „degenerierten Baum“ (Liste ¤  Abhilfe: Eingabefolgen zufällig vertauschen Digitale Bäume ¤ 
¤ 
Tries Patriciabäume
Herunterladen