kmp演算法中的nextval例項解釋

2022-06-19 16:15:11 字數 1801 閱讀 6222

求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 1 3 0 2 nextval陣列

1.第一位的nextval值必定為0,第二位如果於第一位相同則取相同值下的next值為0,如果不同則取當下next的值為1。

2.第三位的next值為1,那麼將第三位和第一位進行比較,均為a,相同,則,第三位的nextval值為0。

3.第四位的next值為2,那麼將第四位和第二位進行比較,不同,則第四位的nextval值為其next值,為2。

4.第五位的next值為2,那麼將第五位和第二位進行比較,相同,第二位的next值為1,則繼續將第二位與第一位進行比較,不同,則第五位的nextval值為第二位的next值,為1。

5.第六位的next值為3,那麼將第六位和第三位進行比較,不同,則第六位的nextval值為其next值,為3。

6.第七位的next值為1,那麼將第七位和第一位進行比較,相同,則第七位的nextval值為0。

7.第八位的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陣列。

四、嚴蔚敏

上:     第 34分鐘開始 

下:     

五、**實現:

public static void main(string args) throws ioexception

public static int kmp_test(char s, char t)else

}system.out.println(i);

if(j

return 0;

}else

}public static int next(char t)

else

j = next[j];

}system.out.println(arrays.tostring(next));

return next;

}對於改進的kmp演算法,只需要把next函式換為nextval函式就行了

public static int next(char t) else  

}else

j = next[j];

}system.out.println(arrays.tostring(next));

return next;

}

kmp演算法中的nextval

求nextval陣列值有兩種方法,一種是不依賴next陣列值直接用觀察法求得,一種方法是根據next陣列值進行推理,兩種方法均可使用,視更喜歡哪種方法而定。本文主要分析nextval陣列值的第二種方法即 記p next i 將 s i 與 s p 進行比較 1 二者相同,則,nextval i ne...

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演算法中next和nextval的演算法思路

就是比較從0到當前值減一是否有相同值 即正著看和倒著看對比 最後結果加一。直接上圖 求abaabc的next值和aabaabaabaac的next值 留乙個小問題可以自己試著做一下,串 ababaaababaa 的next值為011234223456。nextval根據next值求,如果x位置和ne...