模式匹配之KMP演算法的理解(二)

2021-04-23 07:31:53 字數 1062 閱讀 7623

昨天說到了有公式

"p1p2.......p(k-1)"=

「p(j-k+1)p(j-k+2).......p(j-1)」.

觀察下該公式,這個等式是在模式串中存在的。很顯然接下來的工作主要就是在模式串中找到這樣的等式。模式串p中的pj(即模式串中的第j個字元)與主串中的si不匹配的時候,將比較si與模式串p中第k個pk字元比較。定義乙個陣列next[0......j-1].這個陣列的值next[j-1]=k表示模式串p中第j個字元的與主串字元si不匹配時應該將模式串移動的位置pk與si繼續比較。

根據這麼分析的話,就可以得出kmp的演算法如下:

typedef struct

sqstring;

int kmpindex(sqstring s,sqstring t)

else

j = next[j];

}if(j >=t.len)

m = i-t.len;

else

m =-1;

return m;

}        

下面說明next陣列過程,next的定義如下:

next[j]= max 此集合非空時

= -1 當 j = 0 時

= 0 其他情況

根據該定義  依次求next[j]的值。

定義next[0] =-1

next[j] = k;根據next[j] =k可以得出

p1p2.......p(k-1)"=

「p(j-k+1)p(j-k+2).......p(j-1),那麼現在計算next[j+1].當pk=pj時,則有next[j+1] = k +1 =next[j]+1;而當

pk!=pj時,

p1p2.......p(k-1)pk"!=

「p(j-k+1)p(j-k+2).......p(j-1)pj。那麼此時pk不匹配。則應該移動到next[k]處。如果繼續不匹配,則直至next[k] = 0

next陣列的求法如下:

void getnext(sqstring t, int next)

else

k =next [k];}}

模式匹配之KMP演算法

前面講到過bf演算法,雖然簡單,但是效率比較低,kmp演算法對此做了很大改進,該演算法是由knuth,morris,pratt同時設計的,所以簡稱kmp演算法 為什麼說bf演算法效率低呢?比如s 34343434345 t 345 在位置3時,s中字元為 3 t中為 5 不匹配,所以又重新從s中第2...

自我理解的KMP 演算法 模式匹配

首先,kmp最重要的是next 函式的設計,下面是next函式的原理 純手寫,可跳過不看,網上有比較抽象的理論,但是比較難以理解 下面是 部分,重點在於 get next 函式體 kmp模式匹配演算法 include include define substring len 50 子串長度為50 i...

模式匹配kmp演算法理解分析

首先說一下為什麼當出現不匹配後,i不變,而j變成next j 主串abcabdc 模式串abcabda。很明顯,當i j 7時,出現不匹配,如果用暴力演算法,i回到2。j回到1。其實為了匹配子串,從子串的第乙個到最後乙個都要匹配,我們從子串第乙個字元a可以從主串中看出,當i 1時,主串為a,而下一次...