Grundlagen: Algorithmen und Datenstrukturen Prof. Dr. Hanjo Täubig Lehrstuhl für Effiziente Algorithmen (Prof. Dr. Ernst W. Mayr) Institut für Informatik Technische Universität München Sommersemester 2010 H. Täubig (TUM) GAD SS’10 1 / 320 Suchstrukturen Übersicht 1 Suchstrukturen (a, b)-Bäume H. Täubig (TUM) GAD SS’10 295 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum remove(k ) Abstieg wie bei locate(k ) bis Element e in Liste erreicht falls key(e) = k , entferne e aus Liste (sonst return) e’ H. Täubig (TUM) e GAD e’’ ∞ SS’10 296 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum remove(k ) Abstieg wie bei locate(k ) bis Element e in Liste erreicht falls key(e) = k , entferne e aus Liste (sonst return) e’ H. Täubig (TUM) e’’ GAD ∞ SS’10 297 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum remove(k ) entferne Handle auf e und Schlüssel k vom Baumknoten v über e (wenn e rechtestes Kind: Schlüsselvertauschung wie bei binärem Suchbaum) falls d(v) ≥ a, dann fertig v v ... x k y ... ... x y ... x k y x y e’ e e’’ e’ e’’ H. Täubig (TUM) GAD SS’10 298 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum remove(k ) falls d(v) < a und ein direkter Nachbar v 0 von v hat Grad > a, nimm Kante von v 0 (Bsp.: a = 2, b = 4) u k t y r u y t v x y H. Täubig (TUM) r s s x t x GAD r y r s s t SS’10 299 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum remove(k ) falls d(v) < a und kein direkter Nachbar von v hat Grad > a, merge v mit Nachbarn (Bsp.: a = 3, b = 5) u y t u t y r v x x r y H. Täubig (TUM) r s s x t x GAD y r s s t SS’10 300 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum remove(k ) Veränderungen hoch bis Wurzel falls Grad der Wurzel < 2: entferne Wurzel neue Wurzel wird das einzige Kind der alten Wurzel x H. Täubig (TUM) y z x GAD y z SS’10 301 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(10) 10 19 1 1 3 H. Täubig (TUM) 3 5 5 14 10 14 GAD 28 19 28 ∞ SS’10 302 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(10) 10 19 1 1 3 H. Täubig (TUM) 3 5 5 14 10 14 GAD 28 19 28 ∞ SS’10 303 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(10) 5 1 1 H. Täubig (TUM) 19 3 3 14 5 14 GAD 28 19 28 ∞ SS’10 304 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(14) 5 1 1 H. Täubig (TUM) 19 3 3 14 5 14 GAD 28 19 28 ∞ SS’10 305 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(14) 5 1 1 H. Täubig (TUM) 19 3 3 28 5 19 GAD 28 ∞ SS’10 306 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(14) 3 5 1 1 H. Täubig (TUM) 19 3 5 28 19 GAD 28 ∞ SS’10 307 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(3) 3 1 1 H. Täubig (TUM) 19 28 5 3 5 19 GAD 28 ∞ SS’10 308 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(3) 1 19 5 1 H. Täubig (TUM) 5 28 19 GAD 28 ∞ SS’10 309 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(3) 19 1 1 H. Täubig (TUM) 5 5 28 19 GAD 28 ∞ SS’10 310 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(1) 19 1 1 H. Täubig (TUM) 5 5 28 19 GAD 28 ∞ SS’10 311 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(1) 19 5 5 H. Täubig (TUM) 28 19 28 GAD ∞ SS’10 312 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(19) 19 5 5 H. Täubig (TUM) 28 19 28 GAD ∞ SS’10 313 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(19) 5 28 5 H. Täubig (TUM) 28 GAD ∞ SS’10 314 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(19) 5 5 H. Täubig (TUM) 28 28 GAD ∞ SS’10 315 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove a = 2, b = 4 remove(19) 5 5 H. Täubig (TUM) 28 28 GAD ∞ SS’10 316 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum / remove Form-Invariante durch remove erfüllt: alle Blätter haben dieselbe Tiefe Grad-Invariante remove verschmilzt Knoten, die Grad a − 1 und a haben wenn b ≥ 2a − 1, dann ist der resultierende Grad ≤ b remove verschiebt eine Kante von Knoten mit Grad > a zu Knoten mit Grad a − 1, danach sind beide Grade in [a, b] wenn Wurzel gelöscht, wurden vorher die Kinder verschmolzen, Grad vom letzten Kind ist also ≥ a (und ≤ b) H. Täubig (TUM) GAD SS’10 317 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum Weitere Operationen: min / max-Operation verwende first / last-Methode der Liste, um das kleinste bzw. größte Element auszugeben Zeit: O(1) Bereichsanfragen suche alle Elemente im Bereich [x, y]: I I Zeit: führe locate(x) aus und durchlaufe die Liste, bis Element > y gefunden wird O(log n + Ausgabegröße) H. Täubig (TUM) GAD SS’10 318 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum Weitere Operationen: Konkatenation verknüpfe zwei (a, b)-Bäume T1 und T2 mit s1 und s2 Elementen zu (a, b)-Baum T (Schlüssel in T1 ≤ Schlüssel in T2 ) + T1 H. Täubig (TUM) = T2 GAD T SS’10 319 / 320 Suchstrukturen (a, b)-Bäume (a, b)-Baum Weitere Operationen: Konkatenation lösche in T1 das ∞-Dummy-Element wenn danach dessen Vater-Knoten < a Kinder hat, behandle dies wie bei remove verschmelze die Wurzel des niedrigeren Baums mit einem entsprechenden äußersten Knoten des anderen Baums, der sich auf dem gleichen Level befindet wenn dieser Knoten danach > b Kinder hat, behandle dies wie bei insert Zeit: O(log max{s1 , s2 }) ∈ O(s1 + s2 ) wenn man die Höhe der Bäume explizit speichert, kann man concatenate sogar mit Zeit O(1 + |h1 − h2 |) implementieren H. Täubig (TUM) GAD SS’10 320 / 320