求nextval陣列值有兩種方法,一種是不依賴next陣列值直接用觀察法求得,一種方法是根據next陣列值進行推理,兩種方法均可使用,視更喜歡哪種方法而定。本文主要分析nextval陣列值的第二種方法
a b a a b c a c 模式值next陣列的缺陷舉例如下: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比較
比如主串是「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...