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.

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.

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.

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

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

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

 : 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.

 : 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.

 : 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

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

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

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

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

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

Erweiterungen

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].

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

Einzelnachweise

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