Boyer-Moore-Algorithmus Ein Textsuchalgorithmus für  große Alphabete Martin Szugat (Martin.Szugat@GMX.net)
Agenda Evolution: Von der naiven Suche über Knuth-Morris-Pratt zu Boyer-Moore Schlechte Zeichen und gute Suffixe Boyer-Moore vom Anfang bis zum Ende Fazit: Der Durchschnitt siegt!
Problemstellung Exakte Suche von  kurzen Zeichenfolgen in  langen Zeichenfolgen
Zur Erinnerung!!! Das  Muster  (engl. Pattern) ist die gesuchte Zeichenfolge. Der  Text  ist die durchsuchte Zeichenfolge. Als ( Mis- ) Match  wird die (Nicht-)Überein-stimmung von einem Zeichen aus dem Muster mit einem Zeichen im Text bezeichnet. Nach einem Mismatch wird das Muster im Text verschoben, was als  Shift  bezeichnet wird.
Lösung I: Naive Suche Vergleiche die Zeichen des Musters mit den Zeichen des Textes, solange wie kein Mismatch auftritt. Bei einem Mismatch verschiebe das Muster um ein Zeichen im Text und beginne von vorne. Falls alle Zeichen übereinstimmen, wurde ein Treffer erzielt.
Naive Suche - Beispiel Text  aaaabaaaac... Muster  aaaac Anzahl der Vergleiche: 0
Naive Suche - Beispiel Text  a aaabaaaac... Muster  a aaac Anzahl der Vergleiche: 1
Naive Suche - Beispiel Text  a a aabaaaac... Muster  a a aac Anzahl der Vergleiche: 2
Naive Suche - Beispiel Text  aaaa b aaaac... Muster  aaaa c Anzahl der Vergleiche: 5
Naive Suche - Beispiel Text  aaaa b aaaac... Muster  aaaa c Anzahl der Vergleiche: 5
Naive Suche - Beispiel Text  a aaa b aaaac... Muster  aaa a c Anzahl der Vergleiche: 9
Naive Suche - Beispiel Text  aa aa b aaaac... Muster  aa a ac Anzahl der Vergleiche: 12
Naive Suche - Beispiel Text  aaaab aaaac ... Muster  aaaac Anzahl der Vergleiche: 20
Naive Suche - Laufzeit Um in einem Text der Länge  n ein Muster der Länge  m  zu finden, benötigt die naive Suche maximal m (n – m + 1) Vergleiche.
Lösung II: Knuth-Morris-Pratt Idee: Größere Shifts durch Wiederholungen von Zeichenfolgen im Muster. Algorithmus: Berechne die Länge der eigentlichen Ränder aller Präfixe des Musters. Vergleiche das Muster mit dem Text. Bei einem Mismatch verwende die Ränderlängen, um das Muster im Text zu verschieben.
Länge der Ränder aller Präfixe Muster   ε  a b a b c Randlänge Leeres Wort
Länge der Ränder aller Präfixe Muster   ε  a b a b c Randlänge -1 Per Definition Leeres Wort
Länge der eigentlichen Ränder aller Präfixe Muster   ε  a b a b c Randlänge -1 0 0
Länge der Ränder aller Präfixe Muster   ε   a  b  a  b c Randlänge -1 0 0  1
Länge der Ränder aller Präfixe Muster   ε   a b   a b  c Randlänge -1 0 0 1  2
Länge der Ränder aller Präfixe Muster   ε  a b a b c Randlänge -1 0 0 1 2 0
Knuth-Morris-Pratt - Beispiel Text   a b a b a b c ... Muster   a b a b c
Knuth-Morris-Pratt - Beispiel Text   a b a b   a  b c ... Muster   a b a b   c Position   0 1 2 3  4 -  Randlänge -1 0 0 1  2  0 =  Shift   2 Anzahl der Vergleiche: 5
Knuth-Morris-Pratt - Beispiel Text a b  a b  a b c ... Muster   a b  a b c Anzahl der Vergleiche: 5
Knuth-Morris-Pratt - Beispiel Text a b  a b   a  b c ... Muster   a b  a  b c Anzahl der Vergleiche: 6
Knuth-Morris-Pratt - Beispiel Text a b  a b   a b c  ... Muster   a b a b c Anzahl der Vergleiche: 8
Knuth-Morris-Pratt - Laufzeit Für die eigentliche Suche: 2n – m + 1 Für die Tabelle mit den Längen der Ränder: 2m - 1 Für den KMP-Algorithmus insgesamt: 2n + m
Knuth-Morris-Pratt - Worst-Case Text   a a   c  a a c a a b Muster   a a   b Position   0 1  2 –  Randlänge -1 0  1  0 =  Shift   1 Anzahl der Vergleiche: 3
Knuth-Morris-Pratt - Worst-Case Text   a  a   c  a a c a a b Muster   a  a  b Position   0  1  2 –  Randlänge   -1  0  1 0 =  Shift   1 Anzahl der Vergleiche: 5
Knuth-Morris-Pratt - Worst-Case Text   a a  c  a a c a a b Muster   a   a b Position   0  1 2 –   Randlänge   -1  0 1 0 =  Shift   1 Anzahl der Vergleiche: 6
Knuth-Morris-Pratt - Worst-Case Text   a a c  a a   c  a a b Muster   a a   b Position   0 1  2 –   Randlänge   -1 0  1  0 =  Shift   1 Anzahl der Vergleiche: 9
Knuth-Morris-Pratt - Worst-Case Text   a a c a a c  a a b Muster   a a   b Anzahl der Vergleiche: 14
Bad Character Definition: Ein Zeichen, welches einen Mismatch auslöst, wird  Bad Character  genannt. Problem: Das Bad Character wird beim Shift nicht berücksichtigt Folge: Das Muster wird im schlechtesten Fall stets nur um ein Zeichen verschoben. Sonderfall: Das Bad Character taucht im Muster überhaupt nicht auf.  Lösung: Falls das Bad Character nicht im Muster vorkommt, verschiebe das Muster um die volle Länge.
Bad Character – Beispiel I Text   a a   c  a a c a a b Muster   a a   b Anzahl der Vergleiche: 3
Bad Character - Beispiel I Text   a a c  a a   c  a a b Muster   a a   b Anzahl der Vergleiche: 6
Bad Character - Beispiel I Text   a a c a a c  a a b Muster   a a b Anzahl der Vergleiche: 9
Muster von rechts nach links vergleichen Problem: Es müssen weiterhin alle Zeichen im Text mindestens einmal mit einem Zeichen aus dem Muster verglichen werden. Lösung: Vergleiche das Muster von rechts nach links mit dem Text. Vorteil: Bad Character werden schneller erkannt!
Bad Character - Beispiel II Text   a a  c  a a c a a b Muster   a a  b Anzahl der Vergleiche: 1
Bad Character - Beispiel II Text   a a c a a  c  a a b Muster   a a  b Anzahl der Vergleiche: 2
Bad Character - Beispiel II Text   a a c a a c  a a b Muster   a a b Anzahl der Vergleiche: 5
Bad Character-Regel Sei  A  das verwendete Alphabet, und  c  ein Zeichen aus dem Alphabet  A , dann liefert die Funktion  s(c) die Position des letzten Auftretens von  c  im Muster den Wert  -1 , falls  c  nicht im Muster auftaucht. Für einen Mismatch an Position  j  gilt: Shift = j – s(c) , sofern  s(c) < j
Bad Character-Regel - Laufzeit Im Best-Case hat der Boyer-Moore-Algorithmus dank der Bad Character-Regel eine Laufzeit von  n / m Im Worst-Case hat er mit der Bad Character-Regel alleine jedoch eine Laufzeit von  n  ·  m
Sprungtabelle Der Boyer-Moore-Algorithmus benötigt zusätzlich eine Sprungtabelle, um auch im Worst-Case eine Laufzeit linear zu  n  zu erreichen. Vorgehen: Berechne die Längen der Teilzeichenfolgen des Musters, die auch Suffixe des Musters sind.   Good Suffix  Berechne die Sprungtabelle.
Good Suffix - Beispiel Text: Wiederholung von baabaabaaaabaabaabaaaabaabaabaaaa... baabaabaaba Muster Anzahl der Vergleiche: 0
Good Suffix - Beispiel Text: Wiederholung von baabaabaa a a baabaabaaaabaabaabaaaa... baabaabaa b a Muster Anzahl der Vergleiche: 2
Good Suffix - Beispiel Text: Wiederholung von baabaaba a aaba abaabaaaabaabaabaaaa... baabaa b aaba Muster Anzahl der Vergleiche: 7 Shift um 2
Good Suffix - Beispiel baabaaba a aaba abaabaaaabaabaabaaaa... baabaa b aaba Anzahl der Vergleiche: 7 Weak Good Suffix!
Good Suffix - Beispiel baabaaba a aabaaba abaaaabaabaabaaaa... baa b aabaaba Anzahl der Vergleiche: 15 Mismatch an derselben Stelle im Text mit dem gleichen Zeichen im Muster! Shift um 3
Strong Good Suffix-Regel Problem: Mit einer Weak Good Suffix-Regel hat der Boyer-Moore-Algorithmus in diesem Fall eine Laufzeit von  (n  ·  m) / 6 Lösung:  Strong Good Suffix-Regel Vorteil: An der Stelle, an der ein Mismatch erfolgte, befindet sich nach einem Shift ein anderes Zeichen als jenes, welches den Mismatch verursachte.
Strong Good Suffix - Beispiel Text: Wiederholung von baabaabaa a a baabaabaaaabaabaabaaaa... aaabaabaa b a Muster Anzahl der Vergleiche: 2
Strong Good Suffix - Beispiel Text: Wiederholung von baabaaba a aaba abaabaaaabaabaabaaaa... aaabaa b aaba Muster Anzahl der Vergleiche: 7 Shift um 2
Strong Good Suffix - Beispiel baabaaba a aaba abaabaaaabaabaabaaaa... aaabaa b aaba Anzahl der Vergleiche: 7 Weak Good Suffix
Strong Good Suffix - Beispiel baabaaba a aaba abaabaaaabaabaabaaaa... aaabaa b aaba Anzahl der Vergleiche: 7 Strong Good Suffix!
Strong Good Suffix - Beispiel baabaaba a aaba abaaba aaabaabaabaaaa... a aaba abaaba Anzahl der Vergleiche: 18 Shift um 6 Bereits überprüfter Bereich wird erneut verglichen.
Kein Strong Good Suffix?! baabaaba a aaba abaabaaaabaabaabaaaa... baabaa b aaba Anzahl der Vergleiche: 7 Weak Good Suffix
Regel für die Ränder Problem: Die übereinstimmende Zeichenfolge kommt kein zweites Mal (als  Strong Good Suffix ) im Muster vor. Folge: Die Sprungtabelle liefert für diesen Fall einen Shift von 0! Lösung: Eine 2. Sprungtabelle wird berechnet, welche die eigentlichen Ränder des Musters berücksichtigt.
Randregel  - Beispiel baabaaba a aaba abaabaaaabaabaabaaaa... baabaa b aaba Anzahl der Vergleiche: 7 In einer 2. Sprungtabelle werden die eigentlichen Ränder des Musters berücksichtigt.
Randregel - Beispiel baabaabaaaa ba abaabaa a a baabaabaaaa... ba abaabaa b a To be continued ... Anzahl der Vergleiche: 9 Vorheriger Mismatch
Boyer-Moore: Top-Down Berechne die Tabelle für die Bad Character-Regel und die Sprungtabelle (Strong Good Suffix und Randregel). Vergleiche das Muster mit dem Text, solange bis ein Mismatch auftritt. Bei einem Mismatch ermittle anhand der aktuellen Position den Sprungwert für die Bad Character-Regel und für die Sprungtabelle. Führe den größeren der beiden Shifts durch.
Algorithmus für die  Bad Character-Regel Erzeuge eine Tabelle mit der Größe des verwendeten Alphabets und initialisiere die Felder mit dem Wert  -1 . Durchlaufe das Muster von links nach rechts  und speichere die Position des aktuellen Zeichens in der Tabelle. Als Index verwende das Zeichen. Beispiel „abcab“:  &quot;a&quot;  3, &quot;b&quot;  4, &quot;c&quot;  2, &quot;d&quot;  -1, ...
Algorithmus für die Sprungtabelle Berechne eine Zwischentabelle mit den Längen der Teilzeichenfolgen, die ein starkes Suffix des Musters sind. Berechne anhand der Zwischentabelle die Sprungtabelle 1. für die Strong Good Suffix-Regel und die Sprungtabelle 2. für die Randregel. Kombiniere beide Sprungtabellen.
Berechnung der Zwischentabelle Index i 0 1 2 3 4 5 6 7 8 Muster  P b a b a c b a b a Suffixlänge  N(i) 0 2 0 4 0 0 2 0 - N(i):= max{j: j  ≥ 0  Λ  P[(i – j + 1)..i] ist Suffix von P}
Berechnung der Zwischentabelle Index i   6   Muster  P b a b a c  b a  b a Suffixlänge  N(i)   2 N( 6 ):= max{j: j  ≥ 0  Λ  P[( 6  – j + 1).. 6 ]  ist Suffix von P} =  2
Algorithmus für die Berechnung der Zwischentabelle (1) Durchsuche das Muster von rechts nach links per Brute-Force nach einem Suffix des Musters. d c b a b a c  b a i,e b a a N(i) = i – a Muster  P
Algorithmus für die Berechnung der Zwischentabelle (2) Falls gilt:  a < i < e Wird  N(i)  mit  N(|P| + i - e - 1)  berechnet. 1. Fall:  N(|P| + i - e - 1) < i - a d c b a b a c b a b a i c  b a  b a N(i) = N(|P| + i – e - 1) N(3) = N(8) = 2 e a c  b a b a
Algorithmus für die Berechnung der Zwischentabelle (3) 2. Fall:  N(|P| + i - e - 1) >= i - a a  b a  b a c b  a b a i b a  b a N(i) >= N(|P| + i – e - 1) N(2) = N(7) + 1 = 2 + 1 = 3 e a b a  b a
Berechnung der Sprungtabelle 1. Für den Fall, dass Gesucht Shift  s  minimal mit:  N(|P| - s – 1) = |P| - j - 1 Text Muster  P Muster  P Fehler bei  i + j i s |P| - j - 1 s
Berechnung der Sprungtabelle 2. Für den Fall, dass Gesucht Shift  s  minimal mit:  N(|P| - s – 1) = |P| - s Text Muster  P Muster  P Fehler bei  i + j i s |P| - s
Laufzeiten bei Boyer-Moore I Für die Berechnung der Bad Character-Regel: Abhängig von der Größe des Alphabets Allerdings: Keine Zeichenfolgenvergleiche Sondern: Nur Speicherzugriffe über einen Index Für die Berechnung der Sprungtabelle 1. und 2.: Vergleichbar zum KMP Laufzeit: linear
Laufzeiten bei Boyer-Moore II Für die eigentliche Suche: Unterscheidung zwischen initialen und wiederholten Vergleichen mit einem Zeichen im Muster Laufzeit: linear Für den Boyer-Moore-Algorithmus insgesamt: Aufwendige Analyse Maximal  3(n + m)  Vergleiche notwendig
Fazit: Vorteile von Boyer-Moore Bad Character-Regel     Große Alphabete: Proteine Muster von rechts nach links vergleichen    Im Best-Case eine Laufzeit von  n / m   Strong Good Suffix-Regel    Im Worst-Case eine Laufzeit von  3 (n + m)
Vergleich zu Knuth-Morris-Pratt Um so größer das verwendete Alphabet ist und um so weniger Wiederholungen das Muster und der Text enthält, um so stärker nähert sich die tatsächliche Laufzeit der Laufzeit im Best-Case an. 3 (n + m) 2 (n + m) Worst-Case n / m 2 (n + m) Best-Case Boyer-Moore Knuth-Morris-Pratt Algo Case
Noch Fragen??? May the source be with you ...

