Lecture 15 Flashcards
(36 cards)
Drei grundlegende Invarianten eines binären Suchbaums (BST)?
Schlüssel-Invariante (alle Schlüssel eindeutig), Grad-Invariante (d(v) ≤ 2), Suchbaum-Invariante (links ≤ key < rechts).
Bei externen BSTs kommt welche Zusatzbedingung hinzu?
Für jedes Listenelement e existiert genau ein Baumknoten v mit key(e)=key(v)
Warum wird ein Dummy-Element ∞ als Blatt eingefügt?
Damit locate(k) auch für k > max stets ein Blatt liefert.
locate-Strategie im BST?
Ab Wurzel: links, falls key(v) ≥ k; sonst rechts – bis Blatt.
Worst-Case-Höhe eines ungebalancierten BST?
Θ(n) – z. B. bei sortierter Einfügefolge entartet der Baum zur Liste.
Insert in externem BST – wesentliche Schritte?
locate → neues Blatt + Splitter-Knoten einfügen, wenn key(e) eindeutig kleiner als key(e′).
Remove im externen BST – Kerngedanke?
locate → Element aus Liste + Vaterknoten entfernen; ggf. Schlüssel im verbleibenden Kind ersetzen
Warum brauchen wir balancierte Suchbäume?
Um die Θ(n)-Höhe (und damit Operationen) im Worst-Case auf Θ(log n) zu begrenzen.
Zwei vorgestellte Balance-Ansätze?
AVL-Bäume (lockern Balance), (a,b)-Bäume (lockern Grad).
Warum entstehen Fibonacci-Zahlen beim Worst-Case-AVL?
Bei jeder Stufe hat ein Kind Höhe h−1, das andere h−2 ⇒ F_h = F_{h−1}+F_{h−2}.
Rotationsarten beim AVL-Insert?
Einfachrotation (LL, RR) bei gleichem Vorzeichen; Doppelrotation (LR, RL) bei verschiedenen Vorzeichen.
Was entscheidet, ob nach Insert weiter nach oben balanciert wird?
Neue Höhendifferenz des aktuellen Knotens: 0→Stop, ±1→eine Ebene weiter, ±2→Rotation nötig.
remove in AVL – wichtigste Unterschiede zum Insert-Fall?
Höhendifferenz kann kleiner werden; evtl. mehrere Rotationen auf nachfolgenden Ebenen nötig.
Laufzeit locate/insert/remove im AVL?
O(log n) – höchstens eine Rotation pro Ebene
Definition eines (a,b)-Baums (zwei Invarianten)?
Form: alle Blätter gleiche Tiefe. Grad: a ≤ d(v) ≤ b (außer Wurzel 2…b).
Erlaubter Wertebereich für a,b?
a ≥ 2, b ≥ 2a − 1
Tiefe eines (a,b)-Baums maximal?
≤ 1 + ⌈log_a ((n+1)/2)⌉
Rolle der Split-Schlüssel in einem (a,b)-Knoten?
Trennen die Teilbäume: für k in T_i und k′ in T_{i+1}: k ≤ s_i < k′.
locate im (a,b)-Baum – Komplexität?
Θ(log n) aufgrund begrenzter Tiefe.
insert(e) – wann wird gesplittet?
Wenn nach Einfügen d(v) > b: Knoten teilen, mittleren Schlüssel ins Elternteil hochschieben; evtl. kaskadierend bis zur Wurzel.
Welche Knotengrade entstehen beim Split?
⌈(b+1)/2⌉ und ⌊(b+1)/2⌋ – beide ≥ a wegen b ≥ 2a−1.
remove(k) – drei mögliche Fälle bei Unterlauf d(v)<a?
(1) Stehlen von Nachbar mit Grad > a; (2) Merge zweier Nachbarn; (3) eventuell Wurzel verschmelzen (Grad < 2).
Was passiert, wenn bei remove die Wurzel Grad < 2 erreicht?
Wurzel wird entfernt, ihr einziges Kind wird neue Wurzel.
Vorteil des Stehlens gegenüber Mergen?
Vermeidet Abstieg ins nächste Level und reduziert Schlüssel-Moves.