13 (2-4)-Bäume (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang 2. Die Ordnung (maximale Anzahl der Söhne eines Knotens) ist gleich 4 3. Innere Knoten haben ≥ 2 Söhne 4. Die Blätter enhalten von links nach rechts die Werte aufsteigend sortiert 5. Jeder innere Knoten mit tionen x1 , ..., xt−1 wobei t Söhnen (2 ≤ t ≤ 4) speichert t − 1 Hilfsinformaxi = gröÿter Wert im Teilbaum des i-ten Sohnes von links Dadurch kann eine logarithmische Höhe garantiert werden (13.2). Beispiel eines (2,4)-Baums: Weiters wird die Ordnung α(k) eines Knotens k als die Anzahl der Söhne de- niert. 13.1 Implementierbare Funktionen Die Funktionen SUCHEN, EINFÜGEN und ENTFERNEN entsprechen dem Wörterbuchproblem. Man kann mithilfe von (2,4)-Bäumen das Wörterbuchproblem bestehende aus n Elementen in O(log n) pro Funktion und S(n) = Θ(n) Speicher lösen. 13.1.1 Suchen in (2-4)-Bäumen Mit Hilfe der Information in den inneren Knoten kann von der Wurzel ausgehend nach unten der entsprechende Wert gesucht werden. Pro Knoten benötigt der O(1). Die gesamte T (n) = Θ(h) = Θ(log n) Suchprozess eine konstante Zeit der Höhe des Baumes ab: 1 Laufzeit hängt direkt von 13.1.2 Einfügen in (2-4)-Bäumen Zuerst wird der richtige Knoten gesucht und dort das neue Element eingefügt. Dabei müssen zwei Fälle unterschieden werden: 1. Fall: α(k) ≤ 4 nach dem Einfügen: Ergebnis ist wieder ein (2-4)-Baum 2. Fall: α(k) = 5 nach dem Einfügen: Es liegt kein (2,4)-Baum vor. Es muss eine sog. SPALT -Operation durchgeführt werden, um wieder einen (2,4)Baum zu erhalten. SPALTEN: Der Knoten k. von k erhält einen Bruderknoten k 0 unmittelbar rechts Dabei werden die zwei rechtesten (gröÿten) Söhne von k auf k0 umgehängt. Bemerkung: Dabei muss die SPALT -Operation auch potentiell öfters durchgeführt werden (siehe v, v 0 ), maximal aber nur logarithmisch oft: T (n) = O(h) = O(log n). 13.1.3 Entfernen in (2-4)-Bäumen Auch hier wird zuerst der entsprechende Knoten gesucht. Nach dem Entfernen muss man wieder zwei Fälle unterscheiden: 1. Fall: α(k) ≥ 2 2. Fall: α(k) = 1 nach dem Entfernen: Ergebnis ist wieder ein (2-4)-Baum. nach dem Entfernen: Es liegt nun kein (2,4)-Baum mehr vor. Es muss entweder eine STEHL- oder eine VERSCHMELZUNGS Operation durchgeführt werden, um wieder einen (2,4)-Baum zu erhalten. Sei k0 (a) (b) ein direkter Bruder von α(k 0 ) ≥ 3, 0 α(k ) = 2, k dann muss man einen Sohn von dann muss k mit k 2 0 k0 STEHLEN VERSCHMOLZEN werden Bemerkung: Auch hier muss die VERSCHMELZUNGS -Operation auch potentiell öfters durchgeführt werden, maximal aber nur logarithmisch oft: T (n) = O(h) = O(log n). 13.2 Beweis der logarithmischen Höhe Alle erwähnten Funktionen können im schlimmsten Fall mit O(h) durchgeführt werden. Die Datenstruktur (2-4)-Bäume garantiert eine logarithmische Höhe (d.h. die Höhe hängt logarithmisch von der Datenmenge n h ab). Beweis: 2h ≤ ≤ 4h = 22h n h ≤ log2 n Also kann man die Höhe h ≤ 2h abschätzen mit log2 n ≤ h ≤ log2 n 2 was der Denition der 13.3 Θ-Notation entspricht: h = Θ (log n). Beweis des linearen Speichers Im Unterschied zum Binärbaum, bei dem jeder Knoten (auch innere Knoten) einen Wert speichert, sind in (2-4)-Bäumen die Werte blattorientiert, d.h. ausschlieÿlich in den Blättern gespeichert, während die inneren Knoten nur Hilfsinformationen speichern. Trotz dieses zusätzlichen Speicheraufwands ist der Speicherverbrauch linear in der Anzahl der Werte (Blätter). Die maximale Anzahl an inneren Knoten in einem (2-4)-Baum tritt auf, wenn jeder Knoten nur 2 Söhne hat. Dann gilt für den Speicherverbrauch eines (2-4)-Baumes mit n (Blättern) # Knoten ≤n+ ∞ X 1 X n n 1 + + ... + 1 = n < n = 2n. i 2 4 2 2i i=0 i≥0 Es gilt also S(n) = Θ(n). 3 Werten 13.4 Anwendung: Mischbare Warteschlangen Eine Anwendung der (2-4)-Bäume sind sogenannte mischbare Warteschlangen, die im Gegensatz zu den Warteschlangen mit Prioritäten (siehe Kapitel Halde ), zu den drei Funktionen EINFÜGEN(S,x), MAXIMUM(S) und ENTFERNE_MAX(S) auch noch die Funktion MISCHE(S,S') implementiert. Die Struktur des (2-4)-Baums für mischbare Warteschlangen ist die folgende: Die Blätter speichern S in beliebiger Reihenfolge und jeder innere Knoten speichert das Maximum seines Teilbaums, plus einen Zeiger, der auf das entsprechende Maximum-Blatt zeigt. Alle 4 Funktionen EINFÜGEN, MAXIMUM, ENTFERNE_MAX und MISCHEN können damit in 13.5 O(log n) 1 implementiert werden . Sortieren mit (2-4)-Bäumen Sortieren mit (2-4)-Bäumen besitzt den Vorteil sowohl worst-case optimal als auch adaptiv zu sein. Die inneren Knoten des (2-4)-Baums besitzen dabei nur die Information des Maximums des jeweiligen Teilbaums. Die Idee beruht darauf in einen anfangs leeren (2-4)-Baum die Werte einzufügen. Folgende Schritte werden durchgeführt (bottom-up): • Man startet mit dem Blatt ganz links (das aktuelle Minimum) • Man läuft bis zur Wurzel der • w0 des Teilbaums T 0 (w0 x und man macht Man läuft von w0 zu Blatt ai wählt immer den ersten Teilbaum von links mit 1 Eine O(n) ist der erste Knoten, > ai ) Implementierung mit der Datenstruktur möglich machen. 4 Halde zum linken Bruder (man w(T B) > ai ) würde das Mischen nur teuer mit Bemerkung: Es sind potentiell logarithmisch viele SPALT -Operationen durchzuführen. Wie aber gezeigt werden kann, amortisieren sich diese im Laufe des Sortiervorgangs. 13.5.1 Analyse des Sortierens mit (2,4)-Bäumen Dazu benötigt man ein Maÿ für die Unsortierheit einer Folge ( 'Die Anzahl der Fehlstände), welches folgendermaÿen deniert ist: Sei ai a1 , a2 , ..., an eine (unsortierte) Zahlenfolge. , d.h. Anzahl der Zahlen die rechts von ai fi = Anzahl der Fehlstände für stehen und aber kleiner als ai sind. fi = |{aj | j > i , aj < ai }| Die Summe aller Fehlstände F ist dann ein Maÿ der Unsortiertheit der Zahlen- folge: F = n X fi i=1 Die Laufzeit T (n) beim Einfügen des beträgt mit i-ten si = Anzahl ai : der nötigen SPALT -Operationen Elements T (n) = O n X ! (log fi + si ) i=1 Mit der obigen Denition, der Abschätzung aus der Amoritisierungsanalyse Pn n 3 i=1 si ≤ 2 n und der Abschätzung · log Fn erhält man für die Laufzeit: Pn i=1 log fi = log Πni=1 fi ≤ log F T (n) = O n · log + n n 5 F n n =