Zeichenketten 10. Mai 2017 Simon Bachstein 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 1
Übersicht String-Matching Problem Motivation Algorithmen zur Lösung Naive Stringsuche KMP Algorithmus Boyer-Moore Algorithmus Rabin-Karp Algorithmus Manacher Algorithmus für Palindrome Suffix-Tries 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 2
String-Matching Problem Text T = t 1 t 2...t n mit Länge n Suchmuster (Pattern) P = p 1 p 2...p m mit Länge m t k, m k aus gemeinsamen Alphabet Ziel: Finde ein (alle) k sodass t k = m k, t k+1 = m k+1, t k+m-1 = m k+m-1 D.h. finde die Position(en) von Muster im Text Beispiel: T = Nudelauflauf, M = lauf k 1 = 4 (Nudelauflauf), k 2 = 8 (Nudelauflauf) 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 3
Naiver Algorithmus Text und Suchmuster linksbündig untereinander stellen Zeichen pro Zeichen vergleichen Bei Mismatch Suchmuster um eine Position nach rechts verschieben und die Suche bei Beginn des Suchmusters erneut beginnen Mit Worst-Case-Laufzeit O(nm) vergleichsweise sehr langsam Keine Vorbereitungen notwendig 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 4
KMP Algorithmus Entwickelt von Donald Ervin Knuth, James Hiram Morris und Vaughan Ronald Pratt Baut auf naivem Algorithmus auf Verwirft bei Mismatches das Wissen bisheriger Vergleiche nicht Reduziert Laufzeit von O(nm) auf O(n) Läuft in zwei Phasen ab Analyse des Suchmusters Eigentliches Suchen des Musters 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 5
KMP Algorithmus Analyse des Suchmusters Suchmuster in seine m+1 Präfixe zerlegen Präfixe auf Ränder absuchen Länge der längsten Ränder jeweils für spätere Verwendung speichern Länge des Rands des Leerstrings ist per Definition -1 Beispiel am Suchmuster abacaba k Substring Rand Länge Rand 0 (leer) (leer) -1 1 a (leer) 0 2 ab (leer) 0 3 aba a 1 4 abac (leer) 0 5 abaca a 1 6 abacab ab 2 7 abacaba aba 3 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 6
KMP Algorithmus Analyse des Suchmusters Algorithmus zur Implementierung der Präfixtabelle: public int[] getprefixtable(char[] input) { int j = -1; int[] table = new int[input.length + 1]; table[0] = j; for(int i = 0; i < input.length; i++) { while(j >= 0 && input[j]!= input[i]) j = table[j]; j++; table[i+1] = j; } } return table; Position 0 1 2 3 4 5 6 Zeichen a b a c a b a Tabelle -1 0 0 1 0 1 2 3 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 7
KMP Algorithmus Eigentliche Suche List<Integer> getmatches(char[] text, char[] muster) { List<Integer> resultlist = new ArrayList<Integer>(); int[] prefixtable = getprefixtable(input); int j = 0; // Position im Muster // Den Text Zeichen um Zeichen durchgehen for(int i = 0; i < text.length; i++) { // Muster verschieben bis aktuelle Position // im Text mit Position im Muster übereinstimmt while(j >= 0 && text[i]!= input[j]) j = prefixtable[j]; j++; // Muster um eins verschieben if(j == input.length) { // Muster fertig durchsucht resultlist.add(i - input.length); j = prefixtable[j]; } } return resultlist; } 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 8
KMP Algorithmus Eigentliche Suche Suchmuster und Text werden untereinander geschrieben Text wird Zeichen für Zeichen durchgegangen, ähnlich wie bei naiver Suche An jedem Zeichen: Solange Mismatch auftritt: Verschieben des Musters mittels Präfixtabelle nach rechts, ggf. mehrfach Eine Stelle weiter gehen Falls Suchmuster zu Ende: Treffer gefunden, entweder aufhören oder wieder mittels Präfixtabelle nach rechts verschieben 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 9
KMP Algorithmus Eigentliches Suchen Index 0 1 2 3 4 5 6 7 Zeichen a b a c a b a Tabelle -1 0 0 1 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11 12 Textposition a b a a b b a b a c a b a Text a b a c a b a Mismatch Pos 3, Tabelle[3] = 1 Um (3-1) = 2 verschieben a b a c a b a Mismatch Pos 1, Tabelle[1] = 0 Um (1-0) = 1 verschieben a b a c a b a Mismatch Pos 2, Tabelle[2] = 0 a b a c a b a Mismatch Pos 0, Tabelle[0] = -1 a b a c a b a Match an Textposition 6-12 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 10
KMP Algorithmus Laufzeit Erstellen der Präfixtabelle in O(m) Einmaliges Durchlaufen des Textes, insgesamt O(n) Vergleiche Laufzeit beträgt also O(m+n) = O(n), wenn m <= n m > n kein Treffer möglich Aussteigen in O(1) 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 11
Boyer-Moore-Algorithmus Entwickelt von Robert S. Boyer und J. Strother Moore Benutzt bei Mismatches zwei Heuristiken zur Ermittlung wie weit das Suchmuster verschoben werden kann Berechnet für beide Heuristiken Sprungtabellen Text und Muster werden linksbündig untereinander gestellt und Zeichen für Zeichen von rechts beginnend verglichen Pro Schritt wird die Heuristik die größeren Sprung erlaubt angewendet Worst-Case-Laufzeit mit geringfügiger Modifikation ist O(n) Falls das Alphabet im Vergleich zum Muster groß ist bis zu O(n/m) 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 12
Boyer-Moore-Algorithmus Bad Character Heuristic Bei Mismatch: Muster so lange nach rechts verschieben bis an der betrachteten Stelle kein Mismatch mehr auftritt Wie weit gesprungen werden muss wird zur Beschleunigung vorberechnet Einzelner Sprung um 4 Positionen: a b a b c a b a b c a b a b c a b a b Im Vorlauf werden hierfür die Positionen des jeweils letzten Auftretens der einzelnen Zeichen im Muster gespeichert: a b c d... 3 4 0-1... 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 13
Boyer-Moore-Algorithmus Good Suffix Heuristic Bei Mismatch wird Muster soweit verschoben, dass das passt Suffix erneut passt Wie weit gesprungen werden muss wird zur Beschleunigung vorberechnet Einzelner Sprung um 3 Zeichen: a b b b a c b a a b a c b a b a c b a Im Vorlauf werden für alle möglichen Suffixe die entsprechenden Sprungziele gespeichert, ähnlich der Präfixtabelle bei KMP 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 14
Rabin-Karp Algorithmus Entwickelt von Michael O. Rabin und Richard M. Karp Vergleicht Signaturen (Hashwerte) der Substrings des Textes mit Signaturen des Musters anstelle der Originalstrings Beispiel mit Quersumme als Signaturfunktion: Anstatt 123 mit 456 wird 1 + 2 + 3 = 6 mit 4 + 5 + 6 = 15 verglichen Bei gleichen Signaturen muss nachträglich der Originalstring nochmal geprüft werden wegen Kollisionsgefahr Wahl der Signatur sodass die Signatur an der Stelle i + 1 ohne großen Aufwand aus der Signatur an der Stelle i berechnet werden kann Vergleich der Signaturen erfolgt in (kurzer) konstanter Zeit Average Case Laufzeit: O(n), Worst Case (selten): O(mn) Mehrere Muster gleichzeitig performant suchbar 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 15
Rabin-Karp Algorithmus Beispiel: Text = 3141592653, Muster = 265, Signaturfunktion ist Quersumme Signatur des Musters ist 2 + 6 + 5 = 13 0 1 2 3 4 5 6 7 8 9 Sig. Substr. 3 1 4 1 5 9 2 6 5 3 2 6 5 3 + 1 + 4 = 8 2 6 5 8 + 1 3 = 6 2 6 5 6 + 5 1 = 10 2 6 5 10 4 + 9 = 15 2 6 5 15 1 + 2 = 16 2 6 5 16 5 + 6 = 17 2 6 5 17 9 + 5 = 13 2 6 5 Match 2 6 5 13 2 + 2 = 13 2 6 5 Kein Match 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 16
Manacher Algorithmus Algorithmus um das längste Palindrom in einem String zu ermitteln Basiert auf naivem Ansatz jede Position als Zentrum eines Palindroms auszutesten Reduziert Laufzeit O(n²) des naiven Ansatzes auf O(n) Zeichenkette wird vorbereitet: Zwischenräume werden durch ein Trennzeichen ersetzt, vor und nach den String wird jeweils ein Sonderzeichen platziert Symmetrieeigenschaft von Palindromen wird ausgenutzt um Vergleiche einzusparen Das Palindrom mit höchster rechter Grenze wird jeweils zwischengemerkt um durch die Symmetrieeigenschaften Vergleiche einzusparen 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 17
Manacher Algorithmus Beispiel: ABABA, Trennzeichen: #, Start: @, Ende: $ 0 1 2 3 4 5 6 7 8 9 10 11 12 @ # A # B # A # B # A # $ Zeichen 0 0 und 2 passen nicht 1 1 und 3 passen 1 * 0 und 4 passen nicht Neues Merkpalindrom 0 2 und 4 passen nicht 1 3 und 5 passen 2 2 und 6 passen 3 1 und 7 passen 3 * 0 und 8 passen nicht Neues Markpalindrom 0 Kopiert von 3 0 4 und 6 passen nicht 1 Kopiert von 2 2 4 und 8 passen 5 und 7 keine Prüfung! 5 * 3 und 9, 2 und 10, 1 und 11 passen, 0 und 12 nicht Neues Merkpalindrom 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 18
Tries Datenstruktur: Gerichteter Baum speichert mehrere Wörter Kanten sind beschriftet mit Buchstaben der Worte Jedes Blatt repräsentiert ein mögliches Wort (gelesen von Wurzel in Richtung Blatt) Anwendungsbeispiel: Autovervollständigung 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 19
Suffix Tries Datenstruktur: Gerichteter Baum zu einem Wort Terminierungszeichen wird an das Wortende angehangen Kanten sind beschriftet mit Buchstaben des Wortes Jedes Blatt repräsentiert ein mögliches Suffix des Wortes (von der Wurzel in Richtung Blatt gelesen) Können in O(n) mit O(n) Speicher generiert werden (Ukkonen Algorithmus) Anwendung: Substringprüfung: Ist aba Substring von ababa? Gehe jedes Zeichen von aba durch und prüfe vom Startknoten ausgehend ob es eine Kante mit diesem Zeichen gibt. Ja Gehe die Kante entlang, ist der potentielle Substring zu Ende ist er Substring Ja und Zielknoten ist Blatt Substring ist sogar Suffix Nein Der potentielle Substring ist kein Substring 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 20
Suffix Tries Beispieltrie von ababa und Mustern aba und bab 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 21
Quellen http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/kmp.htm http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/bm.htm http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/karp.htm https://www.youtube.com/watch?v=nbtsfrefo6m http://www.cs.jhu.edu/~langmea/resources/lecture_notes/tries_and_suffix_tries.pdf Jeweils am 03.05.17 abgerufen https://en.wikipedia.org/wiki/ukkonen%27s_algorithm Jeweils am 09.05.17 abgerufen 10.05.2017 Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 22