Departement Mathematik und Informatik Algorithmen und Datenstrukturen, FS17 Prof Dr Christian Tschudin 5. April 2017 Suchbäume I Andrew D. Booth Algorithmen und Datenstrukturen, FS17 5. April 2017 — 2 / 30 Uebersicht 2017-04-05 Binary MaxHeap-Technik für Sortieren eingeführt: einmaliges Einfüllen, Bauminhalt selbst ist nur teilweise geordnet. Neues Ziel: – vollständig geordnete Bäume für schnelle Suche – Elemente mit O(log n) zur Laufzeit einfügen, entfernen, etc – aber ohne die Sortierung zu verlieren. I I I I I Binäre Suchbäume (1960) ALV-Baum (1962) Mehrweg-Suchbaum, insb. (2,4)-Baum Rot-Schwarz-Baum (1972) B-Baum (1971) Algorithmen und Datenstrukturen, FS17 5. April 2017 — 3 / 30 Wiederholung I Was ist der “springende Punkt” von Quicksort? I Wie kann man in linearer Zeit sortieren? – welcher Trick verwendet von Radix-Sort? – was ist ein Nachteil (z.B. gegenüber Merge-/Quicksort)? I War Heapsort wirklich so schlecht? zwar keine Rekursion und in-place, aber schlechte Datenlokalität Algorithmen und Datenstrukturen, FS17 5. April 2017 — 4 / 30 Vorwegnahme Resultat Suchbäume “ordered operations” = suchen, einfügen, Minimum finden, Maximum finden, grösstesElement-kleiner-als-X, kleinstes-Element-grösser-als-X, AnzahlElemente-kleiner-als-X, Zugriff-via-Position, Minimum löschen, Maximum löschen, löschen, Anzahl-Element-zwischen-X-und-Y. Algorithmen und Datenstrukturen, FS17 5. April 2017 — 5 / 30 Symboltabellen-ADT (key-val store) Geordnete Suchbäume eigenen sich zur Implementierung von sog. Symboltabellen, d.h. Schlüsselwert ist ein Symbol. In Datenbank-Terminologie auch “key-value store”: 1 2 3 4 5 6 7 8 9 10 public class KeyValueStore<Key, Value> { void put(Key key, Value val); Value get(Key key); void delete(Key key); boolean contains(Key key); boolean isEmpty(); Key min(); Key max(); ... } Wird auch “assoziatives Feld” genannt: Statt Integer- Index kann beliebiger Schlüssel verwendet werden, z.B. a["str"] = "Spiegelgasse"; Algorithmen und Datenstrukturen, FS17 5. April 2017 — 6 / 30 Symboltabelle mit verkett. Liste oder Feld Schon gesehen: I (Doppelt) verkettete Liste – “Suche” ist O(n) – “Einfügen” und “Löschen” ebenfalls I Verwende zwei Felder (je eines für Schlüssel und Werte): – Feld für die Schlüssel wird sortiert gehalten – “Suche” in O(log n) – “Einfügen” und “Löschen” weiterhin O(n) Kann mit Bäumen mehr herausgeholt werden? Algorithmen und Datenstrukturen, FS17 5. April 2017 — 7 / 30 Definition “Binärer Suchbaum” (BST) Binärer Suchbaum = Binärer Baum, bei dem für jeden internen Knoten K gilt: alle Schlüssel in seinem linken Teilbaum sind kleiner als der Schlüssel von K , alle Schlüssel im rechten Teilbaum grösser als der Schlüssel von K . BST = binary search tree Algorithmen und Datenstrukturen, FS17 5. April 2017 — 8 / 30 Binäre Suche im Baum 1 2 3 4 5 6 7 8 9 10 11 Node findPosition(Node pos, Key key) { if (BST.isLeaf(pos)) return pos; // (Kandidat) gefunden Key curKey = BST.key(pos); if (key < curKey) return BST.findPosition(BST.left(pos)); if (key > curKey) return BST.findPosition(BST.right(pos)); return pos; // (Kandidat) gefunden } Bemerkung: Liefert “Kandidaten”-Knoten – Aufrufer muss prüfen, ob der angefragte Schlüssel auch wirklich passt. Algorithmen und Datenstrukturen, FS17 5. April 2017 — 9 / 30 Einfügen im binären Suchbaum (1/2) Zwei Phasen: I Phase 1: Suche ob Knoten vorhanden mittels findPosition() w sei die zurückgegebene Position. I Phase 2: Einfügen I I Falls w ein Blatt ist, kann dort direkt eingefügt werden (expandExternal()) Sonst existiert schon ein Knoten. Falls anderer Schlüssel: Aufruf von findPosition() auf rechtem Kind und rekursives Anwenden von Phase 2. Algorithmen und Datenstrukturen, FS17 Einfügen im binären Suchbaum (2/2) 5. April 2017 — 10 / 30 Algorithmen und Datenstrukturen, FS17 5. April 2017 — 11 / 30 Löschen im BST (1/3): 3 Fälle Baustein als Vorbereitung: deleteMin() rekurs. Prozedur, gibt neuen Unterbaum zurück. Algorithmen und Datenstrukturen, FS17 5. April 2017 — 12 / 30 Löschen im BST (1/2): Hibbards Ansatz Ansatz (Hibbard): Ersetze Knoten durch seinen “Nachfolger” 1. Sei t Variable mit Zeiger auf zu löschenden Knoten 2. Sei x Variable mit Zeiger auf Nachfolger min(t.right) 3. Setze rechtes Kind von x auf deleteMin(t.right) (dies entfernt x aus dem Baum) Die Kinder im rechten Unterbaum sind (weiterin) alle grösser als x.key 4. Setze linkes Kind von x auf t.left In diesem Unterbaum sind alle Schlüssel kleiner als x.key und dessen Nachfolger. Schliesslich: x ersetzt t (im Elternknoten von t). Auch mit Vorgänger möglich, am besten zufällig wählen. Algorithmen und Datenstrukturen, FS17 5. April 2017 — 13 / 30 Löschen im BST (2/2): “Nachfolger vor!” Algorithmen und Datenstrukturen, FS17 5. April 2017 — 14 / 30 “Ordered Operations” im BST Diskussion: I Die Kosten aller Operationen im binären Suchbaum sind proportional zur Tiefe des Baums. I Im Idealfall ist der Baum balanciert – führt zu O(log n) I ”Bösartiges” Einfügen und Löschen kann aber dazu führen, dass der binäre Suchbaum degeneriert → “linked List” I Deshalb gilt O(n) für BST Algorithmen und Datenstrukturen, FS17 5. April 2017 — 15 / 30 Andrew Donald Booth (1918 – 2009) I Engländer. Verlässt Uni Cambridge ohne Abschluss, dann “externer Abschluss” Universität London, Promotion Uni Birmingham in Röntgenkristallographie. I Baut dort wegen vielen Rechnungen den ersten Computer von Grossbritanien. I Stipendium für Princeton, USA – Besuch der Gruppe von John von Neumann – zurück in England: erster Magnettrommelspeicher (1948) I Booth-Multiplizieralgorithmus: – effiziente Integermultiplikation mit log. Gatter (1951) I Arbeiten in Uebersetzung (natürlicher) Sprachen (1955) I Erfindet mit Windley, Colin und Hibbard die BST (1960) Algorithmen und Datenstrukturen, FS17 5. April 2017 — 16 / 30 AVL-Suchbaum (1/8) AVL-Suchbaum = binärer Suchbaum, der weitgehend ausgeglichen ist. D.h. für jeden internen Knoten sind die Höhen der Teilbäume seiner Kinder höchstens um 1 verschieden. (AVL = Adel‘son-Vel‘skii & Landis, 1962). I Verhindern eines degenerierten Baumes durch sofortiges Korrigieren bei Ungleichgewicht – bei Einfügen – bei Löschen I Ausgleich muss mit konstantem Aufwand erfolgen I (Alternativ: amortisierter Aufwand) Algorithmen und Datenstrukturen, FS17 5. April 2017 — 17 / 30 AVL-Suchbaum (2/8): Beispiel Beispiel ausgeglichener Baum (Höhen sind rot eingezeichnet) Betrachte nun Einfügen von Schlüssel 54 . . . Algorithmen und Datenstrukturen, FS17 5. April 2017 — 18 / 30 AVL-Suchbaum (3/8): Einfügen I I Neues Element führt zuerst zu unbalanciertem Baum (Knoten 78 und 44 sind nicht ausgeglichen) Durch “Beförderung” von Knoten 62 (und “Degradierung” von 78) wird Baum wieder ausgeglichen. Algorithmen und Datenstrukturen, FS17 5. April 2017 — 19 / 30 AVL-Suchbaum (4/8): Wie ausgleichen? Es sei x der erste Knoten auf dem Weg zur Wurzel dessen Grosselternknoten z nicht ausgeglichen ist. Knoten y sei der dazwischenliegende Elternknoten von x bzw. Kindknoten von z. Der Teilbaum, der an y hängt, ist zu “schwer”. Vier mögliche Konfigurationen: Algorithmen und Datenstrukturen, FS17 5. April 2017 — 20 / 30 AVL-Suchbaum (5/8): Ausgleich-Algo I Sei a, b und c eine Inorder-Nummerierung der Knoten x, y und z. I Sei T0 , T1 , T2 , T3 eine Inorder-Nummerierung der 4 Teilbäume, die an x, y und z hängen, aber nicht an diesen Knoten verwurzelt sind. I Ersetze den Teilbaum mit Wurzel z durch einen neuen Teilbaum mit Wurzel b. I Knoten a wird linkes Kind, Knoten c wird rechtes Kind von b. I T0 , T1 sind die Teilbäume von a, T2 , T3 diejenigen von c. Wir schauen im Folgenden nur zwei der vier Fälle an. Algorithmen und Datenstrukturen, FS17 5. April 2017 — 21 / 30 AVL-Suchbaum (6/8): “Rechte Kette” Zur Erinnerung: z ist nicht ausgeglichen und der Teilbaum x “ist zu schwer”. Wie die Höhe verkleinern? Ansatz: Hänge die drei Knoten z, y, x neu an y auf statt z. Algorithmen und Datenstrukturen, FS17 5. April 2017 — 22 / 30 AVL-Suchbaum (7/8): “Rechter Winkel” Ansatz: – zuerst b befördern, d.h. c degradieren – entstandene Kette in der Mitte statt links anhängen Algorithmen und Datenstrukturen, FS17 5. April 2017 — 23 / 30 AVL-Suchbaum (8/8): Komplexität, WBT I I I Einsetzen und Löschen ist nun O(n log n) Baum kann aber “einseitig” sein (Geschwisterknoten mit sehr unterschiedlicher Knotenzahl) Rot-Scharz-Bäume (siehe später) haben das gleiche Problem – → weight-balanced binary trees (WBT) – WBT von grosser Bedeutung für funktionale – Sprachen (Haskell, Scheme) Algorithmen und Datenstrukturen, FS17 5. April 2017 — 24 / 30 Mehrweg-Suchbaum (1/6): “multiway” Geordnete Bäume (i.a. nicht binär) Eigenschaften von d-Bäumen: I Jeder interne Knoten hat mindestens 2 Kinder I Jeder interne d-Knoten speichert eine Folge von d − 1 Einträgen < Si , Ei >, wobei S1 ≤ S2 ≤ . . . ≤ Sd−1 . Es seien ferner S0 = −∞ und Sd = +∞ zwei implizite Schlüssel. I Seien v1 , v2 , . . . , vd die Kinder eines d-Knotens v . Für alle Einträge < S, E >, die in den Teilbäumen mit Wurzel vi liegen, gilt: Si−1 ≤ S ≤ Si , i = 1, . . . , d. Ein BST ist ein 2-Baum (ein Schlüssel und zwei Kinder) Algorithmen und Datenstrukturen, FS17 5. April 2017 — 25 / 30 Mehrweg-Suchbaum (2/6): Beispiel Beispiel eines 2-3 Baumes (enthält sowohl 2-Knoten also auch 3-Knoten) Algorithmen und Datenstrukturen, FS17 5. April 2017 — 26 / 30 Mehrweg-Suchbaum (3/6): (2-4)-Baum Spezieller Mehrweg-Suchbaum: (2-4) Baum I Jeder Knoten hat mind. 2 und höchstens 4 Kinder. I Alle Blätter haben dieselbe Tiefe. Algorithmen und Datenstrukturen, FS17 5. April 2017 — 27 / 30 (2-4)-Suchbaum (4/6): Einfüg-Algo Normalfall: – Einfügen in bestehenden Knoten – Baumtiefe bleibt unverändert Ueberlauf: Es sei S1 , S2 , S3 und S4 die fiktive Einordnung des neuen Schlüssels mit den 3 schon vorhandenen Schlüsseln von Knoten v . I Knoten v durch 2 Knoten v1 und v2 ersetzen. I v1 erhält S1 und S2 ; v2 erhält S4 . I S3 nach “oben” geben: – Falls v die Wurzel ist, neuen Knoten erzeugen, – sonst S3 am Elternknoten einordnen. Algorithmen und Datenstrukturen, FS17 (2-4)-Suchbaum (5/6): Bsp Einfügen 5. April 2017 — 28 / 30 Algorithmen und Datenstrukturen, FS17 5. April 2017 — 29 / 30 (2-4)-Suchbaum (6/6): Bsp Einfügen Algorithmen und Datenstrukturen, FS17 Rot-Schwarz-Baum → nächste Lektion 5. April 2017 — 30 / 30