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]