KMP演算法中的next函式

2021-05-26 18:04:52 字數 1029 閱讀 5388

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-i...j-1 ]          式1

令k=next[i].由式1可得

t[ i-k...i-1 ] = s[ j-k...j-1 ]       式2

又因為t[ 0...k-1 ] = t[ i-k...i-1 ]        式3

由式2和式3可得

t[ 0...k-1 ] = s[ j-k...j-1 ]        結論

由結論可知,當t[i] 與 s[j]失配時,模式串的前k(next[i]的值)個字元與主串中在j之前的k個字元相等。因為串的下標從0開始,所以模式串t[i]與主串s[j]失配時,回溯的位置正好是k.

所以模式串的索引只需從i回溯到next[i],即上文的k. 而主串的索引j保持不變,然後模式串從next[i]開始於主串從j開始嘗試匹配。

從而達到了一種效果,主串的索引不需要回溯,需要回溯的只是模式串的索引。

假如模式串t為:abaabcac 則它對應的next值為

假如模式串t為:abababa。則它對應的next值為

在沒有修正的情況下

假如當模式串t為:abababa.那麼t[3] 與 主串失配時,模式串的索引回溯到1,然而t[1] == t[3] = 'b',所以t[1] 與 主串必然失配,所以這個回溯是沒有意義的。

修正後,在確定next[i]是否為k之前,做以下的判斷

若t[i] != t[j], 那麼 next[i] = k

若t[i] == t[j], 那麼 next[i] = next[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 後...

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 2 next陣列的求解方法是 1.第一位的next值為0 2.第二位的next值為1 ...

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

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