B-Baum

Werbung
Bäume
• Kernidee: Speicherung von Daten in einer Baumstruktur
• Grundtechnik in nahezu allen DB-Systemen
• Elemente = Wurzel, Knoten, Blätter, Kanten
• Balancierte (ausgeglichene) Bäume =
– alle Pfade von Wurzel zu Blättern gleich lang
– Jeder Knoten weist gleich viele Indexeinträge auf
B-Baum
B steht nicht für Binär-Baum!!!!! Sondern
für Balanciert !
• Jede Seite außer der Wurzel enthält
zwischen m und 2m Daten.
B-Baum - Eigenschaften und Merkmale
❍ Knoten = Speicherblöcke (Seiten) fester Länge
❍ jede Seite kann bis zu 2*n Datensätze (Einträge) aufnehmen
❍ n heißt Ordnung des B-Baumes
❍ jede Seite (außer der Wurzel) enthält stets m Datensätze
fester Länge, wobei gilt: n ≤ m ≤ 2*n
❍ jeder Eintrag hat einen Schlüsselteil und einen Datenteil
(Datenteil enthält oft nur Zeiger auf den „echten“ Datensatz)
❍ die Datensätze innerhalb einer Seite sind aufsteigend nach
Primärschlüssel geordnet
❍ eine Seite ist entweder Blattseite oder sie hat m+1 Nachfolger
❍ alle Blattseiten befinden sich auf derselben Höhe
Suchen nach Schlüssel S:
1. Lese Wurzelseite
2. Suche S in Seite:
❍ gefunden: {gib Datensatz aus; fertig!}
❍ nicht gefunden:
􀁑 Seite ist Blatt: {Schlüssel nicht in Baum; fertig!}
􀁑 Seite ist kein Blatt:
● bestimme kleinstes Ki mit S < Ki:
􀁑 {setze Suche in Block pi fort}
● solches Ki nicht vorhanden:
􀁑 {setze Suche in Block pm+1 fort}
Einfügen von Schlüssel S:
1. Suche S in Baum:
❍ gefunden: {Fehlermeldung; fertig!}
❍ nicht gefunden: {b = Block (Blattseite), in der die Suche nach S
abgebrochen wurde}
2. Füge S in b ein:
❍ b hat noch Platz: {Einfügen; fertig!}
❍ b läuft über: (*)
1. Füge S temporär in b ein.
2. „Mittlerer“ Schlüssel in b ist nun Kn+1.
3. Splitte b in blinks (K1 ... Kn) und brechts (Kn+2 ... K2*n).
4. Setze S zu Kn+1.
5. Füge S in Vater von b ein; setze Pointer in Vater von b auf
blinks und brechts.
Falls Vaterknoten überläuft, setze b := Vaterknoten, dann
weiter bei (*). Ggf. wird hierbei ein neuer Wurzelknoten erzeugt
(d.h. der B-Baum wächst um eine Stufe).
Löschen von Schlüssel S:
1. Suche S in Baum:
❍ nicht gefunden: {Fehlermeldung; fertig!}
❍ gefunden: {b ist der Block, in dem S gefunden wurde}
2. Lösche S in b:
❍ b ist Blatt:
􀁑 b hat nach Löschung noch mind. n Einträge: {fertig!}
􀁑 b hat weniger als n Einträge:
{⇒ Unterlaufbehandlung; fertig!}
❍ b ist kein Blatt:
1. Ersetze S in b durch größtes (kleinstes) Blattelement
(⇒ Blatt b') im linken (rechten) Teilbaum von S;
2. Führe ggf. Unterlaufbehandlung für b' durch; fertig!}
❒ Unterlaufbehandlung: {b ist der Unterlauf-Knoten}
❍ b hat einen linken (rechten) Bruder mit genau n Einträgen:
{⇒ Zusammenfassen; ggf. Unterlaufbehandlung für
Vaterknoten; fertig!}
[Anmerkung: Gilt sowohl für Blatt als auch Nicht-Blatt]
❍ sonst:
􀁑 b ist Blatt: {führe „kleine“ Rotation über Vaterknoten nach
rechts (links) aus; fertig!}
􀁑 b ist kein Blatt:
{führe „große“ Rotation über Vaterknoten mit linkem (rechtem)
Bruder-Teilbaum von b aus; fertig!}
[Anmerkung: Ausgleich durch Umhängen eines ganzen Teilbaumes]
Herunterladen