Unit SS, Part B: String Matching, Knuth-Morris-Pratt
- Algorithm in Fig. 10.2
- k advances in text, j in pattern
- if pattern mismatch occurs, then use "next" position in pattern
- Explanation of "next" table example
- mismatch pat[j] => try pat[next[j]]
- a/0 b/1 r/1 a/0 c/2 a/0 d/2 a/0 b/1 r/1 a/0 X/5 (for X not in
text)
- Explanation of "next" table example by tracing pattern
pre-processing
- i=1, j=next[1]=0 **
- j==0 => i=2, j=1 (restart w. pat) pat[2]!=pat[1] => next[2]=1 **
"b" failed so backup and try "a"
- j!=0, pat[2]!=pat[1] => j=next[1]=0
- j==0 => i=3, j=1 (restart w. pat) pat[3]!=pat[1] => next[3]=1 **
"r" failed so backup and try "a"
- j!=0, pat[3]!=pat[1] => j=next[1]=0
- j==0 => i=4, j=1 (restart w. pat) pat[4]==pat[1] =>
next[4]=next[1]=0 ** "a" failed => advance pat
- j!=0, pat[4]==pat[1] => i=5, j=2 pat[5]!=pat[2] => next[5]=2 **
"c" failed but had "a" before so should see if text has "ab" so later
would check position 2: "b"
Example of Searching for Pattern in Text
KMP ALGORITHM (never decrease k)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[r]=1)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[r]=1)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[b]=1)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[a]=0)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[d]=2)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(match,full-match,j=resume=5)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[c]=2)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[b]=1)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[a]=0)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[a]=0)
ababaxabracabracadabratcadabrax
abracadabra
^(match)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[b]=1)
ababaxabracabracadabratcadabrax
abracadabra
^(no-match, next[a]=0)
...