Knuth-Morris in Pratt uvedeta linearni časovni algoritem za problem ujemanja nizov. Čas ujemanja O (n) se doseže z izogibanjem primerjavi z elementom 'S', ki je bil predhodno vključen v primerjavo z nekim elementom vzorca 'p', ki ga je treba ujemati. t.j. povratno sledenje na nizu 'S' se nikoli ne pojavi
Komponente algoritma KMP:
1. Funkcija predpone (Π): Funkcija predpone, Π za vzorec, zajema znanje o tem, kako se vzorec ujema s premikom samega sebe. Te informacije se lahko uporabijo za izogibanje neuporabnemu premikanju vzorca 'p'. Z drugimi besedami, to omogoča izogibanje povratnemu sledenju niza 'S'.
2. Tekme KMP: Z nizom 'S', vzorcem 'p' in funkcijo predpone 'Π' kot vhodi poiščite pojavitev 'p' v 'S' in vrne število premikov 'p', po katerih so najdene pojavitve.
Funkcija predpone (Π)
Naslednja psevdo koda izračuna funkcijo predpone, Π:
<strong>COMPUTE- PREFIX- FUNCTION (P)</strong> 1. m ←length [P] //'p' pattern to be matched 2. Π [1] ← 0 3. k ← 0 4. for q ← 2 to m 5. do while k > 0 and P [k + 1] ≠ P [q] 6. do k ← Π [k] 7. If P [k + 1] = P [q] 8. then k← k + 1 9. Π [q] ← k 10. Return Π
Analiza časa delovanja:
V zgornji psevdo kodi za izračun funkcije predpone se zanka for od koraka 4 do koraka 10 izvede 'm'-krat. Koraki od 1 do 3 zahtevajo konstanten čas. Zato je čas delovanja računalniške funkcije predpone O (m).
primer: Izračunajte Π za vzorec 'p' spodaj:
orodna vrstica za hitri dostop ms word
rešitev:
Initially: m = length [p] = 7 Π [1] = 0 k = 0
Po 6-kratni ponovitvi je izračun funkcije predpone končan:
KMP se ujema z:
Ujemanje KMP z vzorcem 'p', nizom 'S' in funkcijo predpone 'Π' kot vhodom najde ujemanje p v S. Naslednja psevdo koda izračuna komponento ujemanja algoritma KMP:
<strong>KMP-MATCHER (T, P)</strong> 1. n ← length [T] 2. m ← length [P] 3. Π← COMPUTE-PREFIX-FUNCTION (P) 4. q ← 0 // numbers of characters matched 5. for i ← 1 to n // scan S from left to right 6. do while q > 0 and P [q + 1] ≠ T [i] 7. do q ← Π [q] // next character does not match 8. If P [q + 1] = T [i] 9. then q ← q + 1 // next character matches 10. If q = m // is all of p matched? 11. then print 'Pattern occurs with shift' i - m 12. q ← Π [q] // look for the next match
Analiza časa delovanja:
Zanka for, ki se začne v koraku 5, se izvede 'n'-krat, tj. dokler je dolžina niza 'S'. Ker koraki od 1 do 4 zahtevajo konstantne čase, čas delovanja prevladuje za zanko. Tako je čas delovanja funkcije ujemanja O (n).
primer: Podan je niz 'T' in vzorec 'P', kot sledi:
Izvedimo algoritem KMP, da ugotovimo, ali se 'P' pojavi v 'T'.
Za 'p' funkcijo predpone, ? je bil predhodno izračunan in je naslednji:
rešitev:
Initially: n = size of T = 15 m = size of P = 7
Ugotovljeno je bilo, da se kompleksnost vzorca 'P' pojavlja v nizu 'T'. Skupno število premikov, ki so se zgodili za iskanje ujemanja, je i-m = 13 - 7 = 6 premikov.