Wavelet Tree
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
BearbeitenEin 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.
- Falls , so besteht der Baum aus nur einem Blatt mit dem Label .
- 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
BearbeitenDer 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
BearbeitenDer Wavelet Tree unterstützt die Operationen , und in Zeit, falls ein balancierter Baum konstruiert wurde.
Access
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: 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: 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
BearbeitenDer 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
BearbeitenDiese 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
BearbeitenDer 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
BearbeitenDer 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
BearbeitenHierbei repräsentiert der Wavelet Tree eine Menge von Punkten.
Erweiterungen
BearbeitenIn 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- Wavelet Trees. Blog, der die Konstruktion und Anfragen eines Wavelet Trees mit Beispielen beschreibt.
Einzelnachweise
Bearbeiten- ↑ 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
- ↑ 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
- ↑ G. Jacobson, Space-efficient static trees and graphs (PDF; 381 kB), International Journal of Foundations of Computer Science (IJFCS), 1989, Pages 549-554
- ↑ D. Clark, Compact Pat Tree (PDF; 6,7 MB), University of Waterloo, Canada, 1996
- ↑ I. Munro, Tables, University of Waterloo, Canada, 1996, Pages 37-42
- ↑ A. Golynski, R. Grossi, A. Gupta, R. Raman, On the Size of Succinct Indices, Springer Heidelberg, 2007, Pages 371-382
- ↑ 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
- ↑ P. Ferragina, G. Manzini, V. Mäkinen, G. Navarro, An Alphabet-Friendly FM-Index, Springer Heidelberg, 2004, Pages 150-160
- ↑ 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
- ↑ 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