Wavelet Tree

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Ein Wavelet Tree aus der Zeichenfolge "abracadabra". Jeder Knoten unterteilt die Zeichenfolge abhängig vom Alphabet in zwei Teile. Ein Bitvektor ordnet jedes Zeichen aus der Folge seinem Bereich zu. Dabei ist zu beachten, dass die Datenstruktur nicht den Baum, sondern nur die Topologie und die Bitvektoren speichert. Die Zeichenfolgen in den Knoten dienen ausschließlich der Illustration.

In der Informatik versteht man unter einem Wavelet Tree eine kompakte Datenstruktur, um Zeichenfolgen komprimiert abzuspeichern. Er erweitert die Methoden und von einem Bitvektor auf ein beliebiges Alphabet.

Erstmals beschrieben wurde die Datenstruktur als Hauptbestandteil zur komprimierten Volltextindexierung[1] und gilt als geringfügige Generalisierung einer Datenstruktur aus der algorithmischen Geometrie[2]. Der Wavelet Tree lässt sich rekursiv beschreiben. Jeder Knoten verteilt die Zeichenfolge auf seine zwei Nachfolger. Dabei wird das verbleibende Alphabet unter den Kind-Knoten aufgeteilt. Ein Bitvektor speichert für jedes Zeichen die zugeordnete Partition.

Der Namensursprung der Trees liegt bei der Wavelet-Transformation, eingesetzt zur Reduzierung von Bilddaten und zur approximativen Evaluierung von Ausdrücken der relationalen Algebra.

Aufbau[Bearbeiten | Quelltext bearbeiten]

Ein Wavelet Tree der Folge über dem Alphabet kann über ein Teilalphabet rekursiv beschrieben[3] werden. Ein Wavelet Tree über dem Alphabet ist ein binärer balancierter Baum mit Blättern.

  1. Falls , so besteht der Baum aus nur einem Blatt mit dem Label .
  2. Sonst besitzt der Baum einen Wurzelknoten mit einer Bitmap , welche wie folgt definiert ist:
Sei nun die Teilsequenz aus bestehend aus den Symbolen und die Teilsequenz aus bestehend aus den Symbolen . Dann ist das linke Kind von ein Wavelet Tree von über dem Alphabet und das rechte Kind von ein Wavelet Tree von über dem Alphabet .

Eigenschaften[Bearbeiten | Quelltext bearbeiten]

Der beschriebene Baum hat eine Höhe von , besitzt Blätter und interne Knoten. Er speichert Bits auf jeder Ebene und höchstens in der untersten Ebene. Somit lässt sich der Baum mit insgesamt höchstens Bits repräsentieren. Genau betrachtet benötigt diese Repräsentation weitere Bits für die Zeiger.

Sei nun eine Zeichenfolge mit aus dem Alphabet der Länge , so kann als Wavelet Tree mit Bits repräsentiert werden.

Operationen[Bearbeiten | Quelltext bearbeiten]

Der Wavelet Tree unterstützt die Operationen , und in Zeit, falls ein balancierter Baum konstruiert wurde.

Access[Bearbeiten | Quelltext bearbeiten]

: Direktzugriff auf das i'te Element in der Zeichenfolge.

Um das Zeichen an der Position zu berechnen, wird der Bitvektor betrachtet. Falls der Wert an dieser Position ist, so ist und wir führen das Vorgehen auf dem linken Kind-Knoten rekursiv weiter, andernfalls gilt und der Algorithmus bearbeitet das rechte Kind. Dazu muss die neue Position von im Bitvektor ermittelt werden. Die neue Position ist die Anzahl der Nullen im Vektor bis zur Position i, falls gilt. Wird rekursiv das rechte Kind bearbeitet, so müssen die Vorkommen der Einsen aufsummiert werden. Dazu dient die Funktion respektive auf einem Bitvektor.

Die Rang-Funktion auf Bitvektoren kann in konstanter Zeit[4] mithilfe von zusätzlichen Bits ausgewertet werden.

Rang[Bearbeiten | Quelltext bearbeiten]

: Anzahl der Zeichen bis zur Position i in der Zeichenfolge.

Die Bestimmung des Rangs erfolgt analog zur Access-Operation. Nach Ausführung des Access-Algorithmus ergibt sich der Rang aus der Anzahl der Vorkommen von bis zur Position i im Blattknoten.

Select[Bearbeiten | Quelltext bearbeiten]

: Position des i-ten Vorkommens vom Zeichen q in der Zeichenfolge.

Um diese Position zu bestimmen beginnt der Algorithmus bei dem Blatt, das q repräsentiert. Nun durchläuft der Algorithmus die Knoten rekursiv zur Wurzel: Falls der Knoten ein linkes Kind ist, so ergibt sich die neue Position im Elternknoten aus der Position der i-ten im zugehörigen Bitvektor. Ist das Kind ein rechter Nachfolger, so ergibt sich die neue Position aus der Position der i-ten . Diese Selekt-Operation auf einem Bitvektor[5][6] kann in konstanter Zeit mit zusätzlichen ausgeführt werden.

