Sunteți pe pagina 1din 20

String patterns

String matching algorithms


(also called string-searching algorithms)
Problema
Rabin-Karp

• Întrucât ne este mai ușor să facem


egalitate între numere, algoritmul
asociază fiecărui șir de lungime n
un număr. Dacă două numere
sunt egale înseamnă că cele două
șiruri coincid.
• Astfel definim funcția următoare:
Rabin-Karp

Pe această funcție trebuie să putem face următoarele operații:


• inițializarea primei secvențe de lungime n
• calcularea eficientă a numărului corespunzător secvenței următoare
Rabin-Karp

• Definirea unei funcții polinomiale ar rezolva eficient ambele operații:


Rabin-Karp
Prin urmare,

Se observă că:

Aceasta este o relație de recurență calculată fără repetitive, deci eficientă.


Fiind pregătite ambele operații, rolling-hash-ul este gata de a fi implementat.
Rabin-Karp

• Detalii de implementare:
• problema numerelor mari: fiind o funcție care implică multe ridicări la putere și adunări, pentru
a nu avea probleme cu depășirea int-ului sau long long-ului toate calculele se vor face %MOD
(ex. mod = 40099, 319993)
• modulul: deoarece egalitatea în modul nu implică neapărat egalitatea numerelor, vom folosi
două module diferite. Dacă ambele numere formate folosind modulele vor fi egale atunci vom
trage concluzia că sunt egale stringurile.

• structurarea datelor: RH depinde de mulți parametrii – stringul, v, mod – și cel mai ușor va fi
implementată folosind o structură/clasă.

Exemplu de numere: pentru o valoare: v=31, MOD=40099, v2=53, MOD2=319993


Rabin-Karp
Rabin-Karp
KMP (Knuth-Morris-Pratt)

ABXABCABCABY
ABCABY
KMP (Knuth-Morris-Pratt)

ABXABCABCABY
ABCABY

În mod normal atunci când două șiruri nu se potrivesc, am începe de la poziția următoare verificarea.
KMP (Knuth-Morris-Pratt)

ABXABCABCABY
ABCABY
KMP (Knuth-Morris-Pratt)

ABXABCABCABY
ABCABY
KMP (Knuth-Morris-Pratt)

ABXABCABCABY
ABCABY

Folosind această observație, ne gândim să formăm mai întâi un șir care sa ne ajute în determinarea prefixului. Iar apoi
să-l utilizăm în parcurgere
KMP (Knuth-Morris-Pratt)
Pași în algoritmul KMP:
1. Formarea prefixului
2. Utilizarea acestuia în parcurgerea șirului

ABXABCABCABY
ABCABY
-100012
KMP (Knuth-Morris-Pratt)
1. Formarea prefixului - exemple
KMP (Knuth-Morris-Pratt)
1. Formarea prefixului - cod
KMP (Knuth-Morris-Pratt)
2. Parcurgerea
KMP (Knuth-Morris-Pratt)
P- șirul de prefixe
p - șirul căruia îi căutăm aparițiile din B
m – lungimea șirului p
n – lungimea șirului s

când j == m am ajuns la sfârșitul


șirului scurt și înseamnă că am găsit
o nouă apariție a sa.

S-ar putea să vă placă și