Splay-Baum

Splay-Baum

In der Informatik ist ein Splay-Baum (auch Spreizbaum genannt, englisch Splay tree) eine baumartige Datenstruktur zum Verwalten verschiedener Elemente. Die Besonderheit von Splay-Bäumen ist, dass sie erwartet balanciert sind, wodurch alle wichtigen Operationen wie Einfügen, Suchen und Löschen effizient ausgeführt werden können. Splay-Bäume wurden 1985 von Daniel Sleator und Robert Tarjan unter dem Namen Self-Adjusting Binary Search Trees vorgestellt.

Inhaltsverzeichnis

Operationen

Splay-Bäume haben gegenüber normalen Bäumen eine besondere Operation splay, mittels welcher alle anderen Operationen sehr leicht durchgeführt werden können.

Splay

Wird die Splay-Operation auf ein Element x in einem Baum T angewendet, so sorgt sie dafür, dass x nach der Operation in der Wurzel von T steht. Dies wird erreicht, indem das Element Schritt für Schritt im Baum hinaufrotiert wird, bis es schließlich bei der Wurzel angekommen ist. Hierzu wird x jeweils mit seinem Vater bzw. Großvater verglichen. Aufgrund dieses Vergleiches werden insgesamt sechs Fälle unterschieden, von denen jeweils die Hälfte symmetrisch sind.

Anmerkung: Rotationen sind im Artikel Binärbaum beschrieben.

Zick-Rotation

Falls x das linke Kind seines Vaters ist und keinen Großvater hat, und somit bereits direkt unter der Wurzel steht, wird eine zick-Rotation (Rechts-Rotation) durchgeführt. Nun ist x die neue Wurzel des Baumes und die Splay-Operation beendet. Liegt x im rechten Teilbaum seines Vaters, wird analog eine zack-Rotation (Links-Rotation) durchgeführt. Hat x einen Großvater, so können zwei Einzelrotationen zu einer Kompositrotation zusammengesetzt werden.

Splay tree zig.svg


Zick-Zick-Rotation

Ist x das linke Kind seines Vaters, welcher das linke Kind des Großvaters von x ist, so wird eine zick-zick-Rotation (zwei Rechts-Rotationen) durchgeführt. Hierbei wird x mit dem Großvater vertauscht und alle weiteren Unterbäume werden an die entsprechenden Stellen gesetzt. Falls x nach der Rotation noch nicht in der Wurzel des Baumes steht, so wird weiterrotiert. Symmetrisch hierzu die zack-zack-Rotation, falls x das rechte Kind seines Vaters ist, welcher das rechte Kind des Großvaters von x ist.

Zigzig.gif


Zack-Zick-Rotation

Ist x das zweite Kind (von links) seines Großvaters, so wird eine zack-zick-Rotation (Links-Rotation gefolgt von einer Rechts-Rotation) durchgeführt. Hierbei tauscht x die Position mit seinem Großvater und alle weiteren Unterbäume werden an die entsprechenden Stellen gesetzt. Falls x nach der Rotation noch nicht in der Wurzel des Baumes steht, so wird weiterrotiert. Symmetrisch hierzu die zick-zack-Rotation, falls x das linke Kind seines Vaters ist, welcher das rechte Kind des Großvaters von x ist.

Zigzag.gif


Amortisierte Laufzeit: O(log n)

Suchen

Um ein Element x im Baum T zu suchen, führt man einfach splay(x,T) aus. Dies bewirkt, dass falls x in T enthalten war, es nun in der Wurzel steht. Somit muss man nur noch die neue Wurzel mit x vergleichen. Sind sie unterschiedlich, war x nicht im Baum.

Amortisierte Laufzeit: O(log n)

Einfügen

Um ein Element x in einen Splay-Baum T einzufügen, sucht man zuerst wie in einem Binärbaum nach x. Nachdem diese Suche erfolglos endet, bekommt man den Knoten v, an dem x angehängt werden müsste. Dieser Knoten v wird jetzt mit der splay-Operation an die Wurzel gebracht. Somit ist v nun an der Wurzel und hat zwei Teilbäume T1 und T2. Jetzt wird die split-Operation ausgeführt:

x wird mit v verglichen:

wenn x größer als v, dann wird v mit seinem linken Teilbaum T1 links an x angehängt. Der rechte Teilbaum T2 wird rechts an x angehängt.
wenn x kleiner als v, dann wird v mit seinem rechten Teilbaum T2 rechts an x angehängt. Der linke Teilbaum T1 wird links an x angehängt.

Somit ist x an der Wurzel und an der richtigen Stelle.

Amortisierte Laufzeit: O(log n)

Löschen

Um x aus T zu löschen, führt man erst einmal eine Suche auf x aus, wird das Element gefunden, wird es gelöscht, und der Unterbaum an den Elternknoten P(x) angehängt. Gefolgt von splay(P(x), T), welches den Elternknoten in die Wurzel holt.