Kompression[Bearbeiten | Quelltext bearbeiten]

Der Platzverbrauch von kann durch Entfernung von Redundanzen mittels unterschiedlicher Verfahren auf Bits[7][8] mit gleicher Laufzeit der Operationen, bzw. Bits[9] und konstanter Laufzeit für Rang und Selekt verringert werden.

Anwendung[Bearbeiten | Quelltext bearbeiten]

Diese Datenstruktur findet Verwendung in verschiedensten Anwendungen[10][3]. Wavelet Trees kommen in Anwendungen zur Repräsentation von drei verschiedenen Klassen zum Einsatz.

Folge von Werten[Bearbeiten | Quelltext bearbeiten]

Der Wavelet Tree repräsentiert eine Zeichenfolge[11][12]. Die verwendeten Operationen sind die drei genannten Grundoperationen auf dem Baum. Diese Repräsentation ist die am weitesten verbreitete.

Sortierung[Bearbeiten | Quelltext bearbeiten]

Der Baum beschreibt eine geordnete Darstellung von der ausgehenden Zeichenfolge . Die Blätter des Baums repräsentieren die sortierte Folge . Daraus ergeben sich zwei zusätzliche Operationen. liefert die Position des Zeichens in der sortierten Folge. Umgekehrt ergibt das Aufsteigen vom r'ten Blatt zur Wurzel die Position des Elements i mit . Diese Darstellung wurde vom Erfinder von Wavelet Trees[1] verwendet.

Grid von Punkten[Bearbeiten | Quelltext bearbeiten]

Hierbei repräsentiert der Wavelet Tree eine Menge von Punkten.

Erweiterungen[Bearbeiten | Quelltext bearbeiten]

In der Literatur finden sich einige Erweiterungen der Bäume. Um die Höhe von Wavelet Trees zu minimieren, werden t'näre anstatt binäre Knoten verwendet[10]. Somit erhöht sich der Knotengrad auf t Kinder und die Tiefe des Baumes sinkt. Operationen wie das Einfügen und Löschen von Zeichen an beliebigen Positionen in der Zeichenfolge erhöhen die Dynamik des Wavelet Trees und ermöglichen die Unterstützung dynamischer FM-Indizes[13].

Weblinks[Bearbeiten | Quelltext bearbeiten]

  • Wavelet Trees. Blog, der die Konstruktion und Anfragen eines Wavelet Trees mit Beispielen beschreibt.

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. a b R. Grossi, A. Gupta, and J. S. Vitter, High-order entropy-compressed text indexes (PDF; 292 kB), Proceedings of the 14th Annual SIAM/ACM Symposium on Discrete Algorithms (SODA), January 2003, 841-850
  2. B. Chazelle, A functional approach to data structures and its use in multidimensional searching, SIAM Journal on Computing, Volume 17, Issue 3, June 1988, Pages 427-462
  3. a b G. Navarro, Wavelet Trees for All (PDF; 397 kB), Proceedings of 23rd Annual Symposium on Combinatorial Pattern Matching (CPM), 2012
  4. G. Jacobson, Space-efficient static trees and graphs (PDF; 381 kB), International Journal of Foundations of Computer Science (IJFCS), 1989, Pages 549-554
  5. D. Clark, Compact Pat Tree (PDF; 6,7 MB), University of Waterloo, Canada, 1996
  6. I. Munro, Tables, University of Waterloo, Canada, 1996, Pages 37-42
  7. V.Mäkinen, G. Navarro, Position-Restricted Substring Searching, Springer Heidelberg, Technische Fakultät Universität Bielefeld, 2006, Pages 703-714
  8. V.Mäkinen, G. Navarro, Rank and select revisited and extended, Springer Heidelberg, University of Helsinki, 2007, Pages 332-347
  9. A. Golynski, R. Grossi, A. Gupta, R. Raman, On the Size of Succinct Indices, Springer Heidelberg, 2007, Pages 371-382
  10. a b P. Ferragina, R. Giancarlo, G. Manzini, The myriad virtues of Wavelet Trees (PDF; 529 kB), Information and Computation, Volume 207, Issue 8, August 2009, Pages 849-866
  11. P. Ferragina, G. Manzini, V. Mäkinen, G. Navarro, An Alphabet-Friendly FM-Index, Springer Heidelberg, 2004, Pages 150-160
  12. P. Ferragina, G. Manzini, V. Mäkinen, G. Navarro, Compressed representations of sequences and full-text indexes, Association for Computing Machinery (ACM), 2007, Article 20
  13. H.-L. Chan, W.-K. Hon, T.-W. Lam, and K. Sadakane, Compressed Indexes for dynamic text collections, ACM Transactions on Algorithms, 3(2), 2007