Kapitel 2. Suche nach endlich vielen Wörtern. R. Stiebe: Textalgorithmen, Winter 2005/06 113

Ähnliche Dokumente
1.8 Shift-And-Algorithmus

Kapitel 1. Exakte Suche nach einem Wort. R. Stiebe: Textalgorithmen, WS 2003/04 11

Exakte Suche nach einem Wort

Algorithmische Bioinformatik 1

4.4 Anwendungen von Suffixbäumen und Suffix-Arrays

Algorithmische Bioinformatik 1

2.2 Der Algorithmus von Knuth, Morris und Pratt

Effiziente Algorithmen 2

Algorithmen und Datenstrukturen II. Suchen in Texten. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Effiziente Algorithmen und Komplexitätstheorie

Suchen in Texten. Naives Suchen Verfahren von Knuth-Morris-Pratt Verfahren von Boyer-Moore Ähnlichkeitssuchen Editierdistanz

Lernmodul 7 Algorithmus von Dijkstra

Algorithmen auf Sequenzen

Reguläre Sprachen. R. Stiebe: Theoretische Informatik für ING-IF und Lehrer,

TU München. Hauptseminar: WS 2002 / Einführung in Suffix - Bäume

Algorithmen und Datenstrukturen II

Gierige Algorithmen Interval Scheduling

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Algorithmen und Datenstrukturen

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Algorithmen & Komplexität

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Sommersemester Dr. Tobias Lasser

Informatik II: Algorithmen & Datenstrukturen. Blättern Sie nicht um bevor Sie dazu aufgefordert werden!

Proseminar String Matching

Zeichenketten. 29. April 2015 Benedikt Lorch. Benedikt Lorch Zeichenketten April

Relationen und DAGs, starker Zusammenhang

Universität Bremen. Textsuche. Thomas Röfer. Naive Suche Verfahren von Knuth-Morris-Pratt Verfahren von Boyer-Moore Ähnlichkeitssuche Editierdistanz

4.9.7 Konstruktion der Suffixbäume

Indexieren und Suchen

Algorithmische Bioinformatik 1

Grundlagen: Algorithmen und Datenstrukturen

5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS)

Algorithmen I - Tutorium 28 Nr. 11

Algorithmen und Komplexität Lösungsvorschlag zu Übungsblatt 8

19. Dynamic Programming I

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

10. Übungsblatt zu Algorithmen I im SS 2010

Humboldt-Universität zu Berlin Berlin, den Institut für Informatik

7. Sortieren Lernziele. 7. Sortieren

Datenstrukturen & Algorithmen

ADS: Algorithmen und Datenstrukturen 1

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Informatik II Prüfungsvorbereitungskurs

Einführung in die Informatik 2

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

String - Matching. Kapitel Definition

Theoretische Grundlagen der Informatik. Vorlesung am 02. November INSTITUT FÜR THEORETISCHE INFORMATIK

Algorithmen und Datenstrukturen, FS17 Prof Dr Christian Tschudin

Algorithmen und Datenstrukturen 2

Algorithmen und Datenstrukturen

Technische Universität München. Vorlesungsgrobstruktur: wo stehen wir, wie geht s weiter

8 Diskrete Optimierung

Datenstrukturen und Algorithmen. 7. Suchen in linearen Feldern

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Übersicht: Graphen. Definition: Ungerichteter Graph. Definition: Ungerichteter Graph

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

Effiziente Algorithmen und Komplexitätstheorie

Polynomielle Verifizierer und NP

Textkompression. Komprimierung von Daten. Runlength Komprimierung (2) Runlength Komprimierung (1) Herkömmliche Kodierung. Runlength Komprimierung (3)

Voronoi-Diagramme. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

14. Rot-Schwarz-Bäume

8.4 Suffixbäume. Anwendungen: Information Retrieval, Bioinformatik (Suche in Sequenzen) Veranschaulichung: DNA-Sequenzen

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

Was bisher geschah. 1. Zerlegung in monotone Polygone 2. Triangulierung der monotonen Teilpolygone

1.5 Turing-Berechenbarkeit

...imbeispiel: Die Konkatenation der Blätter des Ableitungsbaums t bezeichnen wir auch mit yield(t). liefert die Konkatenation: name int + int.

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

1.5 Turing-Berechenbarkeit

Algorithmen & Komplexität

Theoretische Grundlagen der Informatik

