Kapitel 2 Stringmatching 2.2 Tries Gegeben sind ein Alphabet Beispiel Σ und Wörter über diesem Alphabet. {der, die, das, eine, einer, eines} Ein Trie ist ein digitaler Suchbaum, der Wörter aus einer Menge S speichert. Die Wörter sind Elemente von Suchen nach einem Wort w: Folge dem mit w Σ∗ . Das Ende eines Wortes wird mit markiert. beschriebenen Weg. Einfügen: Zunächst dem maximalen Präx im Baum folgen. Falls dies nicht mehr möglich ist, einen neuen Pfad für den Rest schaen. Streichen: Nach Wort suchen und das Blatt entfernen. Eventuell einen Weg der Form entfernen. Falls ein Wort nicht in einem Blatt endet die Knotenmarkierung am Ende bei dem Knoten des letzten Buchstabens entfernt. 2.2.1 komprimierte Tries (Patricia Tries) Bei komprimierten Tries werden (im Gegensatz zu normalen Tries) Folgen von Knoten bzw. Kanten ohne Verzweigung und Markierung mit zu einem einzigen Knoten und einer Kante zusammengefasst. Dabei werden an die Kante die einzelnen Kantenbeschriftungen geschrieben (als Teilwort zusammengefasst). 1 Suchen: Das aktuelle Wort nach und nach mit den Kantenbeschriftungen vergleichen. Einfügen: Eventuell die Kante spalten und einen neuen Knoten einfügen. Streichen: Das Blatt streichen und ggf. einzelne Kinder verschmelzen. Laufzeit: O(|w|) (w: Wort das eingefügt werden soll) Jeder innnere Knoten hat 2.2.2 ≥2 Kinder. Suxbaum Für ein Wort Beispiel α ∈ Σ∗ ( Σ ist das Alphabet): Komprimierter Trie für alle Suzes von α. α = T EST ER Die Zahl gibt die Position an wo der entsprechende Sux beginnt. (Wenn an das Wort ein Sonderzeichen 6∈ Σ ange- hängt wird z.B. T EST ER$, dann enden alle Wörter in Blättern.) Die Suche nach β ∈ Σ∗ im Suxbaum für - endet mit einem Blatt: β α: ist ein Sux von - endet erfolglos (d.h. ohne dass β α. ganz abgearbeitet ist): β In diesem Fall wird der längste Präx von ist kein Teilwort von β - endet erfolgreich (im Blatt oder einem inneren einem inneren Knoten): Im letzten Fall ist β ein Präx eines Suzes von α, β) die Menge der Suzes an, von denen β β α ist. ist ein Teilwort von α. α. β hängt, gibt (mit voran geschrieben- d.h. ein Teilwort von Der Teilbaum, der an dem letzten Knoten von der Abarbeitung von em α. gefunden, der Teilwort von ein Präx ist. ⇒ Ein Suxbaum ist eine eziente Datenstruktur für String-Matching mit Vorverarbeitung des Textes. (String-Matching geht in Zeit O(|β|)) Kontruktion von Suxbäumen Wort α = a1 . . . an βi = ai . . . an naiv: Füge nacheinander β1 . . . βn+1 mit i = 1, . . . , n, (n + 1) (leeres Wort) in den zunächst leeren Trie ein. 2 Laufzeit: O(|β1 | + · · · + |βn+1 |) also n P i = O(n2 ) i=0 Speicherplatz: Der Suxbaum hat O(n) Knoten aber die Kantenbeschriftungen durch Teilwörter können die Gesamtlänge Θ(n2 ) haben. Dies ist aber nicht nötig. Die Anfangs- und Endpositionen der Teilwörter innerhalb von α genügen. Damit: O(1) Platz pro Knoten und insgesamt O(n) Platz. eziente Konstruktion Algorithmen von Weiner (1973), McCreight (1973) und Ukkonen (1995) Algorithmus von McCreight: Es werden sogenannte Sux-Links eingefügt. Bezeichnung γ: Der Knoten bei dem das Wort γ (von der Wurzel aus) endet (falls existent). Sux-Link: Zeiger von einem Knoten der Form αγ Es werden nacheinander β1 , . . . , β n eingefügt (βi zu γ (α ∈ Σ, γ Σ∗ ) = ai . . . an ) (zum ezienten Einfügen βi+1 nach βi helfen Sux-Links.) Sicherheitshalber: α endet mit Sonderzeichen $ 6∈ Σ damit alle Suzes in Blättern enden. δi = Präx von βi der beim Einfügen schon im Baum vorhanden ist. Also: (η ist der Rest von γi , βi = δi η der noch eingefügt werden muss.) x ist das erste Zeichen von Also: η Invariante aufrecht erhalten: Nach dem Einfügen von δi = ) [und damit auch für Sei also δi = xγ βi+1 = γη wird beim Einfügen von βi+1 einfügen: Falls γ= setze einen Sux-Link auf die Wurzel, sonst Nach Invariante besitzt u einen Sux-Link. 3 βi konstruiert existiert ein Sux-Link für γ1 , . . . , γi−1 ] γi 6= , δi = αγ βi+1 β. u := Vater von γi . γi (auÿer wenn Sei γ = γ1 γ2 |{z} Beschriftung der Kante Der Sux-Link von Von dort aus wird u γ2 η liefert γ1 . einfügt um den en. Bei jedem Zwischenknoten w (u, δ1 ) w βi+1 zu erhalten Pfad nach unten zu folgen. Dabei wird das aktuell nächste Zeichen von zu nden, [O(1) Zeit pro Zwischenkonten] wenn Einfügung von βj+1 γ2 dieser Weg bereits benutzt wurde.] 4 γ1 γ2 abarbeit- benutzt, um das richitge abgearbeitet ist. [Das ist möglich, da bei der