KMP演算法的next函式詳解

2021-07-28 04:31:36 字數 787 閱讀 2055

不得不說,kmp的next函式是在是難以理解,智商拙計。在幾天的斷斷續續理解之後一度想放棄,在得知了它的別名看毛片後重新提起了興趣。

kmp演算法理解的難點在於next遞推的理解,也就是說當next[j] = k的時候,如何求出next[j+1]的值。

先解釋一下next[j] = k的意義。這說明在子串中該j位置前,有乙個從頭開始向後k長度的序列,與從尾部開始向前k長度的序列完全相同,且不存在k'>k,即k是長度最大的。有了這個next[j]之後,在匹配的時候前面的k序列無法繼續匹配時,可直接將子串向後滑動,這時使尾部向前看的k序列替代之前從頭開始的那部分k序列,即可利用到之前匹配的資訊,指向母串的指標也不需要回溯。

要求next[j+1],則分為兩種情況

1.字首k序列的下乙個字元和字尾的k序列的下乙個字元相同

不用解釋,next[j+1]=k+1;

2.字首k序列的下乙個字元和字尾的k序列的下乙個字元不相同

則我們將字首k序列和字尾的k序列進行拆分,因為他們也是有自己的字首和字尾序列k11和k12的,這時候,其實比較的是字首k的字首即k11和字尾k的字尾k12的,他們肯定相同,那麼只需要比較k11的下乙個字元和k12的下乙個字元(也就是字尾的k序列的下乙個字元)。如果相同那麼可以知道,next[j] = next[next[k]]+1;如果不同則繼續迭代,直到迭代到第乙個字元。

void next(int *next, char *p) //定義next陣列和模式串p 

if (p[k] == p[i-1])

k++;  

next[i] = k;  

}  }  

kmp演算法next例題 KMP演算法next陣列求解

kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...

KMP演算法中的next函式

kmp演算法詳解看 next i 表示當模式串t i 與主串失配時,模式串的索引回溯到next i 主串的索引不變 下面串的下標均從0開始 1 i 0 next i max k 0 k 證明模式串next函式的可行性 當t i 與 s j 失配時,即 t i s j 時 可得t 0.i 1 s j ...

KMP演算法中next函式的解析

今天花了半天的時間,終於把kmp演算法中的next函式整明白了 先看看next資料值的求解方法 位序 1 2 3 4 5 6 7 8 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2next陣列的求解方法是 1.第一位的next值為0 2.第二位的next值為1 後...