Bereichsabfragen II. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie

Reguläre Sprachen und endliche Automaten

Thomas Behr. 17. November 2011

Kapitel 12: Induktive

Exkurs Eine Algorithm-Engineering-Fallstudie Volltextsuche mit invertiertem Index

Datenstrukturen und Algorithmen 2. Klausur SS 2001

Bereichsabfragen II. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie

Zweizusammenhang und starker Zusammenhang

10. Sortieren III. Untere Schranken für das vergleichsbasierte Sortieren, Radix- und Bucketsort

Vorlesung Datenstrukturen

Algorithmen & Datenstrukturen Midterm Test 2

19. Dynamic Programming I

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem

Anwenundg regulärer Sprachen und endlicher Automaten

3. Binäre Suchbäume. 3.1 Natürliche binäre Suchbäume. EADS 3.1 Natürliche binäre Suchbäume 78/598 ľernst W. Mayr

NAME, VORNAME: Studiennummer: Matrikel:

Datenstrukturen und Algorithmen D-INFK

Algorithmische Bioinformatik

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Software Engineering Ergänzung zur Vorlesung

Text Analytics. Referat: Improving Suffix Array Locality for Fast Pattern Matching on Disk

Algorithmen und Datenstrukturen

Theoretische Grundlagen der Informatik

EINI LogWing/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 17/18

Maike Buchin 18. Februar 2016 Stef Sijben. Probeklausur. Theoretische Informatik. Bearbeitungszeit: 3 Stunden

Einführung in die Theoretische Informatik

Erinnerung VL

Das Problem des Handlungsreisenden

Datenstrukturen & Algorithmen

Transkript:

Kapitel 2 Suche nach endlich vielen Wörtern R. Stiebe: Textalgorithmen, Winter 2005/06 113

Übersicht Aufgabenstellung Gegeben: Text T und eine endliche Menge von Wörtern P = {P 1,..., P r }; Gesucht: alle Vorkommen von Wörtern aus P in T. r Notation: T = n, P = r, P i = M, i=1 max{ P i : 1 i r} = m, min{ P i : 1 i r} = µ. Anzahl r der Suchwörter häufig sehr groß separate Suche nicht sinnvoll. Viele Ideen aus der Suche nach einem Wort sind verallgemeinerbar. Algorithmen zur simultanen Suche nutzen Suchwort-Bäume (tries). Verwandte Probleme: Suche in Wörterbüchern, Suche nach Bildern R. Stiebe: Textalgorithmen, Winter 2005/06 114

2.1 Suchwort-Bäume (Tries) Definition. Es sei P = {P 1,..., P r } eine Menge von Wörtern. Der Suchwort-Baum (Trie) für P ist der gerichtete Baum Trie(P), der folgende Bedingungen erfüllt: 1. Jede Kante ist mit genau einem Buchstaben beschriftet. 2. Keine zwei Kanten mit dem gleichen Ausgangsknoten haben die gleiche Beschriftung. 3. Jeder Knoten v hat eine Information info(v) {0, 1,..., r}. Ist die Beschriftung L(v) des Weges von der Wurzel nach v ein Wort P i mit 1 i r, so gilt info(v) = i; anderenfalls ist info(v) = 0. 4. Ist v ein Blatt, so gilt L(v) P. 5. Für jedes Wort P P gibt es einen Knoten v mit L(v) = P. R. Stiebe: Textalgorithmen, Winter 2005/06 115

Beispiel Trie P = {aabab, ab, abb, baba} a b a b 1 2 3 4 5 a b 0 b 6 7 b 8 a 9 10 11 b a Wurzel: 0 info(5) = 1, info(6) = 2, info(7) = 3, info(11) = 4. Trie(P) ist der minimale pdea, der P akzeptiert und dessen Graph ein Baum ist. R. Stiebe: Textalgorithmen, Winter 2005/06 116

Algorithmus 2.1 Konstruktion des Suchwort-Baumes Eingabe: Menge von Wörtern P = {P 1, P 2,..., P r } Ausgabe: Suchwort-Baum Trie(P) (1) V {root}; E ; (2) for k 1 to r (3) t 1; v root; (4) while t P k and (E enthält die Kante (v, P k [t], u)) (5) v u; t t + 1; (6) for i t to P k (7) u neuer Knoten; info(u) 0; (8) V V {u}; E E {(v, P [k], u)}; (9) v u; (10) info(v) k; (11) return (V, E); R. Stiebe: Textalgorithmen, Winter 2005/06 117