Amortisierte Laufzeit: O(log n)

Vereinigen

Die Operation join vereinigt zwei Splay-Bäume T1 und T2, welche unmittelbar vorher mittels split getrennt wurden. Hierbei wird zuerst mittels splay(∞,T1) das maximale Element x1 des ersten Baumes gesucht und in die Wurzel rotiert. Da die beiden Bäume T1 und T2 das Ergebnis einer vorherigen split-Operation sind, sind alle Elemente in T2 größer als die Elemente in T1, weswegen man den Baum T2 nun ohne Probleme zum rechten Kind von x1 machen kann.

Amortisierte Laufzeit: O(log n)

Aufsplitten

Um einen Splay-Baum T bei dem Knoten x in zwei Splay-Bäume aufzusplitten, macht man zuerst x mittels splay zur Wurzel von T. War x im Baum enthalten, kann man nun die Verbindung zu einem der beiden Teilbäume einfach trennen. Steht nach der Splay-Operation ein anderes Element y in der Wurzel, so war x selbst nicht in T enthalten. Ist x nun kleiner als y, so kann man das linke Kind von y abschneiden, andernfalls sein rechtes.

Amortisierte Laufzeit: O(log n)

Literatur

  • D.D. Sleator and R.E. Tarjan. Self-Adjusting Binary Search Trees. Journal of the ACM 32:3, S. 652-686, 1985.

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем написать реферат

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Balancierter Baum — Ein Balancierter Baum ist in der Informatik ein Spezialfall der Datenstruktur Baum, der eine maximale Höhe von garantiert, wobei n die Anzahl der Elemente im Baum angibt und c eine von n unabhängige Konstante ist. Manche Autoren rechnen auch… …   Deutsch Wikipedia

  • AVL-Baum — Abbildung 1: AVL Baum mit Balance Werten (grün) AVL Baum Komplexität Platz O(n) …   Deutsch Wikipedia

  • Fano-Code — Die Shannon Fano Kodierung und Huffman Kodierung sind eine Art der Entropiekodierung. Dieser Artikel beschreibt, wie zu einem gegebenen Satz von Zeichen Wahrscheinlichkeits Paaren die Kodierung erstellt werden kann, welche eine möglichst kleine… …   Deutsch Wikipedia

  • Huffman-Code — Die Shannon Fano Kodierung und Huffman Kodierung sind eine Art der Entropiekodierung. Dieser Artikel beschreibt, wie zu einem gegebenen Satz von Zeichen Wahrscheinlichkeits Paaren die Kodierung erstellt werden kann, welche eine möglichst kleine… …   Deutsch Wikipedia

  • Huffman-Codierung — Die Shannon Fano Kodierung und Huffman Kodierung sind eine Art der Entropiekodierung. Dieser Artikel beschreibt, wie zu einem gegebenen Satz von Zeichen Wahrscheinlichkeits Paaren die Kodierung erstellt werden kann, welche eine möglichst kleine… …   Deutsch Wikipedia

  • Huffman-Kode — Die Shannon Fano Kodierung und Huffman Kodierung sind eine Art der Entropiekodierung. Dieser Artikel beschreibt, wie zu einem gegebenen Satz von Zeichen Wahrscheinlichkeits Paaren die Kodierung erstellt werden kann, welche eine möglichst kleine… …   Deutsch Wikipedia

  • Huffman-Kodierung — Die Shannon Fano Kodierung und Huffman Kodierung sind eine Art der Entropiekodierung. Dieser Artikel beschreibt, wie zu einem gegebenen Satz von Zeichen Wahrscheinlichkeits Paaren die Kodierung erstellt werden kann, welche eine möglichst kleine… …   Deutsch Wikipedia

  • Huffman-Verfahren — Die Shannon Fano Kodierung und Huffman Kodierung sind eine Art der Entropiekodierung. Dieser Artikel beschreibt, wie zu einem gegebenen Satz von Zeichen Wahrscheinlichkeits Paaren die Kodierung erstellt werden kann, welche eine möglichst kleine… …   Deutsch Wikipedia

  • Shannon-Fano-Code — Die Shannon Fano Kodierung und Huffman Kodierung sind eine Art der Entropiekodierung. Dieser Artikel beschreibt, wie zu einem gegebenen Satz von Zeichen Wahrscheinlichkeits Paaren die Kodierung erstellt werden kann, welche eine möglichst kleine… …   Deutsch Wikipedia

  • Shannon-Fano-Codierung — Die Shannon Fano Kodierung und Huffman Kodierung sind eine Art der Entropiekodierung. Dieser Artikel beschreibt, wie zu einem gegebenen Satz von Zeichen Wahrscheinlichkeits Paaren die Kodierung erstellt werden kann, welche eine möglichst kleine… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”