Zeichenketten 16.04.2018 Benedikt Straßner Programming Systems Group Martensstr. 3 91058 Erlangen Germany
Übersicht String Matching Algorithmen Naive Stringsuche Knuth Morris Pratt (KMP) Algorithmus Boyer-Moore Algorithmus Rabin-Karp Algorithmus Manacher-Algorithmus Suffix-Tries Suffix-Arrays Zeichenketten Folie 2
Naive Stringsuche - Darstellung Suche nach BAUM A B A B A U M A B B A U B B A U M Zeichenketten Folie 3
Naive Stringsuche - Code outer: for (int i = 0; i <= text.length - pattern.length; i++) { for (int j = 0; j < pattern.length; j++) { if (text[i + j]!= pattern[j]) continue outer; } return true; } return false; Einfach und intuitiv, aber... O(n m) Zeichenketten Folie 4
KMP Algorithmus 1970 entwickelt Benannt nach Donald Knuth, James Morris und Vaughan Pratt Effizientere Variante der naiven Suche Zeichenketten Folie 5
KMP Algorithmus Prinzip: Der Suchrahmen kann bei Mismatch meist mehrere Zeichen weiter geschoben werden Bei Wiederholungen des Präfix innerhalb des Pattern kann bei einem Mismatch die Überprüfung folgender Zeichen übersprungen werden 2 Phasen Aufbau einer Präfixtabelle Eigentliche Suche Zeichenketten Folie 6
KMP Algorithmus - Aufbau der Präfixtabelle Die Präfixtabelle beschreibt Wiederholungen des Präfixes im Pattern Zu jedem Zeichen des Patterns wird gespeichert, das wievielte Zeichen des Präfixes hintereinander damit wiederholt wird A B C A D A B C E 0 0 0 1 0 1 2 3 0 Zeichenketten Folie 7
KMP Algorithmus - Aufbau der Präfixtabelle Weitere Beispiele: A A A A A 0 1 2 3 4 A A 5 6 A B B B B 0 0 0 0 0 A B C A D A B C A B 0 0 0 1 0 1 2 3 4 2 Zeichenketten Folie 8
KMP Algorithmus - Suche Pattern: A B C A B D 0 0 0 1 2 0 Text: A B C A B C A B D E A B C A B D A B C A B D Zeichenketten Folie 9
KMP Algorithmus - Laufzeit Vorbereitung: O(m) Suche: O(n) Gesamt: O(n + m) Lineare Laufzeit Zeichenketten Folie 10
Boyer-Moore Algorithmus 1977 entwickelt Benannt nach Robert Boyer und J Moore Pattern wird wie bei KMP geschoben, allerdings werden 2 verschiedene Strategien angewendet Zeichenketten Folie 11
Boyer-Moore Algorithmus Prinzip: 2 verschiedene Strategien (Heuristiken) zur Berechnung der Schiebedistanz werden gleichzeitig verwendet Bad Character Heuristic Good Suffix Heuristic Für beide Strategien wird als Vorbereitung eine Tabelle erstellt Bei jeder Verschiebung wird der größere der beiden Werte verwendet Zeichenketten Folie 12
Boyer-Moore Algorithmus - Bad Character Heuristic In der Tabelle wird für jedes Zeichen der Index des letzten Auftretens im Pattern gespeichert Für alle Zeichen des Alphabets muss ein Eintrag angelegt werden! Kommt ein Zeichen im Pattern nicht vor, wird -1 eingetragen Pattern: A B C D D C B C E Tabelle: A B C D E F... 0 6 7 4 8-1 -1 Zeichenketten Folie 13
Boyer-Moore Algorithmus - Bad Character Heuristic Das Pattern wird von hinten beginnend verglichen Bei Mismatch wird das Pattern nach rechts geschoben so lange bis kein Mismatch mehr auftritt Verschiebung = Index im Pattern Wert in Tabelle Zeichenketten Folie 14
Boyer-Moore Algorithmus - Bad Character Heuristic Verschiebung = Index im Pattern Wert in Tabelle Pattern: Tabelle: A B C D A D A B C D E... 4 1 2 5-1 -1 Text: A A B A A B C D A D E A B C D A D i = 5; Tabelle B = 1 Verschiebung um 5 1 = 4 A B C D A D Zeichenketten Folie 15
Boyer-Moore Algorithmus - Bad Character Heuristic Weiteres Beispiel: Pattern: Tabelle: A B A B A B A B C... 4 5-1 -1 Text: A A B B A C A B A B A A B A B A B i = 5; Tabelle C = 1 Verschiebung um 5 ( 1) = 6 B A B A B A B Zeichenketten Folie 16
Boyer-Moore Algorithmus - Good Suffix Heuristic Bei Mismatch wird der Suchrahmen soweit geschoben, dass das Suffix wieder passt Sehr ähnlich zu KMP, nur mit Suffix statt Präfix A A B C A D E A D E C A D E A D C A D E A D Zeichenketten Folie 17
Boyer-Moore Algorithmus - Kombination Es wird in jedem Schritt das Verfahren verwendet, welches die größere Schiebedistanz erlaubt Beide Strategien sind in bestimmten Szenarien ineffektiv, dann kann aber die jeweils andere verwendet werden Laufzeit: Vorbereitung O(m) Worst Case O(n m) Best Case O(n/m) Besonders geeignet, wenn das Alphabet im Vergleich zum Muster sehr groß ist Zeichenketten Folie 18
Rabin-Karp Algorithmus 1987 entwickelt Benannt nach Michael Rabin und Richard Karp Vergleicht den Hash des Patterns mit Hashes der Substrings des Suchtextes Zeichenketten Folie 19
Rabin-Karp Algorithmus Prinzip: Das Pattern wird gehasht Berechne nacheinander den Hash aller Substrings des Suchtextes Vergleiche jeweils den berechneten Hash mit dem Pattern Überprüfe, ob bei gleichem Hash wirklich der gesuchte String gefunden wurde Die Effektivität des Algorithmus hängt stark mit der Hash- Funktion zusammen Zeichenketten Folie 20
Rabin-Karp Algorithmus Hash-Funktion Anforderungen an die verwendete Hashfunktion: Sollte Kollisionen (einigermaßen) vermeiden Muss ein sog. Rolling Hash sein Darf bestimmte Grenzen nicht überschreiten (z.b. INT_MAX) Der Algorithmus ist nur effektiv, wenn ein Rolling Hash verwendet wird: Hash kann bei Veränderung von nur einem Zeichen aus dem vorherigen Hash in O(1) berechnet werden Eine geeignete Hash-Funktion: Rabin-Fingerprint Zeichenketten Folie 21
Rabin-Karp Algorithmus Rabin-Fingerprint Jedes Zeichen des Alphabets wird als Ziffer interpretiert Bei mehr als 10 möglichen Zeichen reicht das Dezimalsystem nicht mehr Basis somit z.b. 256 Nach jeder Ziffer wird ein Modulo berechnet, damit die Zahlen klein bleiben Der nächste Hash (nach shift) kann dann einfach berechnet werden: 1. Ziffer entfernen Mit Basis multiplizieren Neue Ziffer hinzufügen Zeichenketten Folie 22
Rabin-Karp Algorithmus Rabin-Fingerprint Formel b: Basis (Anzahl möglicher Zeichen) p: Länge des Patterns q: Modulus (Primzahl) t: Suchtext h 0 = ((( t 0 b p 1 mod q) t 1 b p 2 mod q) t p 1 )mod q h i = h i 1 t i 1 b p 1 mod q) b + t[i + p 1])mod q Funktioniert aufgrund der Homomorphie bei Modulo: a mod q b mod q mod q = a b mod q Zeichenketten Folie 23
Rabin-Karp Algorithmus - Zusammenfassung Laufzeit: Vorbereitung O(n) Worst Case O(n m) Average Case O(n) Best Case O(n/m) Besonders geeignet, wenn viele verschiedene [gleich lange] Patterns gesucht werden Zeichenketten Folie 24
Vergleich von String Matching Algorithmen Algorithmus Preprocessing Average Worst Naive Stringsuche Nicht nötig O(n m) O(n m) KMP O(m) O(n) O(n) Boyer-Moore O(m+k) O(n) O(n m) Rabin-Karp O(m+k) O(n) O(n m) Zeichenketten Folie 25
Vergleich von String Matching Algorithmen Naive Stringsuche Ist immer schlecht KMP Immer lineare Laufzeit Boyer-Moore Gut bei großem Alphabet Rabin-Karp Gut, wenn der gleiche Suchstring auf mehrere Patterns überprüft wird Zeichenketten Folie 26
Manacher Algorithmus 1975 entwickelt Benannt nach Glenn Manacher Findet den längsten Substring eines Eingabestrings, der ein Palindrom ist Zeichenketten Folie 27
Manacher Algorithmus - Naiver Ansatz als Basis A A A B A B A B A Baut auf folgendem naiven Ansatz auf: Betrachte nacheinander jedes Zeichen eines Strings sowie jede Position zwischen Zeichen als Zentrum Überprüfe, ob die benachbarten Zeichen des Zentrums gleich sind Wenn sie gleich sind, überprüfe die jeweils nächsten Zeichen, usw. Gehe alle möglichen Zentren durch und speichere jeweils das längste gefundene Palindrom Problem: O(n²) Zeichenketten Folie 28
Manacher Algorithmus Prinzip: Für jedes untersuchte Zentrum wird die Länge des längsten möglichen Palindroms in einer Tabelle gespeichert Das längste Palindrom hat sein Zentrum dann am Index des größten Werts in der Tabelle Ziel: Die Tabelle soll möglichst effizient angelegt werden Dazu wird die Symmetrieeigenschaft von Palindromen ausgenutzt Zeichenketten Folie 29
Manacher Algorithmus - Vorgehen Zwischen allen Zeichen sowie am Anfang und Ende wird jeweils ein Füllzeichen eingefügt Dadurch muss nicht mehr zwischen Palindromen gerader und ungerader Länge unterschieden werden Das Füllzeichen darf nicht Teil des Alphabets sein B A B A A B C A # B # A # B # A # A # B # C # A # Zeichenketten Folie 30
Manacher Algorithmus - Vorgehen Danach nach und nach die Tabelle ausfüllen Wenn das Zentrum noch NICHT innerhalb eines bekannten Palindroms liegt: Größe des Palindroms durch wiederholte Vergleiche der jeweils angrenzenden Zeichen bestimmen # B # A # B # A # A # B # C # A # 0 1 0 3 Wenn das Zentrum innerhalb eines bekannten Palindroms liegt Es werden 3 Fälle unterschieden, die die Spiegeleigenschaft von Palindromen effektiv ausnutzen Zeichenketten Folie 31
Manacher Algorithmus - Vorgehen 1. Fall: Ein Palindrom liegt vollständig innerhalb eines Größeren R' i' Z i R # B # A # B # A # A # B # C # A # 0 1 0 3 0 3 0 1 4 X1 Falls i + P i P i = P[i ] < R, dann gilt Zeichenketten Folie 32
Manacher Algorithmus - Vorgehen 2. Fall: Ein Palindrom geht über den linken Rand eines anderen hinaus R' i' Z i R # B # A # B # A # A # B # C # A # 0 1 0 3 0 3 0 1 4 1 0 X1 Falls i + P i > R, dann gilt P i = R i Denn: Sonst wäre ja das Palindrom um Z auch größer Zeichenketten Folie 33
Manacher Algorithmus - Vorgehen 3. Fall: Ein Palindrom geht genau bis zum linken Rand eines anderen R' i' Z # B # A # B # A # A # B # A # A # 0 1 0 3 0 3 0 1 6 1 0 X5 i R Falls i + P i = R, dann gilt P i P i Ob und um wie viel P i größer ist, muss durch Vergleiche überprüft werden Zeichenketten Folie 34
Manacher Algorithmus - Zusammenfassung Die Tabelle enthält am Ende das größte Palindrom um jedes Zentrum Das größte Palindrom insgesamt ist dann also um die größte Zahl in der Tabelle herum und kann leicht ausgegeben werden Laufzeit: O(n) Zeichenketten Folie 35
Suffix-Tries Trie: Baum-Datenstruktur, die den effektiven Abruf der gespeicherten Daten ermöglichen soll Wortspiel aus Tree und Retrieval Suffix Trie: Enthält alle möglichen Suffixe, die in einem gegebenen Wort vorkommen Es führt immer genau ein Weg von der Wurzel zu einem Blatt Jedes Blatt stellt ein Suffix dar Der Aufbau eines Suffix Tries stellt ein Preprocessing dar, durch das viele Algorithmen effektiv angewendet werden können Zeichenketten Folie 36
Suffix-Tries - Beispiel Suffix-Trie für das Wort BANANA banana\0 a na \0 na \0 na\0 \0 na\0 \0 Zeichenketten Folie 37
Suffix-Tries - Zusammenfassung Laufzeit Aufbau des Suffix-Tries: O(n) Space: O(n) Viele Anwendungen: Longest Common Substring zweier Strings Pattern Matching Longest Palindrome Substring Longest Repeated Substring Zeichenketten Folie 38
Suffix-Arrays Suffix Array: Ein Array aller Suffixe eines Strings Das Array ist sortiert (z.b. alphabetisch) Enthält nicht die eigentlichen Strings sondern nur die Integer Indizes des Anfangs der Substrings Aufbau des Arrays: O(n) Space: O(n) Sehr ähnlich zum Suffix-Trie Suffix-Array kann mithilfe von DFS in O(n) aus einem Suffix- Trie generiert werden Zeichenketten Folie 39
Suffix-Arrays - Beispiel Wort mit Indizes: Sortierte Suffixe: 0 1 2 3 4 5 B A N A N A \0 6 a\0 5 ana\0 3 anana\0 1 banana\0 0 na\0 4 nana\0 2 6 \0 Suffix-Array: { 6, 5, 3, 1, 0, 4, 2 } Zeichenketten Folie 40
Suffix-Arrays - Anwendungen Suffix-Arrays sind nützlich bei: Alle Vorkommen eines Patterns finden (= jedes Suffix finden, dass mit dem Pattern beginnt) Alle Anwendungen des Suffix-Tries Suffix-Array vs. Suffix-Tree Suffix-Array braucht weniger Platz (beide O(n), aber absolut weniger, da nur eine Liste von Integern gespeichert wird) Bestimmte Arten von Pattern Matching sind langsamer in Suffix-Arrays (Patterns mit Wildcards) Zeichenketten Folie 41
Quellen Folien der letzten Jahre: https://www2.cs.fau.de/teaching/ss2011/hallowelt/zk_2011.pdf https://www2.cs.fau.de/teaching/ss2015/hallowelt/zk_2015.pdf https://www2.cs.fau.de/teaching/ss2016/hallowelt/zk_2016.pdf https://www2.cs.fau.de/teaching/ss2017/hallowelt/zk_2017.pdf KMP: https://www.geeksforgeeks.org/searching-for-patterns-set-2-kmp-algorithm/ Bayer-Moore https://epubs.siam.org/doi/pdf/10.1137/0206024 https://www.geeksforgeeks.org/searching-for-patterns-set-2-kmp-algorithm/ http://whocouldthat.be/visualizing-string-matching/ Rabin-Karp https://www.geeksforgeeks.org/searching-for-patterns-set-3-rabin-karp-algorithm/ http://whocouldthat.be/visualizing-string-matching/ http://www.xmailserver.org/rabin.pdf Manacher https://www.geeksforgeeks.org/manachers-algorithm-linear-time-longest-palindromic-substring-part-1/ https://gabrielghe.github.io/university/2016/02/27/manachers-algorithm-longest-palindromic-substring Suffix-Tries Suffix-Arrays http://www.allisons.org/ll/algds/tree/suffix/ https://www.geeksforgeeks.org/pattern-searching-set-8-suffix-tree-introduction/ https://www.geeksforgeeks.org/suffix-array-set-1-introduction/ Zeichenketten Folie 42
Vielen Dank für eure Aufmerksamkeit Noch Fragen? [Katze für Bonuspunkte] Zeichenketten Folie 43