KMP演算法c 實現

2021-05-25 08:00:04 字數 768 閱讀 5734

遞推求解next陣列,初始的情況是next[0] = -1.

假設在某乙個時刻有如下的等式成立:str[0...k-1] = str[j - k...j - 1],那麼next[j] = k,在這個前提下,繼續進行下乙個字元的匹配.

1)如果str[0...k] = str[j - k...j],那麼next[j + 1] = next[j] + 1 = k + 1.

2)反之,如果上面的匹配不成立,那麼就要從next[k]開始進行新的匹配,如果成功的話,那麼:

next[j + 1] = next[next[j]] + 1 = next[k] + 1;

如果還是不能匹配成功就再從next[next[k]]的位置開始進行的新的匹配,直到匹配成功為止.如果這個過程一直進行下去都沒有找到可以成功匹配的字元的話,那麼next[j + 1] = 0,這時表示要從字串的第乙個位置開始新的匹配了.

用乙個公式表示上述的演算法,那麼可以寫作:

next[j] =

1)-1,當j = 0時;

2) max;

3)0,其他情況,此時匹配要從第乙個位置重新開始.

所以求解next陣列的演算法如下:

void get_next(const string &s, int next)

}int kmpcompare(const string &s, const string &t,int pos)

{int i,j = -1;

get_next(t,next);

for (i = pos; i **

KMP演算法C實現

這種演算法是d.e.knuth 與v.r.pratt和j.h.morris同時發現的,因此人們稱為kmp演算法。此演算法可以在o n m 的時間數量級上完成串的模式匹配操作。其基本思想是 每當匹配過程中出現字串比較不等時,不需回溯i指標,而是利用已經得到的 部分匹配 結果將模式向右 滑動 盡可能遠的...

KMP演算法C 實現

kmp演算法事模式匹配的高效演算法,很少,但是卻不是很容易理解。這幾天剛好做了一些這方面的調研,寫了乙個c 實現版本的kmp演算法,貼出來亮亮。其實kmp演算法最重要的部分是next陣列的計算方法,這裡有一篇講解得非常到位的文章 而再計算完next陣列之後實現模式的匹配就簡單多了,基本得策略與計算n...

c 實現KMP演算法

題目 首先讀進乙個包含10000個英文單詞的檔案,然後接受使用者輸入的模式字串,開始匹配檔案中該模式串出現了多少次。實現使用kmp實現,先根據模式串生成next陣列,然後在對每一行文字進行kmp匹配。將結果列印出來 include include include include using name...