KMP算法入門
阿新 • • 發佈:2017-08-20
bject 算法 != text bsp with dia function png
學一把看毛片算法我覺得自己才能變得更加出色
明明昨天的題我都知道怎麽模擬了,但是還是不會改KMP,是我學醜了
KMP是Knuth-Morris-Pratt三人設計的線性時間字符串匹配算法
nxt數組的介紹,臥槽,直接找到太爽啦
就是我匹配的時候是可以回退的,因為字符的肯能性有限
比如aaaaaaaaab和aaaab進行匹配,aaaab是模式串,aaaaaaaaab是匹配串,我就不用回退那麽多次數,因為及時往下推就好了
我匹配了一部分我就能回退到一定的位置
下面是一段演示
我用的求前綴函數
void pre(char *p) { int i,m,j; m=strlen(p); nex[0]=nex[1]=0; for(int i=1; i<m; i++) { j=nex[i]; while(j&&p[i]!=p[j])j=nex[j]; nex[i+1]=p[i]==p[j]?j+1:0; } }
aaaab
0 0 1 2 3
aba
0 0 0
偽代碼
KMP-MATCHER(T, P)
1 n ← length[T]
2 m ← length[P]
3 π ← COMPUTE-PREFIX-FUNCTION(P)
4 q ← 0 ?Number of characters matched.
5 for i ← 1 to n ?Scan the text 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.
COMPUTE-PREFIX-FUNCTION(P)
1 m ← length[P]
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 π
KMP算法入門