Algorithmus 2.2 Naive Suche mit Tries Eingabe: Menge von Wörtern P, Text T mit T = n Ausgabe: Menge S der Vorkommen von Wörtern aus P in T (1) Konstruiere Trie(P) mit der Wurzel root. (2) S ; k 1; (3) for k 1 to n (4) j k; v root; (5) while (es gibt in Trie(P) eine Kante (v, T [j], u)) (6) v u; j j + 1; (7) if info(v) > 0 then S S {(k, info(v))}; (8) return S; Laufzeit (Voraussetzung: alle Suchwörter haben gleiche Länge m) schlechtester Fall: Θ(n m), mittlerer Fall: Θ(n log σ r). R. Stiebe: Textalgorithmen, Winter 2005/06 118

2.2 DEA-Suche und Aho-Corasick-Algorithmus Verallgemeinerung der DEA-Suche für ein Wort bzw. des MP-Algorithmus Verallgemeinerung des Randes: Fehler-Link (failure link) Für korrekte Ausgabe: Ausgabe-Link (output link) Laufzeit: O(M) für das Präprozessing, O(n) für die Suche R. Stiebe: Textalgorithmen, Winter 2005/06 119

Fehler-Links Definition. Für einen von der Wurzel verschiedenen Knoten v aus Trie(P) sei Fail v der Knoten, für den L(Fail v ) das längste echte Suffix von L(v) ist, das Präfix eines Wortes aus P ist. Man bezeichnet Fail v als Fehler-Link (failure link) von v. Konstruktion der Fehler-Links in Linearzeit analog zur Bestimmung der Border- Tabelle unter Verwendung bereits ermittelter Fehler-Links Dabei werden die Knoten mit wachsender Tiefe (in BFS-Ordnung) betrachtet R. Stiebe: Textalgorithmen, Winter 2005/06 120

Beispiel Für P = {aabab, ab, abb, baba} erhalten wir folgende Fehler-Links: a b a b 1 2 3 4 5 a b 0 6 7 b b 8 9 10 11 a b a R. Stiebe: Textalgorithmen, Winter 2005/06 121

Algorithmus 2.3 Bestimmung der Fehler-Links in einem Trie Eingabe: Trie(P) für Menge von Wörtern P Ausgabe: Tabelle Fail der Fehler-Links für Trie(P) (1) foreach Knoten v in Trie(P) der Tiefe 1 (2) Fail v root; (3) foreach Knoten v der Tiefe > 1 in BFS-Ordnung (4) x Beschriftung der Kante (parent(v), v); (5) t Fail parent(v) ; (6) while (es gibt keine Kante (t, x, u) and t root) (7) t Fail t ; (8) if es gibt Kante (t, x, u) then Fail v u; (9) else Fail v root; (10) return Fail; Satz. Algorithmus 2.3 bestimmt die Fehler-Links mit einem Aufwand von O(M). R. Stiebe: Textalgorithmen, Winter 2005/06 122

