Algorithmen und Datenstrukturen II Algorithmen zur Textverarbeitung III: D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Sommer 2009, 15. Juni 2009, c 2009 D.Rösner D. Rösner AuD II 2009... 1
Gliederung 1 Algorithmen auf Texten Einführung Standard-Trie Komprimierter Trie Suffix-Trie D. Rösner AuD II 2009... 2
Einführung Text wird vorverarbeitet (und nicht Muster wie bei Boyer-Moore bzw. KPM) besonders sinnvoll, wenn eine Reihe von Anfragen auf einem festen Text erfolgen Trie baum-basierte Datenstruktur zum Speichern von Strings, um schnellen Musterabgleich (engl. pattern matching) zu ermöglichen hauptsächliche Anwendung: im Information Retrieval daher auch der Name: Retrieval s.a. [GT06], Ch. 12.3 D. Rösner AuD II 2009... 4
Einführung Definition: Standard- Sei S eine Menge von s Strings aus dem Alphabet Σ so dass kein String in S Präfix eines anderen String. Ein Standard-Trie für S ist ein geordneter Baum T mit folgenden Eigenschaften: Jeder Knoten von T, außer der Wurzel, ist mit einem Zeichen von Σ markiert. Die Anordnung der Kinder eines internen Knoten von T ist durch eine kanonische Anordnung des Alphabets Σ bestimmt. T hat s externe Knoten, die jeweils mit einem String aus S assoziiert, so dass die Konkatenation der Marken der Knoten auf dem Pfad von der Wurzel zu einem externen Knoten ν von T den mit ν assoziierten String ergibt. s.a. [GT06], Ch. 12.3 D. Rösner AuD II 2009... 5
Standard-Trie d j M e i a a r e g n u t n s Abbildung: Standard-Trie zu den Wörtern aus dem Satz der Mann jagt die Maus D. Rösner AuD II 2009... 6
Standard-Trie Bemerkungen: Ein Trie T repräsentiert die Strings von S durch Pfade von der Wurzel zu den externen Knoten. Die Forderung, dass kein String in S Präfix eines anderen, stellt sicher, dass jeder String eindeutig mit einem externen Knoten assoziiert. Durch Hinzufügen eines Spezialzeichens, das nicht in Σ, ans Ende jedes Strings, ist diese Bedingung immer erfüllbar. Wenn d Größe des Alphabet, dann hat jeder interne Knoten zwischen 1 und d Kinder. Jeder Pfad von Wurzel von T zu einem internen Knoten v in Tiefe i entspricht dem i-zeichen-präfix X[0... i-1] eines Strings X aus S. s.a. [GT06], Ch. 12.3 D. Rösner AuD II 2009... 7
Standard-Trie d j M e i a a r e g n u [0] [14] t n s [9] [4] [18] Abbildung: Standard-Trie zu den Wörtern aus dem Satz der Mann jagt die Maus mit Information zum Vorkommen der Wörter D. Rösner AuD II 2009... 8
Standard-Trie Implementation eines Trie als Baum mit Zeichen in seinen Knoten. weitere Struktureigenschaften eines Standard- zu einer Menge S von s Strings der Gesamtlänge n aus einem Alphabet der Größe d: Die Höhe von T ist gleich der Länge des längsten Strings in S. Die Zahl der Knoten von T ist O(n). Schlechtester Fall: keine zwei Strings teilen einen gemeinsamen nichtleeren Präfix. s.a. [GT06], Ch. 12.3 D. Rösner AuD II 2009... 9
Standard-Trie Trie T auch zum Implementieren eines Wörterbuchs, wobei die Strings in S die Schlüssel. Die Suche nach einem String X erfolgt durch zeichenweises Abgleichen von der Wurzel ausgehend. Aufwand für einen String der Länge m ist O(dm) für d = Σ Begründung: besucht werden höchstens m+1 Knoten und in jedem Knoten wird O(d) Zeit (zur Auswahl des Folgeknotens) verbraucht. Weitere Verbesserung möglich, wenn die Folgeknoten so implementiert, dass der Zugriff in O(1) oder O(logd) erfolgen kann (z.b. durch Hashtable bzw. Look-up-table) s.a. [GT06], Ch. 12.3 D. Rösner AuD II 2009... 10
Standard-Trie besonders geeignet für sog. Wortabgleich (engl. word matching), d.h. Suche nach exaktem Vorkommen eines Wort in einem Text bei Verwendung eines benötigt der Abgleich beim word matching mit einem Muster der Länge m O(dm) Zeit unabhängig von der Größe des Texts (mit d = Σ ) auch geeignet für sog. Präfix-Abgleich (engl. prefix matching): Gegeben ist ein String X und es werden alle Strings in S gesucht, die X als Präfix enthalten. das Suchen nach andersartigen Vorkommen von Mustern im Text (z.b. Suche nach Vorkommen als Suffix oder nach Vorkommen, die Wörter überspannen) können mit nicht effizient erfolgen s.a. [GT06], Ch. 12.3 D. Rösner AuD II 2009... 11
Standard-Trie Aufbau eines Standard-Trie: kann inkrementell erfolgen, d.h. Wörter werden nacheinander in Trie eingefügt wenn ein String X noch nicht im Trie wird zunächst versucht, den mit X assoziierten Pfad zu verfolgen dieser geht bei einem internen Knoten ν nicht weiter, bevor Ende von X erreicht für die verbleibenden Zeichen in X wird neue Kette von Knotennachkommen von ν kreiert Aufwand für Einfügen : O(dm) Aufwand für Aufbau des gesamten Trie zu S: O(dn) mit n Gesamtlänge der Strings in S s.a. [GT06], Ch. 12.3 D. Rösner AuD II 2009... 12
Komprimierter Trie ein komprimierter Trie unterscheidet sich von einem Standard-Trie dadurch, dass jeder interne Knoten mindestens zwei Kindknoten besitzt. Aus einem Standard-Trie wird ein komprimierter Trie gewonnen, indem Ketten aufeinanderfolgender Knoten mit nur jeweils einem Kind zu einer Kante verschmolzen werden. s.a. [GT06], Ch. 12.3.2 D. Rösner AuD II 2009... 13
Komprimierter Trie d jagt Ma er ie nn us Abbildung: Komprimierter Trie zu den Wörtern aus dem Satz der Mann jagt die Maus D. Rösner AuD II 2009... 14
Komprimierter Trie Definitionen: Sei T ein Standard-Trie. Ein vom Wurzelknoten verschiedener interner Knoten ν heisst redundant, wenn ν nur ein Kind hat. Eine Kette von k 2 Kanten, (ν 0, ν 1 )(ν 1, ν 2 )...(ν k 1, ν k ), ist redundant wenn: ν i ist redundant für i = 1,..., k-1. ν 0 und ν k sind nicht redundant. s.a. [GT06], Ch. 12.3.2 D. Rösner AuD II 2009... 15
Komprimierter Trie Ein Standard-Trie T kann in einen komprimierten Trie umgewandelt werden, indem jede redundante Kette (ν 0,ν 1 )(ν 1,ν 2 )... (ν k 1,ν k ) von k 2 Kanten ersetzt wird durch eine einzige Kante (ν 0,ν k ), wobei ν k als Label den durch die Konkatenation der Zeichen aus den Knoten ν 1,...,ν k entstehenden String erhält. s.a. [GT06], Ch. 12.3.2 D. Rösner AuD II 2009... 16
Komprimierter Trie Ein komprimierter Trie, der eine Kollektion S von s Strings aus einem Alphabet der Grösse d speichert, hat folgende Eigenschaften: Jeder interne Knoten hat mindestens zwei und höchstens d Kinder. T hat s externe Knoten. Die Zahl der Knoten von T ist O(s). Bemerkung: Zahl der Knoten von T also nur noch von der Zahl s unterschiedlicher Strings, aber nicht mehr von ihrer Gesamtlänge n (wie bei Standard-Trie) abhängig. s.a. [GT06], Ch. 12.3.2, Prop. 12.7 D. Rösner AuD II 2009... 17
Suffix-Trie ein sog. Suffix-Trie liegt vor, wenn es sich bei den String in der Kollektion S um alle Suffixe eines Strings X handelt man spricht dann auch von Suffix-Baum (engl. suffix tree) oder Positionsbaum (engl. position tree) s.a. [GT06], Ch. 12.3.3 D. Rösner AuD II 2009... 18
Suffix-Trie e i mi nimize ze mize nimize ze nimize ze Abbildung: Suffix-Trie zum String minimize ; vgl. [GT06], Fig. 12.10 (a) D. Rösner AuD II 2009... 19
Suffix-Trie 7,7 1,1 0,1 2,7 6,7 4,7 2,7 6,7 2,7 6,7 Abbildung: Kompakte Version des Suffix-Trie zum String minimize ; Paar i,j verweist auf Substring X[i..j]; vgl. [GT06], Fig. 12.10 (b) D. Rösner AuD II 2009... 20
Suffix-Trie Musterabgleich mit einem Suffix-Trie Pseudocode: Algorithm suffixtriematch (T,P) Input: Kompakter Suffix-Trie T für einen Text X und Muster P Output: Index des Anfangs des ersten Teilstrings von X, der mit P übereinstimmt, oder Info, dass P nicht in X enthalten p P.length() {Länge des Pattern} j 0 {Start des Pattern-Suffix} ν T.root() repeat f true {kein Kind erfolgreich bearbeitet} for each child w of ν do... s. nächste Seite until f or T.isExternal(ν) return P kein Teilstring von X s.a. [GT06], Ch. 12.3.3 D. Rösner AuD II 2009... 21
Suffix-Trie Pseudocode (cont.): for each child w of ν do i start(ν) if (P[j] = T[i]) then x end(w)-i+1 if p x then if (P[j..j+p-1] = X[i..i+p-1]) then return i - j {match } else return P kein Teilstring von X else if (P[j..j+x-1] = X[i..i+x-1]) then p p - x {Länge des verbleibenden Pattern} j j + x {neuer Start des Pattern-Suffix} ν w f false s.a. [GT06], Ch. 12.3.3 break out of the for loop D. Rösner AuD II 2009... 22
Suffix-Trie wichtige Anwendung von Suffix-: in Web-Suchmaschinen s.a. [GT06], Ch. 12.3.4 D. Rösner AuD II 2009... 23
Literatur: I Michael T. Goodrich and Roberto Tamassia. Data Structures and Algorithms in Java. John Wiley & Sons, New York, 2006. ISBN-10 0-471-73884-0; ISBN-13 978-0-471-73884-8;4th edition. D. Rösner AuD II 2009... 24