Algorithmen auf Zeichenketten Rabin-Karp Algorithmus Christoph Hermes hermes@hausmilbe.de Zeichenketten: Rabin-Karp Algorithmus p. 1/19
Ausblick auf den Vortrag theoretische Grundlagen... Zeichenketten: Rabin-Karp Algorithmus p. 2/19
Ausblick auf den Vortrag theoretische Grundlagen... Motivation Zeichenketten: Rabin-Karp Algorithmus p. 2/19
Ausblick auf den Vortrag theoretische Grundlagen... Motivation...aber in der Praxis? Zeichenketten: Rabin-Karp Algorithmus p. 2/19
Ausblick auf den Vortrag theoretische Grundlagen... Motivation...aber in der Praxis? Wahrscheinlichkeitstheoreme Zeichenketten: Rabin-Karp Algorithmus p. 2/19
Ausblick auf den Vortrag theoretische Grundlagen... Motivation...aber in der Praxis? Wahrscheinlichkeitstheoreme Ergänzungen Zeichenketten: Rabin-Karp Algorithmus p. 2/19
Ausblick auf den Vortrag theoretische Grundlagen... Motivation...aber in der Praxis? Wahrscheinlichkeitstheoreme Ergänzungen Analyse / Demonstration Zeichenketten: Rabin-Karp Algorithmus p. 2/19
Ausblick auf den Vortrag theoretische Grundlagen... Motivation...aber in der Praxis? Wahrscheinlichkeitstheoreme Ergänzungen Analyse / Demonstration Literaturangaben Zeichenketten: Rabin-Karp Algorithmus p. 2/19
Theorie: Einführung Algorithmus von R.M. Karp und M.O. Rabin 1987 veröffentlicht Zeichenketten: Rabin-Karp Algorithmus p. 3/19
Theorie: Einführung Algorithmus von R.M. Karp und M.O. Rabin 1987 veröffentlicht Grundidee: Transformation Vergleich von Zeichenketten Arithmetik Zeichenketten: Rabin-Karp Algorithmus p. 3/19
Theorie: Einführung Algorithmus von R.M. Karp und M.O. Rabin 1987 veröffentlicht Grundidee: Transformation Vergleich von Zeichenketten Arithmetik In diesem Vortrag gilt: Σ = {0, 1} binärer Text (Bsp.: 010010) T : Text m = T Länge d. Textes P : Pattern n = P Länge d. Musters Zeichenketten: Rabin-Karp Algorithmus p. 3/19
Theorie: Hashfunktion I Eine Hashfunktion versucht, einen Bereich von Daten durch eine Ganzzahl zu repräsentieren Zeichenketten: Rabin-Karp Algorithmus p. 4/19
Theorie: Hashfunktion I Eine Hashfunktion versucht, einen Bereich von Daten durch eine Ganzzahl zu repräsentieren Funktion für das Muster P der Länge n: H(P ) = n i=1 2 n i P (i) Zeichenketten: Rabin-Karp Algorithmus p. 4/19
Theorie: Hashfunktion I Eine Hashfunktion versucht, einen Bereich von Daten durch eine Ganzzahl zu repräsentieren Funktion für das Muster P der Länge n: H(P ) = n i=1 2 n i P (i) Beispiel: P = (1101), n = 4 H(P ) = 2 3 1 + 2 2 1 + 2 1 0 + 2 0 1 = 13 Zeichenketten: Rabin-Karp Algorithmus p. 4/19
Theorie: Hashfunktion II analog gilt für T an der Stelle r: H(T r ) = n i=1 2 n i T (r + i 1) Zeichenketten: Rabin-Karp Algorithmus p. 5/19
Theorie: Hashfunktion II analog gilt für T an der Stelle r: H(T r ) = n i=1 2 n i T (r + i 1) Beispiel: T = (10110110), r = 3, n = 4 H(T r ) = 13 Zeichenketten: Rabin-Karp Algorithmus p. 5/19
Theorie: Hashfunktion II analog gilt für T an der Stelle r: H(T r ) = n i=1 2 n i T (r + i 1) Beispiel: T = (10110110), r = 3, n = 4 H(T r ) = 13 Zeichenketten: Rabin-Karp Algorithmus p. 5/19
Theorie: Hashfunktion II analog gilt für T an der Stelle r: H(T r ) = n i=1 2 n i T (r + i 1) Beispiel: T = (10110110), r = 3, n = 4 H(T r ) = 13 Falls P in T an der Stelle r vorkommt, muss gelten: H(P ) = H(T r ) Zeichenketten: Rabin-Karp Algorithmus p. 5/19
Motivation Warum einen solchen Algorithmus verwenden? leichte Erweiterung auf andere Probleme: zweidimensionales Pattern Matching (Bildsuche) Zeichenketten: Rabin-Karp Algorithmus p. 6/19
Motivation Warum einen solchen Algorithmus verwenden? leichte Erweiterung auf andere Probleme: zweidimensionales Pattern Matching (Bildsuche) gilt als sicher : Vollständig analysiert mit Hilfe von Beweisen Zeichenketten: Rabin-Karp Algorithmus p. 6/19
Motivation Warum einen solchen Algorithmus verwenden? leichte Erweiterung auf andere Probleme: zweidimensionales Pattern Matching (Bildsuche) gilt als sicher : Vollständig analysiert mit Hilfe von Beweisen einfache Implementierung Zeichenketten: Rabin-Karp Algorithmus p. 6/19
Fingerprint-Methode I Problem: Der Speicherbereich wird sehr schnell in der Hashfunktion verletzt: unsigned int: 2 32 P < 32 Zeichenketten: Rabin-Karp Algorithmus p. 7/19
Fingerprint-Methode I Problem: Der Speicherbereich wird sehr schnell in der Hashfunktion verletzt: unsigned int: 2 32 P < 32 Lösung: Verwendung des Modulo-Operators (%, mod ) mit einer Primzahl p (Fingerprint) Zeichenketten: Rabin-Karp Algorithmus p. 7/19
Fingerprint-Methode I Problem: Der Speicherbereich wird sehr schnell in der Hashfunktion verletzt: unsigned int: 2 32 P < 32 Lösung: Verwendung des Modulo-Operators (%, mod ) mit einer Primzahl p (Fingerprint) Somit ergeben sich für die Hashfunktionen: [H p (P ) = H(P ) mod p] [H p (T r ) = H(T r ) mod p] Zeichenketten: Rabin-Karp Algorithmus p. 7/19
Fingerprint-Methode I Problem: Der Speicherbereich wird sehr schnell in der Hashfunktion verletzt: unsigned int: 2 32 P < 32 Lösung: Verwendung des Modulo-Operators (%, mod ) mit einer Primzahl p (Fingerprint) Somit ergeben sich für die Hashfunktionen: [H p (P ) = H(P ) mod p] [H p (T r ) = H(T r ) mod p] Aber: Der Bereich der exakten Suche wird verlassen! Zeichenketten: Rabin-Karp Algorithmus p. 7/19
Fingerprint-Methode II Problem: H p verletzt vor der mod-operation immer noch den Speicher! Zeichenketten: Rabin-Karp Algorithmus p. 8/19
Fingerprint-Methode II Problem: H p verletzt vor der mod-operation immer noch den Speicher! Lösung: Horner-Regel H p (P ) = {[... ({[P (1) 2 mod p + P (2)] 2 mod p + P (3)} 2 mod p + P (4))... ] 2 mod p + P (n)} mod p Zeichenketten: Rabin-Karp Algorithmus p. 8/19
Fingerprint-Methode II Problem: H p verletzt vor der mod-operation immer noch den Speicher! Lösung: Horner-Regel H p (P ) = {[... ({[P (1) 2 mod p + P (2)] 2 mod p + P (3)} 2 mod p + P (4))... ] 2 mod p + P (n)} mod p Vorteile: keine Zahl 2p Zeichenketten: Rabin-Karp Algorithmus p. 8/19
Fingerprint-Methode II Problem: H p verletzt vor der mod-operation immer noch den Speicher! Lösung: Horner-Regel H p (P ) = {[... ({[P (1) 2 mod p + P (2)] 2 mod p + P (3)} 2 mod p + P (4))... ] 2 mod p + P (n)} mod p Vorteile: keine Zahl 2p lineare Berechnung, aber... Zeichenketten: Rabin-Karp Algorithmus p. 8/19
Berechnung in linearer Zeit I Problem: Algorithmus läuft insgesamt immer noch in O(nm) Zeichenketten: Rabin-Karp Algorithmus p. 9/19
Berechnung in linearer Zeit I Problem: Algorithmus läuft insgesamt immer noch in O(nm) Lösung: Information aus der Berechnung von H(T r 1 ) für H(T r ) nutzen Zeichenketten: Rabin-Karp Algorithmus p. 9/19
Berechnung in linearer Zeit I Problem: Algorithmus läuft insgesamt immer noch in O(nm) Lösung: Information aus der Berechnung von H(T r 1 ) für H(T r ) nutzen rekusive Formulierung für H(T r ): H(T r ) = 2 H(T r 1 ) 2 n T (r 1)+T (r + n 1) Zeichenketten: Rabin-Karp Algorithmus p. 9/19
Berechnung in linearer Zeit I Problem: Algorithmus läuft insgesamt immer noch in O(nm) Lösung: Information aus der Berechnung von H(T r 1 ) für H(T r ) nutzen rekusive Formulierung für H(T r ): H(T r ) = 2 H(T r 1 ) 2 n T (r 1)+T (r + n 1) mit der Definition von H p (T r ) H p (T r ) = H(T r ) mod p gilt dann... Zeichenketten: Rabin-Karp Algorithmus p. 9/19
Berechnung in linearer Zeit II H p (T r ) = [(2 H p (T r 1 ) mod p) (2 n mod p) T (r 1) + T (r + n 1)] mod p Zeichenketten: Rabin-Karp Algorithmus p. 10/19
Berechnung in linearer Zeit II H p (T r ) = [(2 H p (T r 1 ) mod p) (2 n mod p) T (r 1) + T (r + n 1)] mod p mit 2 n mod p = 2 (2 n 1 mod p) mod p Zeichenketten: Rabin-Karp Algorithmus p. 10/19
Berechnung in linearer Zeit II mit H p (T r ) = [(2 H p (T r 1 ) mod p) (2 n mod p) T (r 1) + T (r + n 1)] mod p 2 n mod p = 2 (2 n 1 mod p) mod p Nun haben wir alles, um einen Algorithmus aufzustellen, der in O(n + m) läuft Zeichenketten: Rabin-Karp Algorithmus p. 10/19
Pseudocode 1: RabinKarp (P : Muster, T : Text, p: Primzahl) 2: n P, m T 3: H p (P ) computehash(), H p (T 1 ) computehash() Zeichenketten: Rabin-Karp Algorithmus p. 11/19
Pseudocode 1: RabinKarp (P : Muster, T : Text, p: Primzahl) 2: n P, m T 3: H p (P ) computehash(), H p (T 1 ) computehash() 4: if (H p (T 1 ) == H p (P )) then 5: print Match an der Stelle 0 gefunden 6: end if Zeichenketten: Rabin-Karp Algorithmus p. 11/19
Pseudocode 1: RabinKarp (P : Muster, T : Text, p: Primzahl) 2: n P, m T 3: H p (P ) computehash(), H p (T 1 ) computehash() 4: if (H p (T 1 ) == H p (P )) then 5: print Match an der Stelle 0 gefunden 6: end if 7: for (i 2) to (m n + 1) do 8: H p (T i ) makeshift(h p (T i 1 )) 9: if (H p (P ) == H p (T i )) then 10: print Match an der Stelle, i, gefunden 11: end if 12: end for Zeichenketten: Rabin-Karp Algorithmus p. 11/19
false matches Wie schon erwähnt, gilt H p (P ) H p (T r ) aber H p (T r ) H p (P ) (false match) Zeichenketten: Rabin-Karp Algorithmus p. 12/19
false matches Wie schon erwähnt, gilt H p (P ) H p (T r ) aber H p (T r ) H p (P ) (false match) Zwickmühle: p klein: Effiziente Berechnung p groß: geringe Wahrscheinlichkeit eines false matches Zeichenketten: Rabin-Karp Algorithmus p. 12/19
false matches Wie schon erwähnt, gilt H p (P ) H p (T r ) aber H p (T r ) H p (P ) (false match) Zwickmühle: p klein: Effiziente Berechnung p groß: geringe Wahrscheinlichkeit eines false matches Wie muss p gewählt werden? Wahrscheinlichkeitsrechnung Zeichenketten: Rabin-Karp Algorithmus p. 12/19
The Central Theorem I Definition: Für alle u N gibt π(u) die Anzahl der Primzahlen u an Zeichenketten: Rabin-Karp Algorithmus p. 13/19
The Central Theorem I Definition: Für alle u N gibt π(u) die Anzahl der Primzahlen u an Beispiel: u = 29 π(u) = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29} = 10 Zeichenketten: Rabin-Karp Algorithmus p. 13/19
The Central Theorem I Definition: Für alle u N gibt π(u) die Anzahl der Primzahlen u an Beispiel: u = 29 π(u) = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29} = 10 Das zentrale Theorem von Rabin&Karp: (w sei die Wahrscheinlichkeit, dass ein false match auftritt) (n m) 29: I N: p I: w π(nm) π(i) Zeichenketten: Rabin-Karp Algorithmus p. 13/19
The Central Theorem II Beispiel: Wähle n = 250, m = 10.000 und I = 2 31 (max. Speicherbereich für int in der Horner-Regel) π(nm) π(i) 0, 0017 Zeichenketten: Rabin-Karp Algorithmus p. 14/19
The Central Theorem II Beispiel: Wähle n = 250, m = 10.000 und I = 2 31 (max. Speicherbereich für int in der Horner-Regel) π(nm) π(i) 0, 0017 Die Wahrscheinlichkeit, dass ein false match auftritt, beträgt 0.1%! Zeichenketten: Rabin-Karp Algorithmus p. 14/19
Erweiterung: Mehrere Primzahlen eine Primzahl ist gut, mehrere sind besser... Wähle p 1, p 2,..., p k I zufällig und berechne k Fingerprints Zeichenketten: Rabin-Karp Algorithmus p. 15/19
Erweiterung: Mehrere Primzahlen eine Primzahl ist gut, mehrere sind besser... Wähle p 1, p 2,..., p k I zufällig und berechne k Fingerprints Wahrscheinlichkeit w eines false matches: w [ ] k π(nm) Exponentielle Verringerung! π(i) Zeichenketten: Rabin-Karp Algorithmus p. 15/19
Erweiterung: Mehrere Primzahlen eine Primzahl ist gut, mehrere sind besser... Wähle p 1, p 2,..., p k I zufällig und berechne k Fingerprints Wahrscheinlichkeit w eines false matches: w [ ] k π(nm) Exponentielle Verringerung! π(i) Somit ergibt sich mit k = 4 für das Beispiel: [ ] 4 π(nm) w 9, 2 10 12 π(i) Zeichenketten: Rabin-Karp Algorithmus p. 15/19
Erweiterung: Mehrere Primzahlen aber man kann die Schranke nach Rabin&Karp noch weiter heruntersetzen: w m [ π(n) π(i) ] k Zeichenketten: Rabin-Karp Algorithmus p. 16/19
Erweiterung: Mehrere Primzahlen aber man kann die Schranke nach Rabin&Karp noch weiter heruntersetzen: w m [ π(n) π(i) ] k daraus folgt für das Beispiel: w 6, 5 10 22 Zeichenketten: Rabin-Karp Algorithmus p. 16/19
Erweiterung: Mehrere Primzahlen aber man kann die Schranke nach Rabin&Karp noch weiter heruntersetzen: w m [ π(n) π(i) ] k daraus folgt für das Beispiel: w 6, 5 10 22 ein false match kann damit praktisch ausgeschlossen werden Zeichenketten: Rabin-Karp Algorithmus p. 16/19
Analyse Der eigentliche Algorithmus läuft in O(n + m) = Θ(n + m) Zeichenketten: Rabin-Karp Algorithmus p. 17/19
Analyse Der eigentliche Algorithmus läuft in O(n + m) = Θ(n + m) Mit der Primzahlenerweiterung: O(k (n + m)) Zeichenketten: Rabin-Karp Algorithmus p. 17/19
Analyse Der eigentliche Algorithmus läuft in O(n + m) = Θ(n + m) Mit der Primzahlenerweiterung: O(k (n + m)) Um eine exakte Suche durchzuführen, müssen die Ergebnisse noch zusätzlich getestet werden. Zeichenketten: Rabin-Karp Algorithmus p. 17/19
Analyse Der eigentliche Algorithmus läuft in O(n + m) = Θ(n + m) Mit der Primzahlenerweiterung: O(k (n + m)) Um eine exakte Suche durchzuführen, müssen die Ergebnisse noch zusätzlich getestet werden. Insgesamt also wesentlich schlechter als BMH oder KMP! Sie laufen sogar in sublinearer Zeit und sind exakt Zeichenketten: Rabin-Karp Algorithmus p. 17/19
Analyse Der eigentliche Algorithmus läuft in O(n + m) = Θ(n + m) Mit der Primzahlenerweiterung: O(k (n + m)) Um eine exakte Suche durchzuführen, müssen die Ergebnisse noch zusätzlich getestet werden. Insgesamt also wesentlich schlechter als BMH oder KMP! Sie laufen sogar in sublinearer Zeit und sind exakt Allerdings kann zu jeder Eingabe eine treffende Aussage über das Verhalten gemacht werden Zeichenketten: Rabin-Karp Algorithmus p. 17/19
Demonstration Und nun das Ganze in Action..! Zeichenketten: Rabin-Karp Algorithmus p. 18/19
Literatur D. Gusfield: Algorithms On Strings, Trees And Sequences Cambridge University Press, 1997 R. Karp / M. Rabin: Effizient Randomized Pattern-Matching Algorithms Journal of Res. and Dev., 1987 T. H. Cormen: Introduction to Algorithms The MIT Press, 1990 Zeichenketten: Rabin-Karp Algorithmus p. 19/19