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進行思考後,我...