Konstruktion des DEA Konstruktion analog zum DEA für ein Wort: Grundstruktur ist der Trie Bestimmung der Überführungsfunktion δ(root, x) = δ(v, x) = { u root { u falls Trie(P) die Kante (root, x, u) enthält, sonst. δ(fail(v), x) falls Trie(P) die Kante (v, x, u) enthält, sonst. Endzustände: v ist Endzustand ein Suffix von L(v) ist in P info(v) > 0 oder Fail(v) ist Endzustand R. Stiebe: Textalgorithmen, Winter 2005/06 123

Beispiel DEA P = {aabab, ab, abb, baba}; zusätzliche Endzustände: 3, 10. a b a b 1 2 3 4 5 a b 0 6 7 b b 8 9 10 11 a b a 0 1 2 3 4 5 6 7 8 9 10 11 a 1 2 2 4 2 11 9 9 9 2 11 2 b 8 6 3 7 5 7 7 8 8 10 7 10 R. Stiebe: Textalgorithmen, Winter 2005/06 124

Ausgabe-Links Für Endzustand des DEA soll festgestellt werden, welche Suchwörter gefunden wurden. Beispiel: 3 {P 2 }, 5 {P 1, P 2 }, 6 {P 2 }, 7 {P 3 }, 10 {P 2 }, 11 {P 4 }. Effiziente Speicherung durch Ausgabe-Links. Definition. Für einen von der Wurzel verschiedenen Knoten v aus Trie(P) sei Out v der Knoten, für den L(Out v ) das längste echte Suffix von v ist, das ein Wort aus P {ε} ist. Man bezeichnet Out v als Ausgabe-Link (output link) von v. Zu Knoten v gehörende Wörter: 0. Keine, falls v die Wurzel ist. 1. P i, falls info(v) = i > 0. 2. Alle zu Out(v) gehörenden Wörter. R. Stiebe: Textalgorithmen, Winter 2005/06 125

Beispiel: Ausgabe-Links Für P = {aabab, ab, abb, baba} erhalten wir folgende Ausgabe-Links (Links zur Wurzel sind weggelassen): 1 2 3 4 5 a b 0 6 7 b b a b a b 8 a 9 10 11 b a R. Stiebe: Textalgorithmen, Winter 2005/06 126

Algorithmus 2.4 DEA-Suche nach endlich vielen Wörtern Eingabe: endliche Menge von Wörtern P, Text T Ausgabe: Menge S der Vorkommen von Wörtern aus P in T (1) Präprozessing: Konstruiere den DEA A P und Ausgabe-Links; (2) S ; v root; (3) for j 1 to T (4) v δ(v, T [j]); i info(v); (5) if i > 0 then (6) S S {(j P i + 1, i)}; (7) t Out v ; i info(t); (8) while t root (9) S S {(j P i + 1, i)}; (10) t Out t ; i info(t); (11) return S; R. Stiebe: Textalgorithmen, Winter 2005/06 127

Algorithmus 2.5 Aho-Corasick-Algorithmus Eingabe: Menge von Wörtern P, Text T Ausgabe: Menge S der Vorkommen von Wörtern aus P in T (1) Präprozessing: Bestimme Trie(P) mit Fehler- und Ausgabe-Links; (2) S ; v root;j 1; (3) for j 1 to T (4) while es gibt keine Kante (v, T [j], u) and v root (5) v Fail v ; (6) if es gibt Kante (v, T [j], u) then v u; (7) i info(v); (8) if i > 0 then (9) S S {(j P i + 1, i)}; (10) t Out v ; i info(t); (11) while t root (12) S S {(j P i + 1, i)}; (13) t Out t ; i info(t); (14) return S; R. Stiebe: Textalgorithmen, Winter 2005/06 128

Einfluss der Alphabetgröße bei Algorithmen mit Tries Alphabetgröße spielt eine Rolle bei der Bestimmung des nächsten Knotens. Sei v ein Knoten mit d ausgehenden Kanten. Mögliche Implementierungen der ausgehenden Kanten: 1. Liste; Platzbedarf: Θ(d); Zeit: Θ(d) 2. geordnetes Array (geordnet nach Beschriftung der Kanten); Platzbedarf: Θ(d); Zeit: Θ(log d), da binäre Suche ungünstig für dynamische Tries (Einfügen bzw. Löschen von Wörtern) 3. Array über Σ; Platzbedarf: Θ(σ); Zeit: Θ(1) R. Stiebe: Textalgorithmen, Winter 2005/06 129

2.3 Weitere Algorithmen Shift-And-Algorithmus für Mengen praktikabel für kleine Suchwort-Mengen Commentz-Walter-Algorithmus Verallgemeinerung des Boyer-Moore-Algorithmus historisch erster Algorithmus mit sublinearer mittlerer Laufzeit Horspool-Algorithmus für Mengen praktikabel für kleine Suchwort-Mengen und große Alphabete Wu-Manber-Algorithmus Verallgemeinerung des Horspool-Algorithmus mit verallgemeinerter Bad Character Regel; zusätzlich Einsatz von Hash-Tabellen allgemein sehr effizient Rückwärts-Faktor-Algorithmen Rückwärts-NEA praktikabel für kleine Suchwort-Mengen Orakel-DEA allgemein sehr effizient R. Stiebe: Textalgorithmen, Winter 2005/06 130

Shift-And-Algorithmus für Mengen Verallgemeinerung des Shift-And-Algorithmus für ein Wort Theoretischer Hintergrund: NEA für Sprache Σ P Bitvektoren I bzw. F kodieren Start bzw. Ende der einzelnen Wörter Länge der Bitvektoren: M. Damit effizient, wenn M w. w: Länge eines Computer-Wortes R. Stiebe: Textalgorithmen, Winter 2005/06 131

Theorie: NEA für Σ P Sei P = {P 1, P 2,..., P r } über Σ mit P i = m i. Dann akzeptiert der NEA P = (Z, Σ, δ, I, F ) mit Z = {(i, j) : 1 i r, 0 j m i }, I = {(i, 0) : 1 i r}, F = {(i, m i ) : 1 i r} und der Menge der Transitionen die Menge Σ P. δ = {((i, 0), x, (i, 0)) : 1 i r, x Σ} {((i, j 1), P i [j], (i, j)) : 1 i r, 1 j m i } R. Stiebe: Textalgorithmen, Winter 2005/06 132

P = {aabab, ab, abb, baba}, Σ = {a, b, c} Beispiel: NEA für Σ P 1, 0 a 1, 1 a 1, 2 b 1, 3 a 1, 4 b 1, 5 Σ 2, 0 a 2, 1 b 2, 2 Σ 3, 0 a 3, 1 b 3, 2 b 3, 3 Σ 4, 0 b 4, 1 a 4, 2 b 4, 3 a 4, 4 Σ R. Stiebe: Textalgorithmen, Winter 2005/06 133

Kodierung durch Bitvektoren Sei P = {P 1, P 2,..., P r } über Σ mit P i = m i. Bitvektoren für P ergeben sich durch Konkatenation der Bitvektoren für die einzelnen Wörter: B x = B x (P) = B x (P r ) B x (P 2 )B x (P 1 ) für x Σ; I = I(P) = I(P r ) I(P 2 )I(P 1 ) mit I(P i ) = 0 m i 1 1; F = F (P) = F (P r ) F (P 2 )F (P 1 ) mit F (P i ) = 10 m i 1 ; Initialisierung: Z 0 M. Schritt für Textzeichen x: Z ((Z << 1) I) & B x. Test auf Endzustand: Z & F 0. R. Stiebe: Textalgorithmen, Winter 2005/06 134

Bitvektoren Beispiel Für P = {aabab, ab, abb, baba} und Σ = {a, b, c} erhalten wir folgende Bitvektoren der Länge 5 + 2 + 3 + 4 = 14: B a = 1010 001 01 01011, B b = 0101 110 10 10100, B c = 0000 000 00 00000, I = 0001 001 01 00001, F = 1000 100 10 10000. R. Stiebe: Textalgorithmen, Winter 2005/06 135

Horspool-Algorithmus für Mengen In einer Phase Suche von rechts nach links mit Hilfe von Trie(P r 1, P r 2,..., P r r ). Verschiebungsregel für Textzeichen x Σ: Shift x (P) = min{shift x (P i ) : 1 i r}. Wenn Shift x > 0, Verschiebung um Shift x ; anderenfalls Suche von rechts nach links mittels Trie(P r 1, P r 2,..., P r r ). effizient für große Alphabete und wenige Suchwörter (z.b. bis zu 10 Wörter in natürlichsprachigem Text) Generell gilt: größtmögliche Verschiebung ist µ = min{ P 1, P 2,..., P r }. Für die Ermittlung der Shift-Werte braucht man nur die Suffixe der Länge µ zu betrachten. R. Stiebe: Textalgorithmen, Winter 2005/06 136

Beispiel 1. Für P = {aabab, ab, abb, baba} und Σ = {a, b, c} gilt Shift a (P) = Shift b (P) = 0 und Shift c (P) = 2. Der Horspool-Algorithmus ist hier recht ineffizient. 2. Für P = {textalgorithmen, theoretische, informatik} ergibt sich folgende Shift- Tabelle, wobei für alle nicht explizit genannten Symbole steht: a c e g h i k l m n o r s t 3 2 0 8 1 1 0 9 2 0 6 5 3 2 10 Der Horspool-Algorithmus ist hier sehr effizient. R. Stiebe: Textalgorithmen, Winter 2005/06 137

Wu-Manber-Algorithmus Verallgemeinerung des Horspool-Algorithmus mit erweiterter Bad Character Regel Optimale Wahl der Blocklänge q = log σ (r µ). Mittlere Zahl der Vergleiche pro Phase: q, mittlere Verschiebung: µ. Aus Platzgründen oft keine Speicherung der Shift-Werte aller q-tupel; stattdessen Verwendung von Hash-Werten für die q-tupel Keine Konstruktion eines Tries; stattdessen Verwendung von Hash-Werten für die Suchwörter R. Stiebe: Textalgorithmen, Winter 2005/06 138

Hash-Funktion für die Shift-Tabelle Sei P = {P 1, P 2,..., P r }. Für α Σ q : Shift α (P) = min{shift α (P i ) : 1 i r} Ergeben die letzten q Textzeichen α und gilt Shift α > 0, so endet hier kein Vorkommen eines Wortes aus P, und man darf um Shift α verschieben. Anderenfalls muss man prüfen, ob ein Wort aus P vorliegt, und man darf anschließend um 1 verschieben. Platzbedarf für Shift-Tabelle: σ q. Platzersparnis durch Hash-Funktion: Hash 1 : Σ q {1, 2,..., p 1 }. Array SHIFT der Größe p 1 : SHIFT i = min{shift α : Hash 1 (α) = i}. Für Textblock α berechne i = Hash 1 (α), verschiebe um SHIFT i. R. Stiebe: Textalgorithmen, Winter 2005/06 139

Beispiel Σ = {0, 1, 2, 3}, q = 2, P 1 = 1200321, P 2 = 03123232, P 3 = 101232310. p 1 = 11, Hash 1 (ab) = ((4a + b) mod 11) + 1. Block 00,23 01,30 02,31 03,32 10,33 11 12 13 20 21 22 Hash 1 1 2 3 4 5 6 7 8 9 10 11 SHIFT 1 6 1 0 0 6 4 6 4 0 6 Einige Situationen Text-Block Hash 1 SHIFT Aktion 00 1 1 Verschiebe um 1. 03 4 0 Überprüfung notwendig. 12 7 4 Verschiebe um 4. 32 4 0 Überprüfung notwendig. R. Stiebe: Textalgorithmen, Winter 2005/06 140

Hash-Funktion für die Suchwörter Hash 2 : Σ q {1, 2,..., p 2 }. Hash 2 (P i ) = Hash 2 (α i ), wobei α i das Suffix der Länge q von P i ist. Array PAT der Größe p 2. PAT j = {i : Hash 2 (P i ) = j}. Benutzung: Ist der Textblock α und SHIFT Hash1 (α) = 0, so teste alle P i mit i PAT Hash2 (α) auf ein Vorkommen. Vorteil: Es muss kein Trie konstruiert werden. (Platzersparnis, einfache Programmierung) Nachteil: Schlimmstenfalls muss man alle Suchwörter testen. (natürlich sehr unwahrscheinlich) R. Stiebe: Textalgorithmen, Winter 2005/06 141

Beispiel Σ = {0, 1, 2, 3}, q = 2, P 1 = 1200321, P 2 = 03123232, P 3 = 101232310. p 2 = 3, Hash 2 (ab) = ((4a + b) mod 3) + 1 für a, b Σ. Suchwort P 1 P 3 P 2 Hash 2 1 2 3 PAT {1} {3} {2} Einige Situationen Text-Block Hash 1 SHIFT Hash 2 Aktion 00 1 1 Verschiebe um 1. 03 4 0 1 Teste, ob P 1 vorliegt. Dann verschiebe um 1. 12 7 4 Verschiebe um 4. 32 4 0 3 Teste, ob P 2 vorliegt. Dann verschiebe um 1. R. Stiebe: Textalgorithmen, Winter 2005/06 142

2.4 Suche in Wörterbüchern Gegeben: P = {P 1, P 2,..., P r } und ein Wort T. Frage: Ist T in P enthalten? Nach Vorverarbeitung von P soll die Frage effizient, d.h. möglichst in Zeit O( T ) beantwortet werden können. Lösung: Konstruiere Trie(P). Suche dann in Trie(P) nach dem Pfad T. Anwendung: Rechtschreibprüfung, Kompression (mit dynamischen Wörterbüchern) Alternative Datenstrukturen 1. Minimaler DEA für P (gerichteter azyklischer Graph) 2. Sortierung von P nach lexikographischer Ordnung, binäre Suche. Beide Strukturen sparen Platz, sind aber nur für unveränderliche Wörterbücher einfach zu handhaben. R. Stiebe: Textalgorithmen, Winter 2005/06 143

Anwendung von Wörterbüchern: LZW-Kompression Eingabe: Text T Σ mit T = n, Σ = {a 1, a 2,..., a σ } Ausgabe: Wort Z über N (komprimierte Version von T ) T kann aus Z rekonstruiert werden. Benutzung eines dynamischen Wörterbuchs D. Initialisierung: D = (a 1, a 2,... a σ ). Kompressionsschritt: Sei T [1... i] bereits komprimiert; das Präfix α von T [i+1... n] sei in D enthalten, das Präfix αa von T [i+1... n] sei nicht in D enthalten. Dann wird an Z die Position (der Index) von α in D angehängt, und αa in das Wörterbuch aufgenommen. Komprimiert ist das Wort T [1... i + α ]. Z kann in Zeit O(n) aus T bestimmt werden, wenn D durch einen Trie realisiert wird. R. Stiebe: Textalgorithmen, Winter 2005/06 144

Algorithmus 2.6 LZW-Kompression Eingabe: Text T Σ, T = n, Σ = {a 1, a 2,..., a σ } Ausgabe: Komprimierter Text (Indexfolge) Z (1) D {1 a 1, 2 a 2,..., σ a σ }; d σ + 1; (2) Z ε; j 1; (3) while j n (4) i j; (5) while D enthält T [i... j] (6) j j + 1; (7) Z Z Index von T [i... j 1]; (8) D D {d T [i... j]}; d d + 1; (9) return Z; R. Stiebe: Textalgorithmen, Winter 2005/06 145

LZW-Kompression: Beispiel Für Σ = {a, b, c} und T = bacbacbacba ergibt sich folgender Ablauf des Algorithmus. Der Index eines Wortes im Wörterbuch ergibt sich aus seiner Position. Die Position im Text wird durch den senkrechten Strich angezeigt. Wörterbuch Text Ausgabe Neuer Eintrag (a, b, c) bacbacbacba 2 ba (a, b, c, ba) b acbacbacba 1 ac (a, b, c, ba, ac) ba cbacbacba 3 cb (a, b, c, ba, ac, cb) bac bacbacba 4 bac (a, b, c, ba, ac, cb, bac) bacba cbacba 6 cba (a, b, c, ba, ac, cb, bac, cba) bacbacb acba 5 acb (a, b, c, ba, ac, cb, bac, cba, acb) bacbacbac ba 4 Die Ausgabe ist somit (2, 1, 3, 4, 6, 5, 4). R. Stiebe: Textalgorithmen, Winter 2005/06 146

Algorithmus 2.7 LZW-Dekompression Eingabe: LZW-komprimierter Text Z, Z = k, Alphabet Σ = {a 1, a 2,..., a σ } Ausgabe: dekomprimierter Text T Σ (1) D {1 a 1, 2 a 2,..., σ a σ }; d σ + 1; (2) T ε; (3) for i 1 to k 1 (4) w Wort mit Index Z[i]; (5) T T w; (6) a erstes Symbol von Wort mit Index Z[i + 1]; (7) D D {d wa}; d d + 1; (8) T T Wort mit Index Z[k]; (9) return T ; R. Stiebe: Textalgorithmen, Winter 2005/06 147

LZW-Dekompression: Beispiel Für Σ = {a, b, c} und Z = (2, 1, 3, 4, 6, 5, 4) ergibt sich folgender Ablauf der Dekompression. Der Index eines Wortes im Wörterbuch ergibt sich aus seiner Position. Die Position im komprimierten Text wird durch den senkrechten Strich angezeigt. Wörterbuch komprimierter Text Ausgabe Neuer Eintrag (a, b, c) ( 2, 1, 3, 4, 6, 5, 4) b ba (a, b, c, ba) (2 1, 3, 4, 6, 5, 4) a ac (a, b, c, ba, ac) (2, 1 3, 4, 6, 5, 4) c cb (a, b, c, ba, ac, cb) (2, 1, 3 4, 6, 5, 4) ba bac (a, b, c, ba, ac, cb, bac) (2, 1, 3, 4 6, 5, 4) cb cba (a, b, c, ba, ac, cb, bac, cba) (2, 1, 3, 4, 6 5, 4) ac acb (a, b, c, ba, ac, cb, bac, cba, acb) (2, 1, 3, 4, 6, 5 4) ba Die Ausgabe ist somit bacbacbacba. R. Stiebe: Textalgorithmen, Winter 2005/06 148