1. 程式人生 > >KMP算法入門

KMP算法入門

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算法入門