Zeichenketten Michael Fularczyk 17.05.2011 Michael Fularczyk Zeichenketten 17.05.2011 1 / 41
Inhalt Zeichenketten Zeichensätze Darstellung Suchverfahren naive Stringsuche Knuth-Morris-Pratt Boyer-Moore Rabin-Karp Manacher Tries Bibliotheksfunktionen Michael Fularczyk Zeichenketten 17.05.2011 2 / 41
Zeichenketten Zeichenketten Michael Fularczyk Zeichenketten 17.05.2011 3 / 41
ASCII American Standard Code for Information Interchange 1 Zeichen == 1 Byte (msb ungenutzt) 128 Zeichen. Problem: Siehe Name (American Standard) Lösung: Viel Gefrickel (ISO-8859-X, Windows 1252,...) ASCII Tabelle: man ascii jfgi... Michael Fularczyk Zeichenketten 17.05.2011 4 / 41
UTF-8/16/32 UTF-8: 1-4 Byte pro Zeichen UTF-16: 2 4 Byte pro Zeichen UTF-32: 4 Byte pro Zeichen In C/C++ wchar t Michael Fularczyk Zeichenketten 17.05.2011 5 / 41
Darstellung length get(n) add(n,c), del(n) Array \0 -terminiert O(n) O(1) O(n) Array mit Länge O(1) O(1) O(n) Linked List O(n) O(n) O(1) Michael Fularczyk Zeichenketten 17.05.2011 6 / 41
Suchverfahren Suchverfahren Michael Fularczyk Zeichenketten 17.05.2011 7 / 41
Naive Suche f o r i = 0 to t e x t { gefunden = t r u e ; f o r j = 0 to p a t t e r n { i f t e x t [ i ] == p a t t e r n [ j ] c o n t i n u e gefunden = f a l s e break } i f! gefunden c o n t i n u e r e t u r n t r u e } Michael Fularczyk Zeichenketten 17.05.2011 8 / 41
Naive Suche f o r i = 0 to t e x t { gefunden = t r u e ; f o r j = 0 to p a t t e r n { i f t e x t [ i ] == p a t t e r n [ j ] c o n t i n u e gefunden = f a l s e break } i f! gefunden c o n t i n u e r e t u r n t r u e } Aufwand: O( String Muster ) Michael Fularczyk Zeichenketten 17.05.2011 8 / 41
Knuth-Morris-Pratt Schiebt das Pattern bei Mismatch Somit muss nicht jedes Zeichen vom String mit dem Pattern verglichen werden. Michael Fularczyk Zeichenketten 17.05.2011 9 / 41
Knuth-Morris-Pratt - Suche 1 1 Quelle: www.wi.uni-muenster.de/pi/lehre/ss08/info2/folien/info2k5.pdf Michael Fularczyk Zeichenketten 17.05.2011 10 / 41
Knuth-Morris-Pratt - Suche Suchvorgang: a b c a b c a b d a a b c a b d Michael Fularczyk Zeichenketten 17.05.2011 11 / 41
Knuth-Morris-Pratt - Suche Suchvorgang: a b c a b c a b d a a b c a b d Michael Fularczyk Zeichenketten 17.05.2011 12 / 41
Damit das funktioniert, Vorberechnung nötig. Präfix-Tabelle: a b a b c a b a b Michael Fularczyk Zeichenketten 17.05.2011 13 / 41
Damit das funktioniert, Vorberechnung nötig. Präfix-Tabelle: a b a b c a b a b 0 0 1 2 0 1 2 3 4 Michael Fularczyk Zeichenketten 17.05.2011 13 / 41
Knuth-Morris-Pratt - Anmerkungen Aufwände: Vorbereitung: O(m) Suche: O(n) Gesamt Worst-Case: O(n + m) Gesamt Avg/Best-Case: O(n) Laufzeit somit immer linear. Michael Fularczyk Zeichenketten 17.05.2011 14 / 41
Boyer-Moore Schieben des Patterns wie bei KMP Zwei Strategien zur Berechnung der Schrittweite: bad character - Anhand des ungleichen Zeichens good suffix - Anhand übereinstimmender Zeichen Schiebt Pattern um maximale Weite Vergleicht String/Pattern von Rechts nach Links Michael Fularczyk Zeichenketten 17.05.2011 15 / 41
Boyer-Moore - Suche 2 2 Quelle: www.wi.uni-muenster.de/pi/lehre/ss08/info2/folien/info2k5.pdf Michael Fularczyk Zeichenketten 17.05.2011 16 / 41
Boyer-Moore - bad character Suchvorgang: a b a d b d a a b b d a a b b Michael Fularczyk Zeichenketten 17.05.2011 17 / 41
Boyer-Moore - bad character Suchvorgang: a b a d b d a a b b d a a b b Michael Fularczyk Zeichenketten 17.05.2011 18 / 41
Boyer-Moore - bad character Suchvorgang: a b a d b d a a b b d a a b b Michael Fularczyk Zeichenketten 17.05.2011 19 / 41
Boyer-Moore - bad character Erstelle Tabelle mit Indizes für Zeichen im Pattern Verschiebe bei Mismatch an gespeicherte Position Pattern: a b a b c a d a b Michael Fularczyk Zeichenketten 17.05.2011 20 / 41
Boyer-Moore - bad character Erstelle Tabelle mit Indizes für Zeichen im Pattern Verschiebe bei Mismatch an gespeicherte Position Pattern: a b a b c a d a b Tabelle: a b c d e f g... 8 9 5 7-1 -1-1 -1 Michael Fularczyk Zeichenketten 17.05.2011 20 / 41
Boyer-Moore - good suffix Wie KMP nur Suffix statt Präfix Suchvorgang: a a a g a c d a c b g a c d a c Michael Fularczyk Zeichenketten 17.05.2011 21 / 41
Boyer-Moore - good suffix Suchvorgang: a a a g a c d a c b g a c d a c Michael Fularczyk Zeichenketten 17.05.2011 22 / 41
Boyer-Moore -Kombination Wie Eingangs erwähnt wird das Maximum beider Strategien genommen Suchvorgang: a a a a g a c d a c b g a a c d a c Michael Fularczyk Zeichenketten 17.05.2011 23 / 41
Boyer-Moore - Anmerkungen Aufwände: Vorbereitung: O(m) Suche avg-case: O(n) Suche worst-case: O(n m) Suche best-case: O ( ) n m Maximal 3 n Vergleiche. Michael Fularczyk Zeichenketten 17.05.2011 24 / 41
Rabin-Karp Hashe alle Teilstrings der Länge pattern Hashe pattern und Vergleiche mit Teilstring-Hashes Berechne Hashwert mit Zuhilfenahme des vorherigen Hashes Steht und fällt mit der Hashfunktion Avg/Best-Case = O(n) Worst-Case = O(n m) Michael Fularczyk Zeichenketten 17.05.2011 25 / 41
Rabin-Karp - rolling hashing Berechne Hashwert mit Zuhilfenahme des vorherigen Hashes x = 234567, pattern = L = 3 n 0 = 234, h 0 = h(n 0 ), b = 10, q = 13 h 0 = n 0 %q h i = ((n i 1 n i 1 [0] b L 1 ) b + n i 1 [L 1])%q Entferne 1. Ziffer, multipliziere mit Basis, addiere nächste Ziffer Michael Fularczyk Zeichenketten 17.05.2011 26 / 41
Rabin-Karp - rolling hashing Dank Modulo-Arithmetik: (a%q) + (b%q) (a + b)%q (a%q) (b%q) (a b)%q Kann man h i berechnen mit: h i = (h i 1 (n i 1 [0] b L 1 )%q) b%q +n i 1 [L 1]%q Michael Fularczyk Zeichenketten 17.05.2011 27 / 41
Rabin-Karp - rolling hashing Dank Modulo-Arithmetik: (a%q) + (b%q) (a + b)%q (a%q) (b%q) (a b)%q Kann man h i berechnen mit: h i = (h i 1 (n i 1 [0] b L 1 )%q) b%q +n i 1 [L 1]%q Vorteil: Zwischenergebnisse bleiben klein Michael Fularczyk Zeichenketten 17.05.2011 27 / 41
Rabin-Karp - rolling hashing Dank Modulo-Arithmetik: (a%q) + (b%q) (a + b)%q (a%q) (b%q) (a b)%q Kann man h i berechnen mit: h i = (h i 1 (n i 1 [0] b L 1 )%q) b%q +n i 1 [L 1]%q Vorteil: Zwischenergebnisse bleiben klein Aufwände: Best: O(n); Avg: O(n + m); Worst: O(n m) Michael Fularczyk Zeichenketten 17.05.2011 27 / 41
Suchverfahren - Zusammenfassung Knuth-Morris-Pratt: gut bei kleinem Alphabet garantiert lineare Laufzeit Boyer-Moore: gut bei großem Alphabet (schneller als KMP) schlecht bei kleinem Alphabet (z.b. Bitmuster) da kleine Schiebedistanz mehr Vergleiche Rabin-Karp: Nur so gut wie seine Hash-Funktion Michael Fularczyk Zeichenketten 17.05.2011 28 / 41
Manacher Suche des längsten Palindroms in einem String Speichert in P[] die Anzahl der Nachbarn, die zum Palindrom gehören. P[i] = 3 Max-Palindrom = Text [i-3;i+3] Aufwand: O(n) Michael Fularczyk Zeichenketten 17.05.2011 29 / 41
Manacher Besteht im Grunde aus zwei Formeln: P temp = max{p[j] + j : j < i} und falls P temp i P[i] min{p[2 j i], P[j] + j i} Michael Fularczyk Zeichenketten 17.05.2011 30 / 41
Manacher - Beispiel T = abccacc Setze # zwischen Zeichen T = a#b#c#c#a#c#c Wende Formeln an Michael Fularczyk Zeichenketten 17.05.2011 31 / 41
Manacher - Beispiel T = abccacc Setze # zwischen Zeichen T = a#b#c#c#a#c#c Wende Formeln an a # b # c # c # a # c # c 0 0 1 0 1 2 1 0 4 0 0 1 0 Michael Fularczyk Zeichenketten 17.05.2011 31 / 41
Trie Trie Michael Fularczyk Zeichenketten 17.05.2011 32 / 41
Trie Baumstrukturen zum Speichern von Wörtern Gut zum Suchen von mehreren Queries (Gegensatz: KMP) Kante == Buchstabe Blatt == Terminalsymbol Knoten == Zeichenkette (entspricht Weg zum Knoten) Weg von der Wurzel zum Blatt == Schlüssel Michael Fularczyk Zeichenketten 17.05.2011 33 / 41
Trie 3 3 Quelle: http://en.wikipedia.org/wiki/file:trie_example.svg Michael Fularczyk Zeichenketten 17.05.2011 34 / 41
Patricia - Trie Patricia-Trie == Kompakter Trie. Knoten mit nur einem Kindknoten werden mit diesem zusammengefasst Kanten die ohne Abzweigung zu einem Blatt führen werden zusammengefasst Mehrere Zeichen an einer Kante erlaubt. Michael Fularczyk Zeichenketten 17.05.2011 35 / 41
Suffix - Trie Suffix-Trie == Patricia Trie Speichert alle Suffixe vom Text Keine Vorbereitungsphase für Pattern Durch Verlinkungen im Baum Aufwand: O(n) Speicherbedarf: O(n) (Ukkonen s Online Algorithmus) Implementierung nicht gerade trivial :-/ Michael Fularczyk Zeichenketten 17.05.2011 36 / 41
Bibliotheksfunktionen Bibliotheksfunktionen Michael Fularczyk Zeichenketten 17.05.2011 37 / 41
Bibliotheksfunktionen C/C++ C: Suchen: char strstr (char str, char pattern) Länge: size t strlen (const char ) - muss \0 -terminiert sein. C++: Suchen: size t string :: find ( string str ) Länge: size t string :: length() Suche nach einmaligem Vorkommen schneller als KMP Michael Fularczyk Zeichenketten 17.05.2011 38 / 41
Bibliotheksfunktionen Java Java: Suchen: int String.indexOf(String str ) Länge: int String. length() Michael Fularczyk Zeichenketten 17.05.2011 39 / 41
Ende Ende Michael Fularczyk Zeichenketten 17.05.2011 40 / 41
Quellen http://en.wikipedia.org http://en.wikipedia.org/wiki/trie (Abruf: 11.05.2011) www.wi.uni-muenster.de/pi/lehre/ss08/info2/ folien/info2k5.pdf (Abruf: 16.05.2011) Hallo-Welt Folien zu Zeichenketten (2004, 2007, 2008, 2010) http://zhuhongcheng.wordpress.com/2009/08/02/a-simplelinear-time-algorithm-for-finding-longest -palindrome-sub-string/ (Abruf: 15.05.2011) Michael Fularczyk Zeichenketten 17.05.2011 41 / 41