kmp演算法中的nextval

2021-09-24 12:51:27 字數 1333 閱讀 2678

求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...