求nextval陣列值有兩種方法,一種是不依賴next陣列值直接用觀察法求得,一種方法是根據next陣列值進行推理,兩種方法均可使用,視更喜歡哪種方法而定。
本文主要分析nextval陣列值的第二種方法即:
記p = next[i] ;
將 s[i] 與 s[p] 進行比較:
1)二者相同,則,nextval[i] = next[p]
2)二者不同,則,nextval[i] = p
ps:
第一位netxval的值必為0.
1 2 3 4 5 6 7 8 序號a b a a b c a c 模式值
0 1 1 2 2 3 1 2 next陣列
0 1 0 2 1 3 0 2 nextval陣列
第一位的nextval值必定為0。
第二位如果與第一位相同則取相同值下的next值為0,如果不同則取當下next的值為1。
第三位的next值為1,那麼將第三位和第一位進行比較,均為a,相同,則,第三位的nextval值為0。
第四位的next值為2,那麼將第四位和第二位進行比較,不同,則第四位的nextval值為其next值,為2。
第五位的next值為2,那麼將第五位和第二位進行比較,相同,第二位的next值為1,則繼續將第二位與第一位進行比較,不同,則第五位的nextval值為第二位的next值,為1。
第六位的next值為3,那麼將第六位和第三位進行比較,不同,則第六位的nextval值為其next值,為3。
第七位的next值為1,那麼將第七位和第一位進行比較,相同,則第七位的nextval值為0。
第八位的next值為2,那麼將第八位和第二位進行比較,不同,則第八位的nextval值為其next值,為2。
三、next和nextval比較
next陣列的缺陷舉例如下:
比如主串是「aab…..」 省略號代表後面還有字元。
模式串「aac」
通過計算aac的next陣列為012(另外,任何字串的第二位字元的next總是1,因此你可以認為他固定為1)
當模式串在字元c上失配時,會跳到第2個字元,然後再和主串當前失配的字元重新比較,即此處用模式串的第二個a和主串的b比較
即 aab aac
顯然a也不等於b。然後 會跳到1,接著比,然後又失配,直到最後才使主串後移一位。
而「aac」的nextval陣列為002 當在c失配時會跳到2,若還失配就直接跳到0,比next陣列少比較了1次。
在如果模式串很長的話,那可以省去很多比較,因此你應該使用nextval陣列。
KMP演算法中改進的nextval陣列
我們在上篇文章中講到的next陣列其實再某些情況下是有缺陷的,例如在模式串s aaaab 和主串t aaabaaaab 匹配時,當在i 4,j 4時,產生失配,由下圖的next陣列中指出還需進行 i 4,j 3 i 4,j 2 i 4,j 1這三次比較。但是我們發現這樣的比較是沒有意義的,因為s串中...
kmp演算法中的nextval例項解釋
求nextval陣列值有兩種方法,一種是不依賴next陣列值直接用觀察法求得,一種方法是根據next陣列值進行推理,兩種方法均可使用,視更喜歡哪種方法而定。本文主要分析nextval陣列值的第二種方法a b a a b c a c 模式值 0 1 1 2 2 3 1 2 next陣列 0 1 0 2...
關於KMP演算法中next和nextval的演算法思路
就是比較從0到當前值減一是否有相同值 即正著看和倒著看對比 最後結果加一。直接上圖 求abaabc的next值和aabaabaabaac的next值 留乙個小問題可以自己試著做一下,串 ababaaababaa 的next值為011234223456。nextval根據next值求,如果x位置和ne...