Splay Trees Von Projdakov Benjamin Inhalt 1. Binäre Suchbäume 2. Splay Trees a. Self adjustment b. Anwendungsbeispiel c. Rotationen I. Zig / Zag II. ZigZig/ZagZag III. ZigZag/ZagZig d. Operationen I. Splay/Suche II. Einfügen III. Löschen 3. Amortisierte Analyse a. Einführung/PotentialMethode b. Hilfssatz c. Definitionen d. Zugrifslemma I. II. III. IV. Zig/Zag ZigZag/ZagZig ZigZig/ZagZag Splay e. Satz 1: Splay-Baum f. Satz 2: Binärer Baum mit Splay Binäre Suchbäume Eigenschaften: • Geordnete Menge von Suchschlüsseln • Linkes Kind der kleinere Suchschlüssel • Rechtes Kind der größere Suchschlüssel • Baum kann zu einer linearen Liste ausarten Splay Tree • Splay-Bäume wurden 1985 von Daniel Sleator und Robert Tarjan unter dem Namen SelfAdjusting Binary Search Trees vorgestellt • Hat den Vorteil von Selbstjustierung • Benutzt Rotationen für Knotenbewegung • Typische Befehle auf Knoten: – Suche – Füge ein – Lösche Self adjustment • Nach jeder Operation steht der bearbeitete Knoten in der Wurzel. • Die Tiefe eines Pfads halbiert sich im Schnitt bei Ausführung einer Operation darauf. • Oft benutzte Knoten sind näher an der Wurzel. Beispiel Compiler Compiler: • Ein Compiler muss die Variablen und andere Bezeichner eines Programms verwalten. • Er kann solche Information in einer Liste oder einer Tabelle behalten. • Gerne werden Variablen alphabetisch deklariert und ein Baum entartet zu einer linearen Liste. • Wenn einige Bezeichner häufiger verwendet werden, muss man dann mehrmals nach diesen suchen. • Ein Splay-Baum würde oft benutzte Variablen an der Wurzel halten und ggf. die Liste zu einem Baum formen. Rotation: Zig / Zag Zig Zag Nur wenn 1 Schritt zur Wurzel. Bei simpler Implementierung werden 2 Zeiger „umgebogen“. Rotation: ZigZig / ZagZag ZigZig ZagZag Wenn mehr als 1 Schritt zur Wurzel. Bei simpler Implementierung werden 4 Zeiger „umgebogen“. Rotation: ZigZag / ZigZag Wenn mehr als 1 Schritt zur Wurzel. Bei simpler Implementierung werden 4 Zeiger „umgebogen“. Operation: Splay • Binäre Suche nach Element • Falls Knoten nicht im Baum, wird der Vorgänger betrachtet oder Nachfolger, wenn kleiner als alle. • Bewegung des Elements in die Wurzel Operationen: Suche Suche: • Einfach eine Splay-Operation mit Rückgabe der neuen Wurzel. • Laufzeit von einer Splay-Operation mit Rückgabe der Wurzel. Operation: Einfügen Füge „x“ ein : • Suche nach x, falls x gefunden => Splay x • Falls x nicht gefunden, wird der Vorgänger y zur Wurzel. • Dann füge x als neue Wurzel ein, mit – y linkem Kind von x – rechtes Kind von y wird zum rechtem Kind von x. Laufzeit von einer Splay Operation und umbiegen von 3 Zeigern Operation: Löschen Lösche „x“: • Splay x • Wenn x nicht in der Wurzel, ist man fertig. • Entferne x, man erhält nun 2 Bäume. • Führe Splay ∞+ auf dem linken Baum aus. • Somit linker Baum mit Wurzel, an die man rechts den rechten Baum hängen kann. Laufzeit von 2 SplayOperationen und umbiegen von einem Zeiger Amortisierte Analyse • Analyse der durchschnittlichen Kosten von Operationsfolgen. • Es werden nicht die maximalen Kosten der einzelnen Schritte betrachtet, sondern es wird der Worst Case aller Operationen im gesamten Durchlauf des Algorithmus analysiert. • Dies kann zu einer besseren oberen Schranke führen. Potential-Methode • ๐๐๐ = ๐ก๐๐ + ๐๐๐๐ค − ๐๐๐๐๐๐๐ • ๐ sind die amortisierten Kosten für die Operation ๐๐ • ๐ก sind die tatsächlichen Kosten für die Operation ๐๐ • ๐ ist das Potential eines Zustands (ähnlich zum Kontostand) Amortisierte Analyse: Hilfsatz a. Wenn: ๐, ๐ > 0 , ๐ + ๐ ≤ ๐ • Dann: log 2 ๐ + log 2 ๐ ≤ 2 log 2 ๐ − 2 • Denn: geometrisches Mittel ≤ arithmetisches Mittel b. ๐๐ ≤ ๐+๐ 2 • log 2 ๐ + log 2 ๐ = log 2 ๐ ∗ Definition Variablen: • x : Schlüssel • p : Knoten • b : Baum Rang von p: • ๐ ๐ = log 2 ๐ ๐ (min. Tiefe bei Gewicht 1) • ๐ ๐ฅ = ๐ ๐ ,p hat Schlüssel x • ๐ ๐ = ๐ ๐ , p Wurzel von b • Gewicht von x: ๐ค ๐ฅ > 0 • Größe von p: ๐ ๐ = Potential von b: ∑๐ค ๐ฅ (Summe der Gewichte aller • ๐ ๐ = ∑๐ ๐ , p ist innerer Knoten von b Schlüssel vom Teilbaum mit Wurzel p) (Summe aller Ränge der inneren Knoten) Zugriffslemma Jede Splay-Operation hat als amortisierte Laufzeit maximal: 3 ๐ ๐ −๐ ๐ฅ +1 Das ist nun zu zeigen. Variablen: • x : Schlüssel • p : Knoten • b : Baum Rang: • ๐ ๐ = log 2 ๐ ๐ • ๐ ๐ฅ = ๐ ๐ ,p hat Schlüssel x • ๐ ๐ = ๐ ๐ , p Wurzel von b Zugriffslemma : Zig / Zag Regeln: 1: ๐ ′ ๐ = ๐ ๐ = ๐ ๐ 2: ๐ ′ ๐ ≥ ๐′ ๐) 3: ๐ ′ ๐ ≥ ๐ ๐) Zugriffslemma : Zig / Zag ๐๐ง๐๐ = 1 + ๐′ ๐ฃ) − ๐ฃ ๐๐๐๐๐ ๐พ๐๐๐ก๐๐ ๐′ ๐′ ๐ ๐ฃ) ๐ฃ ๐๐๐๐๐ ๐พ๐๐๐ก๐๐ =1+ ๐ + ๐ −๐ ๐ −๐ ๐ =1 1 + ๐ ′ ๐ − ๐ ๐ ≤2 1 + ๐ ′ ๐ − ๐ ๐ ≤3 1 + 3 ๐ ′ ๐ − ๐ ๐ =1 1 + 3 ๐ ๐ − ๐ ๐ฅ ) ๐๐๐ = ๐ก๐๐ + ๐๐๐๐ค − ๐๐๐๐๐๐๐ ๐ ๐ = log 2 ๐ ๐ ๐ ๐ = ∑๐ ๐ wegen Aufhebung der nicht bewegten Knoten 1: ๐ ′ ๐ = ๐ ๐ = ๐ ๐ 2: ๐ ′ ๐ ≥ ๐ ′ ๐ 3: ๐ ′ ๐ ≥ ๐ ๐) Zugriffslemma : ZigZag / ZagZig Regeln: 1: ๐ ′ ๐ = ๐ ๐ 2: ๐ ๐ ≥ ๐ ๐) 3: ๐ ′ ๐ + ๐ ′ ๐ ≤๐ป๐ 2๐ ′ ๐ − 2 ,da log 2 ๐ ′ ๐ + log 2 ๐ ′ ๐ ≤ 2 log 2 ๐ ′ ๐ − 2 4: ๐ ′ ๐ ≥ ๐ ๐) Zugriffslemma : ZigZag / ZagZig ๐๐ง๐๐๐ง๐๐ = 2 + ๐ ′ ๐ + ๐ ′ ๐ + ๐ ′ ๐ − ๐ ๐ − ๐ ๐ − ๐ ๐) =1 2 + ๐ ′ ๐ + ๐ ′ ๐ − ๐ ๐ − ๐ ๐) ≤2 2 + ๐ ′ ๐ + ๐ ′ ๐ − ๐ ๐ − ๐ ๐) ≤3 2 + 2๐ ′ ๐ − 2 − ๐ ๐ − ๐ ๐) = 2 ๐′ ๐ − ๐ ๐ ) ≤4 3 ๐ ′ ๐ − ๐ ๐ + 1 ≤3 ๐ ๐ −๐ ๐ฅ )+1 ๐๐๐ = ๐ก๐๐ + ๐๐๐๐ค − ๐๐๐๐๐๐๐ ๐ ๐ = log 2 ๐ ๐ ๐ ๐ = ∑๐ ๐ 1: ๐ ′ ๐ 2: ๐ ๐ 3: ๐ ′ ๐ 4: ๐ ′ ๐ =๐ ๐ ≥ ๐ ๐) + ๐ ′ ๐ ≤๐ป๐ 2๐ ′ ๐ − 2 ≥ ๐ ๐) Zugriffslemma : ZigZig / ZagZag Regeln: 3: ๐ ๐ + ๐ ′ ๐ ≤๐ป๐ 2๐ ′ ๐ − 2 1: ๐ ′ ๐ = ๐ ๐ 2: ๐ ๐ ≥ ๐ ๐) , ๐ ′ ๐ ≥ ๐′ ๐) Zugriffslemma : ZigZig / ZagZag ๐๐ง๐๐๐ง๐๐ = 2 + ๐ ′ ๐ + ๐ ′ ๐ + ๐ ′ ๐ − ๐ ๐ − ๐ ๐ − ๐ ๐) =1 2 + ๐ ′ ๐ + ๐ ′ ๐ − ๐ ๐ − ๐ ๐) ≤2 2 + ๐ ′ ๐ + ๐ ′ ๐ − ๐ ๐ − ๐ ๐) = 2 + ๐′ ๐ + ๐′ ๐ − ๐ ๐ − ๐ ๐ + ๐ ๐ − ๐ ๐ |+0 ≤3 2 + ๐ ′ ๐ + 2๐′ ๐ − 2 − 3๐ ๐) = 3 ๐′ ๐ − ๐ ๐ ) ≤3 ๐ ๐ −๐ ๐ฅ +1 ๐๐๐ = ๐ก๐๐ + ๐๐๐๐ค − ๐๐๐๐๐๐๐ ๐ ๐ = log 2 ๐ ๐ ๐ ๐ = ∑๐ ๐ 1: ๐ ′ ๐ = ๐ ๐ 2: ๐ ๐ ≥ ๐ ๐) , ๐ ′ ๐ ≥ ๐ ′ ๐ 3: ๐ ๐ + ๐ ′ ๐ ≤๐ป๐ 2๐ ′ ๐ − 2 Zugriffslemma : Splay ๐๐ ๐๐๐๐ฆ ≤ 3 ๐ 1 ๐ −๐ 0 ๐ + 3 ๐ 2 ๐ −๐ 1 ๐ + 3 ๐ 3 ๐ −๐ 2 ๐ + 3 ๐ ๐ =3 ๐ โฎ ๐ −๐ ๐ ๐−1 ๐ +1 0 ๐ +1 ๐ −๐ =๐ 3 ๐ ๐ − ๐ ๐ฅ ๐ Splay ist eine Folge von vorgestellten Operationen. +1 ๐ = Rang von ๐ nach ๐-ter Operation Rang von ๐ vor Splay ist Rang des gesuchten Schlüssels ๐ฅ vor Splay. Rang von ๐ nach Splay ist Rang des Baumes. Satz 1 : Splay Baum • Für einen anfangs leeren Baum benötigt das Ausführen von m Wörterbuchoperationen mit höchsten N Einfügeoperationen maximal O(m log N). • Wörterbuchoperationen brauchen eine konstante Anzahl von Splay-Operationen + eine konstante Anzahl Einzeloperationen. • Für diesen Beweis setzen wir alle Gewichte auf 1 . Beweis ๐๐ ๐๐๐๐ฆ ≤ 3 ๐ ๐ − ๐ ๐ฅ ≤ 3๐ ๐ + 1 = 3 log 2 ๐ ๐ + 1 = 3 log 2 ∑ ๐ค ๐ฅ +1 ≤ 3 log 2 ๐ + 1 ⇒ ๐๐ ๐๐๐๐ฆ ∈ ๐ log ๐ ) ⇒ ๐ ๐๐๐๐๐๐ก๐๐๐๐๐ ∈ ๐ ๐ log ๐ ) +1 Zugriffslemma ๐ ๐ฅ ≥0 Def. von ๐ Def. von ๐ Gesamtgewicht ≤ ๐ N = Anzahl der Einfügeoperationen m = Anzahl von Operationen ๐ ๐ = log 2 ๐ ๐ Größe : ๐ ๐ = ∑๐ค ๐ฅ Satz 2 : Binärer Baum mit Splay • Für einen binären Suchbaum mit N Knoten, haben m Suchoperationen (über Splay) einen Aufwand von maximal O((N + m) log (N) + m). • Eine Suchoperation besteht aus einer Splay-Operation und Rückgabe des neuen Wurzelknotens. • Für diesen Beweis setzen wir alle Gewichte auf 1. • Wir suchen die tatsächlichen Kosten über: ๐ก๐๐ = ๐๐๐ + ๐๐๐๐๐๐๐ − ๐๐๐๐ค Potentialdifferenz ๐๐ − ๐๐ = ๐ ๐ − ๐∈๐๐ = ๐ ๐ − ๐๐๐๐ ๐ ๐′ ๐ ๐∈๐๐ ๐๐ = ๐๐๐๐๐๐ ๐พ๐๐๐ก๐๐ ๐ฃ๐๐ ๐๐๐๐๐๐๐ ๐๐ = ๐๐๐๐๐๐ ๐พ๐๐๐ก๐๐ ๐ฃ๐๐ ๐๐๐๐ค ๐๐ = ๐๐๐๐๐๐๐ , ๐๐ = ๐๐๐๐ค Erweitere um Blätter (Rang 0, Gewicht 1), somit alle p‘s in beiden Summen ๐′ ๐ ๐๐๐๐ ๐ ๐ ๐ − ๐′ ๐ = ๐๐๐๐ ๐ = Benutze Definitionen: log 2 ๐ ๐ ) − log 2 ๐ ′ ๐ ) • • ๐ ๐ = log 2 ๐ ๐ ๐ ๐ = ∑๐ค ๐ฅ (๐ฅ im Teilbaum von ๐) ๐๐๐๐ ๐ ≤ log 2 ๐ − log 2 ๐ค ๐ฅ๐ )) ๐๐๐๐ ๐ = log 2 ๐ = ๐ log 2 ๐ ๐๐๐๐ ๐ ๐= Summe aller Gewichte: ๐ค ๐ฅ) (Anzahl von Knoten = ๐) ๐ ≥ ๐ ๐ , ∀๐ ∈ ๐ ๐ค ๐ฅ๐ = 1, ๐บ๐๐ค๐๐โ๐ก ๐ง๐ข๐ ๐๐โ๐ü๐ ๐ ๐๐ ๐ฃ๐๐ ๐ log ๐ 1 = 0 Abschätzung von Suchfolgen ๐ ๐= ๐ก๐ = ๐=1 ๐ = ๐ ๐๐ +๐๐−1 − ๐๐ ) Def. von amortisierten Kosten. ๐=1 Treppensumme ๐๐ ) + ๐0 − ๐๐ ๐=1 ๐ ≤๐๐ฟ 3 ๐ ๐ −๐ ๐ฅ + 1) + ๐0 − ๐๐ ๐=1 ๐ ≤ 3๐ ๐) + 1) + ๐0 − ๐๐ ๐=1 ≤ ๐ 3log 2 ๐ + 1 + ๐ log 2 ๐ = 3๐ + ๐ log 2 ๐ + ๐ ∈ ๐ ๐ + ๐ log 2 ๐ + ๐) Zugriffslemma ๐ ๐ฅ ≥ 0, somit Wegfall Definition Rang und Potentialdifferenz