70 likes | 247 Views
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
E N D
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*nDatensätze (Einträge) aufnehmen ❍ n heißt Ordnung des B-Baumes ❍ jede Seite (außer der Wurzel) enthält stets mDatensä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: • 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: • 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: • 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]