Weitere ähnliche Inhalte

PDF
Active and passive voice rules by Sohail Ahmed
PPTX
C K Ke Ck Generalization
PPTX
Adjectives
PPTX
Boyer more algorithm
PPT
KMP Pattern Matching algorithm
PPTX
Boyer–Moore string search algorithm
PDF
String matching algorithms
PPTX
Rabin Karp - String Matching Algorithm
Active and passive voice rules by Sohail Ahmed
C K Ke Ck Generalization
Adjectives
Boyer more algorithm
KMP Pattern Matching algorithm
Boyer–Moore string search algorithm
String matching algorithms
Rabin Karp - String Matching Algorithm

Mehr von Martin Szugat (20)

PPTX
Self-Service.AI - Pitch Competition for AI-Driven SaaS Startups
PPTX
MENSCHEN STATT SEITEN - Ein Plädoyer für People Analytics
PPTX
Pylba: App-as-a-Service für Mobile Content Marketing
PPTX
Datentreiber - Wir treiben Ihr Unternehmen voran.
PPTX
Facebook Newsfeed Optimierung: Gefällt mir
PPTX
German CRM Forum 2014: Social Data für Customer Intelligence
PPTX
LMU - Tag der offenen Türe 2014 - Big Data = Big Business?
PPTX
Facebook ist tot. Eine Obduktion in sieben Akten.
PPTX
Daumen hoch: Conversion Optimierung für Social Commerce
PPTX
Young Brand Awards 2013 - Auf Facebook sind meine Eltern.
PPTX
Social CRM als Grundlage für persönliche Kundenkommunikation und personalisie...
PPTX
What will Facebook do?
PPTX
Social Media und Mobile Anwendungen sinnvoll verknüpfen
PDF
Referenten martin szugat_snip_clip 2013
PPTX
SnipClip @ LMU - Tag der offenen Türe 2013
PPTX
Die Mobile-Plattform der Zukunft: Facebook
PDF
Referentenprofil Martin Szugat
PPTX
Facebook Marketing: Grundlagen und Erfolgsfaktoren
PPTX
So funktioniert erfolgreiches Facebook-Marketing
PPTX
Ein bisschen Spaß muss sein: Game Mechanics im Social Media Marketing
Self-Service.AI - Pitch Competition for AI-Driven SaaS Startups
MENSCHEN STATT SEITEN - Ein Plädoyer für People Analytics
Pylba: App-as-a-Service für Mobile Content Marketing
Datentreiber - Wir treiben Ihr Unternehmen voran.
Facebook Newsfeed Optimierung: Gefällt mir
German CRM Forum 2014: Social Data für Customer Intelligence
LMU - Tag der offenen Türe 2014 - Big Data = Big Business?
Facebook ist tot. Eine Obduktion in sieben Akten.
Daumen hoch: Conversion Optimierung für Social Commerce
Young Brand Awards 2013 - Auf Facebook sind meine Eltern.
Social CRM als Grundlage für persönliche Kundenkommunikation und personalisie...
What will Facebook do?
Social Media und Mobile Anwendungen sinnvoll verknüpfen
Referenten martin szugat_snip_clip 2013
SnipClip @ LMU - Tag der offenen Türe 2013
Die Mobile-Plattform der Zukunft: Facebook
Referentenprofil Martin Szugat
Facebook Marketing: Grundlagen und Erfolgsfaktoren
So funktioniert erfolgreiches Facebook-Marketing
Ein bisschen Spaß muss sein: Game Mechanics im Social Media Marketing
Anzeige

