Binäre Suchbäume Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps Mengen n Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: Mengen n Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: n n Einfügen eines Elements Löschen eines Elements Mengen n Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: n n n Einfügen eines Elements Löschen eines Elements Suchen eines Elements Mengen n Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: n n n n Einfügen eines Elements Löschen eines Elements Suchen eines Elements Anforderung: effizient auch bei grossen Mengen! Mengen: Anwendungen (I) n Telefonbuch (Menge von Namen mit zugehörigen Telefonnummern) n n n Einfügen: Neue Telefonanschlüsse Löschen: Aufgegebene Telefonanschlüsse Suchen: Telefonnummer einer Person Mengen: Anwendungen (II) n Nutzerverwaltung (Menge von Nutzern mit Passwörtern und/oder weiteren Informationen) n n n Einfügen: Neue Nutzer Löschen: Ex-­Nutzer Suchen: Einloggen Mengen: Anwendungen (II) n Nutzerverwaltung (Menge von Nutzern mit Passwörtern und/oder weiteren Informationen) n n n n Einfügen: Neue Nutzer Löschen: Ex-­Nutzer Suchen: Einloggen Effizienz: Keine Wartezeit beim Ein-­ loggen, auch bei Millionen von Nutzern. Mengen: Lösung mit Listen ? n Menge wird als Liste gespeichert. 0 1 6 5 8 9 7 3 Mengen: Lösung mit Listen ? n Menge wird als Liste gespeichert. n Einfügen: zum Beispiel vorne anfügen (effizient) 2 1 6 5 8 0 9 7 3 Mengen: Lösung mit Listen ? n Menge wird als Liste gespeichert. n Einfügen: zum Beispiel vorne anfügen (effizient) 2 1 6 5 8 0 9 7 3 Mengen: Lösung mit Listen ? n Menge wird als Liste gespeichert. n Löschen: Durchlaufen der Liste bis zum Element (oder bis zum Ende, falls nicht vorhanden), Zeiger umhängen. 2 1 6 5 8 0 9 7 3 Mengen: Lösung mit Listen ? n Menge wird als Liste gespeichert. n Suchen: Durchlaufen der Liste bis zum Element (oder bis zum Ende, falls nicht vorhanden). 2 1 6 5 8 0 9 7 3 Mengen: Lösung mit Listen ? n Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-­ portional zu n. Mengen: Lösung mit Listen ? n n Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-­ portional zu n. Soziales Netzwerk: Zeit zum Einloggen wäre proportional zur Anzahl der Nutzer. Mengen: Lösung mit Listen ? n Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen Mengen: Lösung mit Listen ? n Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen List l; for (int i=0; i<10000000; ++i) l.push_front(i); // ...and search for i = 0..99 for (int i=0; i<100; ++i) l.find(i); Mengen: Lösung mit Listen ? n Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen List l; for (int i=0; i<10000000; ++i) l.push_front(i); // ...and search for i = 0..99 for (int i=0; i<100; ++i) 6.5 Sekunden l.find(i); Mengen: Lösung mit Listen ? n Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen Facebook hat 1,400,000,000 List l; for (int i=0; i<10000000; ++i) Nutzer, eine Suche würde l.push_front(i); 10 Sekunden dauern! // ...and search for i = 0..99 for (int i=0; i<100; ++i) 6.5 Sekunden l.find(i); Mengen: Lösung mit Binären Suchbäumen. n n Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-­ portional zu log2 n. Facebook: Zeit zum Einloggen ist proportional zum Logarithmus der Anzahl der Nutzer. Mengen: Lösung mit Binären Suchbäumen. n n Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-­ portional zu log2 n. Facebook: Zeit zum Einloggen ist proportional zum Logarithmus der Anzahl der Nutzer. log2 (1,400,000,000) ≈ 30. Mengen: Lösung mit Binären Suchbäumen. n n Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-­ portional zu log2 n. Auch Einfügen und Löschen geht in Zeit proportional to log2 n. Binärbäume, Definition und Terminologie n Ein binärer Baum ist entweder leer,... Binärbäume, Definition und Terminologie n n Ein binärer Baum ist entweder leer,... oder er besteht aus einem Knoten (Kreis) n mit einem Schlüssel (hier: ganze Zahl),... 3 Binärbäume, Definition und Terminologie n n Ein binärer Baum ist entweder leer,... oder er besteht aus einem Knoten (Kreis) n n mit einem Schlüssel (hier: ganze Zahl),... und einem linken und rechten Teilbaum, die jeweils Binärbäume sind. 3 Binärbäume, Definition und Terminologie n n Ein binärer Baum ist entweder leer,... oder er besteht aus einem Knoten (Kreis) n n mit einem Schlüssel (hier: ganze Zahl),... und einem linken und rechten Teilbaum, die jeweils Binärbäume sind. 3 Linker Teilbaum Wurzel des Baums Rechter Teilbaum Binäre Suchbäume n Ein Binärbaum heisst binärer Suchbaum, wenn er leer ist, oder wenn folgende Bedingungen gelten: n n Sowohl der linke als auch der rechte Teilbaum sind binäre Suchbäume. Der Schlüssel der Wurzel ist n n > alle Schlüssel im linken Teilbaum, und ≦ alle Schlüssel im rechten Teilbaum. Binäre Suchbäume: Beispiel 4 3 8 1 6 2 5 9 7 Binäre Suchbäume: Beispiel 4 3 8 1 6 2 5 9 7 Blätter des Baums Binäre Suchbäume: Suchen nach einem Schlüssel 5 ? 4 3 8 1 6 2 5 9 7 Binäre Suchbäume: Suchen nach einem Schlüssel 4 = 5 ? 3 8 1 6 2 nein 5 9 7 Binäre Suchbäume: Suchen nach einem Schlüssel 4 > 5 ? 3 8 1 6 2 Nein, also muss die 5 rechts sein. 5 9 7 Binäre Suchbäume: Suchen nach einem Schlüssel 4 3 8 1 6 2 5 = 5 ? nein 9 7 Binäre Suchbäume: Suchen nach einem Schlüssel 4 3 Ja, also muss die 5 links sein. 1 6 2 5 8 > 5 ? 9 7 Binäre Suchbäume: Suchen nach einem Schlüssel 4 3 8 1 6 2 5 = 5 ? 7 nein 9 Binäre Suchbäume: Suchen nach einem Schlüssel 4 3 1 8 Ja, also muss die 5 links sein. 2 5 6 > 5 ? 7 9 Binäre Suchbäume: Suchen nach einem Schlüssel 4 3 8 1 6 2 5 = 5 ? 9 7 Ja, Schlüssel gefunden! Binäre Suchbäume: Suchen nach einem Schlüssel 0? 4 3 8 1 0 müsste links von der 1 sein, Teilbaum ist aber leer ⇒ 0 nicht da. 6 2 5 9 7 Mengen: Lösung mit binären Suchbäumen n Speichere die Elemente der Menge als Schlüssel in einem binären Suchbaum! Mengen: Lösung mit binären Suchbäumen n n Speichere die Elemente der Menge als Schlüssel in einem binären Suchbaum! Suchzeit ist proportional zur Höhe des Baums (Länge des längsten Pfades von der Wurzel bis zu einem Blatt). Mengen: Lösung mit binären Suchbäumen 4 3 8 1 6 2 5 9 7 Höhe 3 Mengen: Lösung mit binären Suchbäumen n n n Speichere die Elemente der Menge als Schlüssel in einem binären Suchbaum! Suchzeit ist proportional zur Höhe des Baums (Länge des längsten Pfades von der Wurzel bis zu einem Blatt). Einfügen und Löschen von Elementen? Binäre Suchbäume: Einfügen n Neues Element suchen und als Blatt an der passenden Stelle anhängen! Binäre Suchbäume: Einfügen 0 einfügen 4 3 8 1 0 müsste links von der 1 sein, Teilbaum ist aber leer ⇒ neues Blatt 6 2 5 9 7 Binäre Suchbäume: Einfügen 0 einfügen 4 3 8 1 0 6 2 5 9 7 Binäre Suchbäume: Einfügen n n Neues Element suchen und als Blatt an der passenden Stelle anhängen! Auch die Einfügezeit ist proportional zur Höhe des Baums. Binäre Suchbäume: Löschen n Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen! Binäre Suchbäume: Löschen n n Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen! Rotation: lokale Operation, welche die Positionen von Knoten verändert, nicht jedoch die Suchbaumeigenschaften. Rotation eines Teilbaums s t B A B Rotation eines Teilbaums s t C A B A < t ≦ B < s ≦ C Rotation eines Teilbaums Rechtsrotation s t t s C A A B A < t ≦ B < s ≦ C B = C A < t ≦ B < s ≦ C Rotation eines Teilbaums Rechtsrotation s t Linksrotation t s C A A B A < t ≦ B < s ≦ C B = C A < t ≦ B < s ≦ C Binäre Suchbäume: Löschen 8 löschen 4 3 8 1 6 2 5 9 7 Binäre Suchbäume: Löschen 8 löschen 4 3 8 1 6 2 5 A C 7 9 B Rechtsrotation (Linksrotation wäre auch möglich) Binäre Suchbäume: Löschen 8 löschen 4 3 1 6 5 8 A B 2 C 7 9 Binäre Suchbäume: Löschen 8 löschen 4 3 1 6 5 B und C sind leere Bäume 8 A 2 Linksrotation (Rechtsrotation wäre auch möglich) 7 9 B C Binäre Suchbäume: Löschen 8 löschen 4 3 1 6 B und C sind leere Bäume 5 2 9 C 8 A B 7 Binäre Suchbäume: Löschen 8 löschen 4 3 1 6 A, B, C sind leere Bäume 5 9 8 C 2 Rechtsrotation (Linksrotation wäre nicht möglich) 7 A B Binäre Suchbäume: Löschen 8 löschen 4 3 1 6 A, B, C sind leere Bäume 5 9 7 2 A 8 B C Binäre Suchbäume: Löschen 8 löschen 4 3 1 6 5 9 7 2 delete 8 Binäre Suchbäume: Löschen n n n Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen! Rotation: lokale Operation, welche die Positionen von Knoten verändert, nicht jedoch die Suchbaumeigenschaften. Auch die Löschzeit ist proportional zur Höhe des Baums (nicht mehr ganz so offensichtlich) Die Höhe eines binären Suchbaums... n bestimmt die Laufzeit des n n n Suchens, Einfügens, Löschens. Die Höhe eines binären Suchbaums... n bestimmt die Laufzeit des n n n n Suchens, Einfügens, Löschens. kann aber bereits bei einer ungünstigen Einfügereihenfolge sehr gross werden! Die Höhe eines binären Suchbaums... n bestimmt die Laufzeit des n n n n n Suchens, Einfügens, Löschens. kann aber bereits bei einer ungünstigen Einfügereihenfolge sehr gross werden! Laufzeit im schlimmsten Fall nicht besser als bei einer Liste! Die Höhe eines binären Beispiel: Einfügen in Suchbaums... sortierter Reihenfolge 1 Die Höhe eines binären Beispiel: Einfügen in Suchbaums... sortierter Reihenfolge 1 2 Die Höhe eines binären Beispiel: Einfügen in Suchbaums... sortierter Reihenfolge 1 2 3 Die Höhe eines binären Beispiel: Einfügen in Suchbaums... sortierter Reihenfolge 1 2 3 n Höhe = n-­1, Baum sieht aus und verhält sich wie eine Liste. Abhilfe: Balancierung n Beim Einfügen und Löschen stets darauf achten, dass der Baum „balanciert“ ist, (d.h. keine grossen Höhenunterschiede zwischen linken und rechten Teil-­ bäumen) Abhilfe: Balancierung n n Beim Einfügen und Löschen stets darauf achten, dass der Baum „balanciert“ ist, (d.h. keine grossen Höhenunterschiede zwischen linken und rechten Teil-­ bäumen) Verschiedene Möglichkeiten (mehr oder weniger kompliziert): n AVL-­Bäume, Rot-­Schwarz-­Bäume,... Abhilfe: Balancierung n n Beim Einfügen und Löschen stets darauf achten, dass der Baum „balanciert“ ist, (d.h. keine grossen Höhenunterschiede zwischen linken und rechten Teil-­ bäumen) Verschiedene Möglichkeiten (mehr oder weniger kompliziert): n n AVL-­Bäume, Rot-­Schwarz-­Bäume,... Hier: Treaps (randomisierte Suchbäume) Treap = Tree + Heap n Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten: n n Sowohl der linke als auch der rechte Teilbaum sind Heaps. Der Schlüssel der Wurzel ist n das Maximum aller Schlüssel. Heap: Schlüssel heissen Prioritäten n Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten: n n Sowohl der linke als auch der rechte Teilbaum sind Heaps. Die Priorität der Wurzel ist n das Maximum aller Prioritäten. Heap: Beispiel 9 7 8 4 6 3 2 5 1 Treaps n Ein Binärbaum heisst Treap, wenn jeder Knoten einen Schlüssel und eine Priorität hat, so dass folgende Eigen-­ schaften gelten: n n Der Baum ist ein binärer Suchbaum bzgl. der Schlüssel. Der Baum ist ein Heap bzgl. der Prioritäten. Treap: Beispiel Schlüssel Prioritäten 4, 9 3, 7 8, 8 1, 4 6, 6 2, 3 5, 2 9, 5 7, 1 Treaps: Eindeutigkeit n Satz: Für n Knoten mit verschiedenen Schlüsseln und Prioritäten gibt es genau einen Treap mit diesen Knoten. Treaps: Eindeutigkeit n n Satz: Für n Knoten mit verschiedenen Schlüsseln und Prioritäten gibt es genau einen Treap mit diesen Knoten. Beweis: Die Wurzel ist der Knoten mit der höchsten Priorität;; im linken Teilbaum sind alle Knoten mit kleineren und im rechten Teilbaum alle Knoten mit grösseren Schlüsseln. Mit Induktion sind die Teilbäume auch eindeutig. Treaps mit zufälligen Prioritäten n Wir benutzen einen Treap als binären Suchbaum. Treaps mit zufälligen Prioritäten n n Wir benutzen einen Treap als binären Suchbaum. Beim Einfügen eines neuen Schlüssels wird seine Priorität zufällig gewählt. Treaps mit zufälligen Prioritäten n n n Wir benutzen einen Treap als binären Suchbaum. Beim Einfügen eines neuen Schlüssels wird seine Priorität zufällig gewählt. Wie bei normalen binären Suchbäumen: neuer Knoten wird neues Blatt. Treaps mit zufälligen Prioritäten n n n n Wir benutzen einen Treap als binären Suchbaum. Beim Einfügen eines neuen Schlüssels wird seine Priorität zufällig gewählt. Wie bei normalen binären Suchbäumen: neuer Knoten wird neues Blatt. Zusätzlich muss die Treap-­Eigenschaft wieder hergestellt werden! Treaps: Einfügen 4, 9 0 einfügen, mit zufälliger Priorität 7.5 3, 7 8, 8 1, 4 6, 6 2, 3 5, 2 9, 5 7, 1 Treaps: Einfügen 4, 9 0 einfügen, mit zufälliger Priorität 7.5 3, 7 8, 8 1, 4 0, 7.5 Neues Blatt 6, 6 2, 3 5, 2 9, 5 7, 1 Treaps: Einfügen 4, 9 0 einfügen, mit zufälliger Priorität 7.5 3, 7 8, 8 1, 4 6, 6 9, 5 Heap-­Eigenschaft verletzt: 4 < 7.5 0, 7.5 2, 3 5, 2 7, 1 Treaps: Einfügen 4, 9 0 einfügen, mit zufälliger Priorität 7.5 3, 7 8, 8 1, 4 0, 7.5 6, 6 2, 3 5, 2 Rechtsrotation! 9, 5 7, 1 Treaps: Einfügen 4, 9 0 einfügen, mit zufälliger Priorität 7.5 3, 7 8, 8 0, 7.5 6, 6 9, 5 1, 4 2, 3 5, 2 7, 1 Treaps: Einfügen 4, 9 0 einfügen, mit zufälliger Priorität 7.5 3, 7 0, 7.5 8, 8 Heap-­Eigenschaft verletzt: 7 < 7.5 6, 6 9, 5 1, 4 2, 3 5, 2 7, 1 Treaps: Einfügen 4, 9 0 einfügen, mit zufälliger Priorität 7.5 3, 7 8, 8 0, 7.5 6, 6 9, 5 1, 4 2, 3 5, 2 Rechtsrotation! 7, 1 Treaps: Einfügen 4, 9 0 einfügen, mit zufälliger Priorität 7.5 0, 7.5 8, 8 3, 7 6, 6 9, 5 1, 4 2, 3 5, 2 7, 1 Treaps: Einfügen 4, 9 0, 7.5 0 einfügen, mit zufälliger Priorität 7.5 Heap-­Eigenschaft ok, wir haben wieder einen Treap! 3, 7 6, 6 9, 5 1, 4 2, 3 5, 2 8, 8 7, 1 Treaps: Löschen n Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen! Treaps: Löschen n n Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen! Stets so rotieren, dass der Knoten mit seinem Nachfolger höherer Priorität vertauscht wird. Das erhält die Heap-­ Eigenschaft. Treaps: Löschen n n n Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen! Stets so rotieren, dass der Knoten mit seinem Nachfolger höherer Priorität vertauscht wird. Das erhält die Heap-­ Eigenschaft. Suchbaum-­Eigenschaft gilt wieder nach Löschen des Blatts. Treaps: Laufzeit n Satz (Seidel, Aragon 1996): In einem Treap über n Knoten mit zufälligen Prioritäten ist der zeitliche Aufwand für eine Einfüge-­, Lösch-­ oder Suchopera-­ tion im Erwartungswert proportional zu log2n. Treaps: Laufzeit Mengen: Lösung mit Treaps n Zur Erinnerung: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen List l; for (int i=0; i<10000000; ++i) l.push_front(i); // ...and search for i = 0..99 for (int i=0; i<100; ++i) 6.5 Sekunden l.find(i); Mengen: Lösung mit Treaps n Neu: Suche nach den gleichen 100 Elementen in einem Treap von 10,000,000 Elementen Treap t; for (int i=0; i<10000000; ++i) t.insert(i); // ...and search for i = 0..99 for (int i=0; i<100; ++i) 0.017 Sekunden t.find(i); Sortieren mit Treaps n Folgerung: Durch Einfügen einer Folge von n Zahlen in einen Treap mit zufäl-­ ligen Prioritäten kann die Folge in Zeit proportional zu n log2n sortiert werden. Sortieren mit Treaps n n Folgerung: Durch Einfügen einer Folge von n Zahlen in einen Treap mit zufäl-­ ligen Prioritäten kann die Folge in Zeit proportional zu n log2n sortiert werden. Sortierte Reihenfolge: Elemente des Treaps „von links nach rechts“ (in-­ order-­Reihenfolge) Sortieren mit Treaps 4, 9 In-­Order-­Reihenfolge (Baum) = 3, 7 8, 8 1, 4 6, 6 2, 3 5, 2 9, 5 7, 1 1,2,3 Sortieren mit Treaps 4, 9 In-­Order-­Reihenfolge (Baum) = (Baum): 3, 7 8, 8 1, 4 6, 6 2, 3 5, 2 In-­Order-­Reihenfolge (linker Teil Baum) 9, 5 7, 1 1,2,3,4 Sortieren mit Treaps 4, 9 3, 7 In-­Order-­Reihenfolge (Baum) = (Baum): 8, 8 Wurzel 1, 4 6, 6 2, 3 5, 2 9, 5 7, 1 1,2,3,4,5,6,7,8,9 Sortieren mit Treaps 4, 9 In-­Order-­Reihenfolge (Baum) = (Baum): 3, 7 8, 8 1, 4 6, 6 2, 3 5, 2 9, 5 7, 1 In-­Order-­Reihenfolge (rechter Teil Baum) Sortieren mit Treaps n n Folgerung: Durch Einfügen einer Folge von n Zahlen in einen Treap mit zufäl-­ ligen Prioritäten kann die Folge in Zeit proportional zu n log2n sortiert werden. Das Treap-­basierte Verfahren ist im wesentlichen äquivalent zu Quicksort.