KMP算法證實

看了不少網上的證實,它們的關注點都錯了,它們證實的是什麼呢?算法

x a1 a2 y b
x a1 a2 x c
複製代碼

失敗點是最後的b-c,而後c前面的x和開頭的x是相同的,這個x就是next[j]的那一段,KMP下次比較調整後爲:bash

x a1 a2 y b
        x a1 a2 x c
複製代碼

KMP算法是直接從ba1的比較開始,而須要比較yx了。這些文章的證實點就是xy是相等的,由於失敗點是b-c,這時就說明了xy是相等的了,這一點很容易看出來。spa

但問題是爲何能夠直接跳過這麼多位置呢?爲何移動一個位置來比較就必定會失敗呢? 這個纔是這個算法最須要證實的地方吧。就這個例子裏,爲何x不用和a1比?爲何不用和a2比呢?code

示例說明:字符串

源字符串source,簡稱S,是被匹配的字符串,模式串pattern,簡稱p,是較小的那個字符串。 對p有p1 p2 p3 p4 px py...,而後在px失敗了,這就意味着它以前p1-p4都是匹配到的,那假設S中對應的字符爲:p1 p2 p3 p4 s1 s2...,移動一位後:class

p1 p2 p3 p4 s1 s2...
   p1 p2 p3 p4 px py...

複製代碼

假如這個時候匹配成功,那麼就有p2 p3 p4 = p1 p2 p3,根據前面對next值的定義,這時對px它的next值就是3;next

next[i]值就是存在一個值k,使得(0, k-1)這一段跟(i-k+1,i)這一段是如出一轍的。移動

再日後移一位:copy

p1 p2 p3 p4 s1 s2...
   	  p1 p2 p3 p4 px py...

複製代碼

若是這時匹配成功,那麼p3 p4=p1 p2,那px的next值就是2。而若是咱們已經知道了px的next值爲1,就能夠判斷出這兩種狀況是不可能匹配成功的co

即匹配失敗後,每日後移動一步若是成功,都有一個對應的next值,並且這個next值是嚴格遞減的,因此知道實際的next值以後,更大的next就一定是不可能的,那麼以前的移動也就是不可能匹配成功的。

更小的有沒有可能? 有,由於next值是知足條件裏最大的那個,因此更小值它是可能知足條件的。但那就是下一次匹配以後的問題了,如今只是剔除掉一些絕對不可能的狀況。

相關文章
相關標籤/搜索