Boyer-Moore-Algorithmus

  • 1. Boyer-Moore-Algorithmus Ein Textsuchalgorithmus für große Alphabete Martin Szugat (Martin.Szugat@GMX.net)
  • 2. Agenda Evolution: Von der naiven Suche über Knuth-Morris-Pratt zu Boyer-Moore Schlechte Zeichen und gute Suffixe Boyer-Moore vom Anfang bis zum Ende Fazit: Der Durchschnitt siegt!
  • 3. Problemstellung Exakte Suche von kurzen Zeichenfolgen in langen Zeichenfolgen
  • 4. Zur Erinnerung!!! Das Muster (engl. Pattern) ist die gesuchte Zeichenfolge. Der Text ist die durchsuchte Zeichenfolge. Als ( Mis- ) Match wird die (Nicht-)Überein-stimmung von einem Zeichen aus dem Muster mit einem Zeichen im Text bezeichnet. Nach einem Mismatch wird das Muster im Text verschoben, was als Shift bezeichnet wird.
  • 5. Lösung I: Naive Suche Vergleiche die Zeichen des Musters mit den Zeichen des Textes, solange wie kein Mismatch auftritt. Bei einem Mismatch verschiebe das Muster um ein Zeichen im Text und beginne von vorne. Falls alle Zeichen übereinstimmen, wurde ein Treffer erzielt.
  • 6. Naive Suche - Beispiel Text aaaabaaaac... Muster aaaac Anzahl der Vergleiche: 0
  • 7. Naive Suche - Beispiel Text a aaabaaaac... Muster a aaac Anzahl der Vergleiche: 1
  • 8. Naive Suche - Beispiel Text a a aabaaaac... Muster a a aac Anzahl der Vergleiche: 2
  • 9. Naive Suche - Beispiel Text aaaa b aaaac... Muster aaaa c Anzahl der Vergleiche: 5
  • 10. Naive Suche - Beispiel Text aaaa b aaaac... Muster aaaa c Anzahl der Vergleiche: 5
  • 11. Naive Suche - Beispiel Text a aaa b aaaac... Muster aaa a c Anzahl der Vergleiche: 9
  • 12. Naive Suche - Beispiel Text aa aa b aaaac... Muster aa a ac Anzahl der Vergleiche: 12
  • 13. Naive Suche - Beispiel Text aaaab aaaac ... Muster aaaac Anzahl der Vergleiche: 20
  • 14. Naive Suche - Laufzeit Um in einem Text der Länge n ein Muster der Länge m zu finden, benötigt die naive Suche maximal m (n – m + 1) Vergleiche.
  • 15. Lösung II: Knuth-Morris-Pratt Idee: Größere Shifts durch Wiederholungen von Zeichenfolgen im Muster. Algorithmus: Berechne die Länge der eigentlichen Ränder aller Präfixe des Musters. Vergleiche das Muster mit dem Text. Bei einem Mismatch verwende die Ränderlängen, um das Muster im Text zu verschieben.
  • 16. Länge der Ränder aller Präfixe Muster ε a b a b c Randlänge Leeres Wort
  • 17. Länge der Ränder aller Präfixe Muster ε a b a b c Randlänge -1 Per Definition Leeres Wort
  • 18. Länge der eigentlichen Ränder aller Präfixe Muster ε a b a b c Randlänge -1 0 0
  • 19. Länge der Ränder aller Präfixe Muster ε a b a b c Randlänge -1 0 0 1
  • 20. Länge der Ränder aller Präfixe Muster ε a b a b c Randlänge -1 0 0 1 2
  • 21. Länge der Ränder aller Präfixe Muster ε a b a b c Randlänge -1 0 0 1 2 0
  • 22. Knuth-Morris-Pratt - Beispiel Text a b a b a b c ... Muster a b a b c
  • 23. Knuth-Morris-Pratt - Beispiel Text a b a b a b c ... Muster a b a b c Position 0 1 2 3 4 - Randlänge -1 0 0 1 2 0 = Shift 2 Anzahl der Vergleiche: 5
  • 24. Knuth-Morris-Pratt - Beispiel Text a b a b a b c ... Muster a b a b c Anzahl der Vergleiche: 5
  • 25. Knuth-Morris-Pratt - Beispiel Text a b a b a b c ... Muster a b a b c Anzahl der Vergleiche: 6
  • 26. Knuth-Morris-Pratt - Beispiel Text a b a b a b c ... Muster a b a b c Anzahl der Vergleiche: 8
  • 27. Knuth-Morris-Pratt - Laufzeit Für die eigentliche Suche: 2n – m + 1 Für die Tabelle mit den Längen der Ränder: 2m - 1 Für den KMP-Algorithmus insgesamt: 2n + m
  • 28. Knuth-Morris-Pratt - Worst-Case Text a a c a a c a a b Muster a a b Position 0 1 2 – Randlänge -1 0 1 0 = Shift 1 Anzahl der Vergleiche: 3
  • 29. Knuth-Morris-Pratt - Worst-Case Text a a c a a c a a b Muster a a b Position 0 1 2 – Randlänge -1 0 1 0 = Shift 1 Anzahl der Vergleiche: 5
  • 30. Knuth-Morris-Pratt - Worst-Case Text a a c a a c a a b Muster a a b Position 0 1 2 – Randlänge -1 0 1 0 = Shift 1 Anzahl der Vergleiche: 6
  • 31. Knuth-Morris-Pratt - Worst-Case Text a a c a a c a a b Muster a a b Position 0 1 2 – Randlänge -1 0 1 0 = Shift 1 Anzahl der Vergleiche: 9
  • 32. Knuth-Morris-Pratt - Worst-Case Text a a c a a c a a b Muster a a b Anzahl der Vergleiche: 14
  • 33. Bad Character Definition: Ein Zeichen, welches einen Mismatch auslöst, wird Bad Character genannt. Problem: Das Bad Character wird beim Shift nicht berücksichtigt Folge: Das Muster wird im schlechtesten Fall stets nur um ein Zeichen verschoben. Sonderfall: Das Bad Character taucht im Muster überhaupt nicht auf. Lösung: Falls das Bad Character nicht im Muster vorkommt, verschiebe das Muster um die volle Länge.
  • 34. Bad Character – Beispiel I Text a a c a a c a a b Muster a a b Anzahl der Vergleiche: 3
  • 35. Bad Character - Beispiel I Text a a c a a c a a b Muster a a b Anzahl der Vergleiche: 6
  • 36. Bad Character - Beispiel I Text a a c a a c a a b Muster a a b Anzahl der Vergleiche: 9
  • 37. Muster von rechts nach links vergleichen Problem: Es müssen weiterhin alle Zeichen im Text mindestens einmal mit einem Zeichen aus dem Muster verglichen werden. Lösung: Vergleiche das Muster von rechts nach links mit dem Text. Vorteil: Bad Character werden schneller erkannt!
  • 38. Bad Character - Beispiel II Text a a c a a c a a b Muster a a b Anzahl der Vergleiche: 1
  • 39. Bad Character - Beispiel II Text a a c a a c a a b Muster a a b Anzahl der Vergleiche: 2
  • 40. Bad Character - Beispiel II Text a a c a a c a a b Muster a a b Anzahl der Vergleiche: 5
  • 41. Bad Character-Regel Sei A das verwendete Alphabet, und c ein Zeichen aus dem Alphabet A , dann liefert die Funktion s(c) die Position des letzten Auftretens von c im Muster den Wert -1 , falls c nicht im Muster auftaucht. Für einen Mismatch an Position j gilt: Shift = j – s(c) , sofern s(c) < j
  • 42. Bad Character-Regel - Laufzeit Im Best-Case hat der Boyer-Moore-Algorithmus dank der Bad Character-Regel eine Laufzeit von n / m Im Worst-Case hat er mit der Bad Character-Regel alleine jedoch eine Laufzeit von n · m
  • 43. Sprungtabelle Der Boyer-Moore-Algorithmus benötigt zusätzlich eine Sprungtabelle, um auch im Worst-Case eine Laufzeit linear zu n zu erreichen. Vorgehen: Berechne die Längen der Teilzeichenfolgen des Musters, die auch Suffixe des Musters sind.  Good Suffix Berechne die Sprungtabelle.
  • 44. Good Suffix - Beispiel Text: Wiederholung von baabaabaaaabaabaabaaaabaabaabaaaa... baabaabaaba Muster Anzahl der Vergleiche: 0
  • 45. Good Suffix - Beispiel Text: Wiederholung von baabaabaa a a baabaabaaaabaabaabaaaa... baabaabaa b a Muster Anzahl der Vergleiche: 2
  • 46. Good Suffix - Beispiel Text: Wiederholung von baabaaba a aaba abaabaaaabaabaabaaaa... baabaa b aaba Muster Anzahl der Vergleiche: 7 Shift um 2
  • 47. Good Suffix - Beispiel baabaaba a aaba abaabaaaabaabaabaaaa... baabaa b aaba Anzahl der Vergleiche: 7 Weak Good Suffix!
  • 48. Good Suffix - Beispiel baabaaba a aabaaba abaaaabaabaabaaaa... baa b aabaaba Anzahl der Vergleiche: 15 Mismatch an derselben Stelle im Text mit dem gleichen Zeichen im Muster! Shift um 3
  • 49. Strong Good Suffix-Regel Problem: Mit einer Weak Good Suffix-Regel hat der Boyer-Moore-Algorithmus in diesem Fall eine Laufzeit von (n · m) / 6 Lösung: Strong Good Suffix-Regel Vorteil: An der Stelle, an der ein Mismatch erfolgte, befindet sich nach einem Shift ein anderes Zeichen als jenes, welches den Mismatch verursachte.
  • 50. Strong Good Suffix - Beispiel Text: Wiederholung von baabaabaa a a baabaabaaaabaabaabaaaa... aaabaabaa b a Muster Anzahl der Vergleiche: 2
  • 51. Strong Good Suffix - Beispiel Text: Wiederholung von baabaaba a aaba abaabaaaabaabaabaaaa... aaabaa b aaba Muster Anzahl der Vergleiche: 7 Shift um 2
  • 52. Strong Good Suffix - Beispiel baabaaba a aaba abaabaaaabaabaabaaaa... aaabaa b aaba Anzahl der Vergleiche: 7 Weak Good Suffix
  • 53. Strong Good Suffix - Beispiel baabaaba a aaba abaabaaaabaabaabaaaa... aaabaa b aaba Anzahl der Vergleiche: 7 Strong Good Suffix!
  • 54. Strong Good Suffix - Beispiel baabaaba a aaba abaaba aaabaabaabaaaa... a aaba abaaba Anzahl der Vergleiche: 18 Shift um 6 Bereits überprüfter Bereich wird erneut verglichen.
  • 55. Kein Strong Good Suffix?! baabaaba a aaba abaabaaaabaabaabaaaa... baabaa b aaba Anzahl der Vergleiche: 7 Weak Good Suffix
  • 56. Regel für die Ränder Problem: Die übereinstimmende Zeichenfolge kommt kein zweites Mal (als Strong Good Suffix ) im Muster vor. Folge: Die Sprungtabelle liefert für diesen Fall einen Shift von 0! Lösung: Eine 2. Sprungtabelle wird berechnet, welche die eigentlichen Ränder des Musters berücksichtigt.
  • 57. Randregel - Beispiel baabaaba a aaba abaabaaaabaabaabaaaa... baabaa b aaba Anzahl der Vergleiche: 7 In einer 2. Sprungtabelle werden die eigentlichen Ränder des Musters berücksichtigt.
  • 58. Randregel - Beispiel baabaabaaaa ba abaabaa a a baabaabaaaa... ba abaabaa b a To be continued ... Anzahl der Vergleiche: 9 Vorheriger Mismatch
  • 59. Boyer-Moore: Top-Down Berechne die Tabelle für die Bad Character-Regel und die Sprungtabelle (Strong Good Suffix und Randregel). Vergleiche das Muster mit dem Text, solange bis ein Mismatch auftritt. Bei einem Mismatch ermittle anhand der aktuellen Position den Sprungwert für die Bad Character-Regel und für die Sprungtabelle. Führe den größeren der beiden Shifts durch.
  • 60. Algorithmus für die Bad Character-Regel Erzeuge eine Tabelle mit der Größe des verwendeten Alphabets und initialisiere die Felder mit dem Wert -1 . Durchlaufe das Muster von links nach rechts und speichere die Position des aktuellen Zeichens in der Tabelle. Als Index verwende das Zeichen. Beispiel „abcab“: &quot;a&quot;  3, &quot;b&quot;  4, &quot;c&quot;  2, &quot;d&quot;  -1, ...
  • 61. Algorithmus für die Sprungtabelle Berechne eine Zwischentabelle mit den Längen der Teilzeichenfolgen, die ein starkes Suffix des Musters sind. Berechne anhand der Zwischentabelle die Sprungtabelle 1. für die Strong Good Suffix-Regel und die Sprungtabelle 2. für die Randregel. Kombiniere beide Sprungtabellen.
  • 62. Berechnung der Zwischentabelle Index i 0 1 2 3 4 5 6 7 8 Muster P b a b a c b a b a Suffixlänge N(i) 0 2 0 4 0 0 2 0 - N(i):= max{j: j ≥ 0 Λ P[(i – j + 1)..i] ist Suffix von P}
  • 63. Berechnung der Zwischentabelle Index i 6 Muster P b a b a c b a b a Suffixlänge N(i) 2 N( 6 ):= max{j: j ≥ 0 Λ P[( 6 – j + 1).. 6 ] ist Suffix von P} = 2
  • 64. Algorithmus für die Berechnung der Zwischentabelle (1) Durchsuche das Muster von rechts nach links per Brute-Force nach einem Suffix des Musters. d c b a b a c b a i,e b a a N(i) = i – a Muster P
  • 65. Algorithmus für die Berechnung der Zwischentabelle (2) Falls gilt: a < i < e Wird N(i) mit N(|P| + i - e - 1) berechnet. 1. Fall: N(|P| + i - e - 1) < i - a d c b a b a c b a b a i c b a b a N(i) = N(|P| + i – e - 1) N(3) = N(8) = 2 e a c b a b a
  • 66. Algorithmus für die Berechnung der Zwischentabelle (3) 2. Fall: N(|P| + i - e - 1) >= i - a a b a b a c b a b a i b a b a N(i) >= N(|P| + i – e - 1) N(2) = N(7) + 1 = 2 + 1 = 3 e a b a b a
  • 67. Berechnung der Sprungtabelle 1. Für den Fall, dass Gesucht Shift s minimal mit: N(|P| - s – 1) = |P| - j - 1 Text Muster P Muster P Fehler bei i + j i s |P| - j - 1 s
  • 68. Berechnung der Sprungtabelle 2. Für den Fall, dass Gesucht Shift s minimal mit: N(|P| - s – 1) = |P| - s Text Muster P Muster P Fehler bei i + j i s |P| - s
  • 69. Laufzeiten bei Boyer-Moore I Für die Berechnung der Bad Character-Regel: Abhängig von der Größe des Alphabets Allerdings: Keine Zeichenfolgenvergleiche Sondern: Nur Speicherzugriffe über einen Index Für die Berechnung der Sprungtabelle 1. und 2.: Vergleichbar zum KMP Laufzeit: linear
  • 70. Laufzeiten bei Boyer-Moore II Für die eigentliche Suche: Unterscheidung zwischen initialen und wiederholten Vergleichen mit einem Zeichen im Muster Laufzeit: linear Für den Boyer-Moore-Algorithmus insgesamt: Aufwendige Analyse Maximal 3(n + m) Vergleiche notwendig
  • 71. Fazit: Vorteile von Boyer-Moore Bad Character-Regel  Große Alphabete: Proteine Muster von rechts nach links vergleichen  Im Best-Case eine Laufzeit von n / m Strong Good Suffix-Regel  Im Worst-Case eine Laufzeit von 3 (n + m)
  • 72. Vergleich zu Knuth-Morris-Pratt Um so größer das verwendete Alphabet ist und um so weniger Wiederholungen das Muster und der Text enthält, um so stärker nähert sich die tatsächliche Laufzeit der Laufzeit im Best-Case an. 3 (n + m) 2 (n + m) Worst-Case n / m 2 (n + m) Best-Case Boyer-Moore Knuth-Morris-Pratt Algo Case
  • 73. Noch Fragen??? May the source be with you ...