Algorithmen und Datenstrukturen SS09 Foliensatz 11 Michael Brinkmeier Technische Universität Ilmenau Institut für Theoretische Informatik Sommersemester 2009 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 1 / 30 Mehrweg-Suchbäume Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 2 / 30 Mehrweg-Suchbäume Idee Statt binärer Bäume sollen Bäume mit variablem Ausgangsgrad verwendet werden. x1 xl ··· T0 T1 Tl−1 Tl x1 < x2 < · · · < xl . Für y ∈ T0 gilt y < x1 Für y ∈ Ti mit 0 < i < l gilt xi < y < xi +1 Für y ∈ Tl gilt y < xl Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 3 / 30 Ein Beispiel Wurzel 7 1 2 4 10 9 16 11 29 13 21 12 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 4 / 30 27 39 35 36 25 38 45 41 48 50 Mehrweg-Suchbäume Definition (Mehrweg-Suchbäume) Mehrweg-Suchbäume (MSBe) über der total geordneten Menge U sind induktiv definiert: Der leere Baum ist ein U-MSB Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und sind T0 , T1 , . . . , Tl U-MSB so dass y < x1 für alle y ∈ T0 , xi < y < xi +1 für alle y ∈ Ti mit 1 < i < l und xl < y für y ∈ Tl dann ist auch (T0 , x1 , T1 , x2 , . . . , xl−1 , Tl−1 , xl , Tl ) ein U-MSB. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 5 / 30 Implementierung von MSB Variante 1: Zwei Listen/Arrays, eine für die Einträge und eine für die Bäume. keys: 10 11 13 trees: l: 3 T0 T2 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 6 / 30 Implementierung von MSB Variante 2: Eine Liste, die die Paare (Ti −1 , xi ) enthält und den Baum Tl einzeln. keys: 10 11 13 last: l: 3 T0 T2 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 7 / 30 2-3-Bäume Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 30 2-3-Bäume Definition (2-3-Bäume) Ein MSB T heißt 2-3-Baum, wenn Jeder Knoten enthält 1 oder 2 Schlüssel (hat also 2 oder drei Kinder) Hat ein Knoten v einen leeren Unterbaum, so sind alle seine Unterbäume leer, d.h. er ist ein Blatt Alle Blätter von T haben dieselbe Tiefe. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 9 / 30 Ein Beispiel I G A O H L M 2-3-Baum Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 10 / 30 T R S U Ein Beispiel I G A B C O H L T M R S U Kein 2-3-Baum, denn ein Knoten enthält zu viele Schlüssel Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 11 / 30 Ein Beispiel I G O L M T R S U Kein 2-3-Baum, denn die Blätter sind nicht auf dem gleichen Level. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 12 / 30 Ein Beispiel I G O A L M T R S U Kein 2-3-Baum, denn ein Knoten hat einen leeren und einen nicht-leeren Unterbaum. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 13 / 30 Die Tiefe von 2-3-Bäumen Lemma Für die Tiefe D eines 2-3-Baumes mit n Einträgen gilt ⌈log3 (n + 1)⌉ − 1 ≤ D ≤ ⌊log(n + 1)⌋ − 1 Beweis: Übungsaufgabe Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 14 / 30 Suche in 2-3-Bäumen lookup(T , x) Eingabe: 2-3-Baum T , Schlüssel x; Ausgabe: true falls der Schlüssel gefunden wurde, sonst false; if T = then return false; if T = (T0 , x1 , T1 ) or T = (T0 , x1 , T1 , x2 , T2 ) then if x == x1 or x == x2 then return true; if x < x1 then return lookup(T0 , x); if (x2 existiert nicht) oder (x < x2 ) then return lookup(T1 , x); return lookup(T2 , x); end Alle Vergleiche mit x2 und T2 werden nur gemacht, wenn die beteiligten Werte definiert sind Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 15 / 30 Suche in 2-3-Bäumen Wenn x im Knoten vx vorhanden ist, dann benötigt die Suche für jeden Knoten u auf dem Weg von der Wurzel zu vx Zeit O(1). Da der Baum Tiefe O(log n) hat, benötigt die Suche somit insgesamt O(log n) Zeit. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 30 Einfügen in 2-3-Bäume Zum Einfügen in 2-3-Bäume benutzen wir die Funktion insert(T , x, r ), die den geänderten Baum T ′ und ein Flag higher zurürck gibt. Dabei gilt higher = ( true false falls T ′ höher als T ist falls T ′ nicht höher als T ist Für den Algorithmus benutzen wird die folgende Invariante: Invariante (I) Ist T ′ höher als T , dann hat T ′ in der Wurzel nur einen Schlüssel. D.h. wir werden insert so gestalten, dass bei einer Zunahme der Höhe sichergestellt ist, dass die Wurzel des jeweiligen Baumes nur einen Schlüssel enthält. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 17 / 30 Einfügen in 2-3-Bäume Fall 1: T = , d.h. wir fügen in einen leeren Baum ein. Erzeuge einen neuen 2-3-Baum-Knoten T ′ mit dem Eintrag (x, r ) und 2 leeren Unterbäumen. Gebe T ′ und true zurürck. Wie man leicht sieht ist die Invariante (I) erfüllt. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 18 / 30 Einfügen in 2-3-Bäume Fall 2: Die Wurzel von T enthält einen Schlüssel x1 und hat die Unterbäume T0 und T1 . Fall 2.1: x < x1 (T0 , sub higher) = insert(T0 , x, r ); if sub higher == false then return T , false; else T ′ wie unten und higher = false; Wegen der Invariante (I) hat T im zweiten Fall die Form T T0′ x1 T′ ⇒ z x1 z T1 ′ T00 ′ T00 ′ T01 T1 ′ T01 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 19 / 30 Einfügen in 2-3-Bäume Fall 2: Die Wurzel von T enthält einen Schlüssel x1 und hat die Unterbäume T0 und T1 . Fall 2.2: x = x1 ⇒ Update data(T ) = r ; higher = false; Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 20 / 30 Einfügen in 2-3-Bäume Fall 2: Die Wurzel von T enthält einen Schlüssel x1 und hat die Unterbäume T0 und T1 . Fall 2.3: x1 < x (T1 , sub higher) = insert(T1 , x, r ); if sub higher == false then return T , false; else T ′ wie unten und higher = false; Wegen der Invariante (I) hat T im zweiten Fall die Form x1 T ⇒ z T0′ x1 T′ z T0 T0 ′ T11 ′ T10 ′ T11 ′ T10 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 21 / 30 Einfügen in 2-3-Bäume Fall 3: Die Wurzel von T enthält zwei Schlüssel x1 < x2 und hat die Unterbäume T0 , T1 und T2 . Fall 3.1: x < x1 Falls sub higher = false ändert sich nichts und man setzt higher = false. Im anderen Fall hat wegen der Invariante (I) T die Form T T0′ x1 x2 ⇒ z T1 ′ T00 T′ ′ T01 x1 x2 z T2 ′ T00 ′ T01 higher = true und wie man sieht ist (I) anschließend erfüllt. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 22 / 30 T1 T2 Einfügen in 2-3-Bäume Fall 2: Die Wurzel von T enthält einen Schlüssel x1 und hat die Unterbäume T0 und T1 . Fall 3.2: x = x1 oder x = x2 ⇒ Update data(T ) = r ; higher = false; Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 23 / 30 Einfügen in 2-3-Bäume Fall 3: Die Wurzel von T enthält zwei Schlüssel x1 < x2 und hat die Unterbäume T0 , T1 und T2 . Fall 3.3: x1 < x < x2 Falls sub higher = false ändert sich nichts und man setzt higher = false. Im anderen Fall hat wegen der Invariante (I) T die Form x1 T T0′ x2 T′ ⇒ z T0 z x1 x2 T2 ′ T10 ′ T11 T0 ′ T10 ′ T11 higher = true und wie man sieht ist (I) anschließend erfüllt. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 30 T2 Einfügen in 2-3-Bäume Fall 3: Die Wurzel von T enthält zwei Schlüssel x1 < x2 und hat die Unterbäume T0 , T1 und T2 . Fall 3.4: x2 < x Falls sub higher = false ändert sich nichts und man setzt higher = false. Im anderen Fall hat wegen der Invariante (I) T die Form T x1 x2 T0′ T0 T′ ⇒ z x2 x1 z T1 ′ T20 ′ T21 T0 T1 ′ T20 T21 higher = true und wie man sieht ist (I) anschließend erfüllt. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 25 / 30 Einfügen in 2-3-Bäume Beobachtung Die Tiefe von 2-3-Bäumen wächst durch das Spalten der Wurzel. Lemma Die Prozedur insert für 2-3-Bäume ist korrekt, d.h. sie erhält die 2-3-Baum-Struktur. Das Einfügen eines Schlüssels in einen 2-3-Baum mit n Schlüsseln benötigt Zeit O(log n) und bewirkt die Erzeugung von höchstens log2 n neuen Knoten. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 26 / 30 Einfügen in 2-3-Bäume Beweis Zu 1): Man kontrolliert in jedem Fall des Algorithmus, dass die 2-3-Baum-Struktur wiederhergestellt wird. Zu 2): Für die Bearbeitung eines Levels in insert wird Zeit O(1) benötigt. Auf jedem der ≤ log n Levels wird höchstens 1 Knoten neu gebildet. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 27 / 30 Löschen aus 2-3-Bäumen Vorgehensweise Falls x gelöscht werden soll, suche den kleinsten Schlüssel y ≥ x, der in einem Blatt gespeichert ist. (y ist der Inorder-Nachfolger von x.) Setze y an die Stelle von x und entferne y . Also wie bei AVL-Bäumen. Fazit Man muss sich nur um das Löschen eines Eintrags y in einem Blatt kümmern. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 28 / 30 Löschen aus 2-3-Bäumen Falls das Blatt noch einen weiteren Eintrag enthält, ist das Löschen einfach, da keine Umstrukturierung nötig ist. Falls das Blatt nur den zu löschenden Schlüssel enthält, ist eine Rebalacierung erforderlich. Ähnlich wie bei den Einfügungen werden flacher gewordene Teilbäume durch lokale Umstellung wieder auf die Höhe der anderen Teilbäume gebracht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 29 / 30