我們在上篇文章中講到的next陣列其實再某些情況下是有缺陷的,例如在模式串s=』aaaab』和主串t=』aaabaaaab』匹配時,當在i=4,j=4時,產生失配,由下圖的next陣列中指出還需進行 i=4,j=3;i=4,j=2;i=4,j=1這三次比較。但是我們發現這樣的比較是沒有意義的,因為s串中前四個字元都相等,所以不需要逐個與主串中的第4個字元進行比較。
所以此時我們應該考慮直接進行i=5,j=1的比較,這就是說,在我們求出next[j]=k時,而模式串中s[j]=s[k],則當匹配字元s[i]和t[j]比較不等時,不需要再進行s[k]和t[j]的比較,而是直接和s[next[k]]比較,換句話說就是如果存在s[j]=s[k]那麼next[j]=next[k]。
在模式串中第一位固定有nextval[1]=0,第二位的next[2]應該為1,但是s[1]=s[2],所以我們取nextval[2]=nextval[1]=0,以此類推。
下面給出求nextval的演算法:
void get_nextval(sstring t,int nextval)
else
j=nextval[j];}}
改進的k m p演算法
前面的文章中講述k m p演算法的的基本實現,這裡提供 了改進後的k m p演算法的實現 手動驗算過,靠譜 相比於之前,就是在計算next值的同時多了一次比較,如果a位字元與它的next值指向的b位字元相等,則a位的nextva就指向b位的nextval,如果不相等,則該a位的nextval值就是它...
KMP及KMP改進演算法
kmp 看毛片 演算法確實很難理解,上網搜了半天想了很久才大概想明白。kmp演算法精華在於next陣列 部分匹配值 即next陣列就是 字首 和 字尾 的最長的共有元素的長度。以 abcdabd 為例,a 的字首和字尾都為空集,共有元素的長度為0 ab 的字首為 a 字尾為 b 共有元素的長度為0 ...
KMP演算法中計算next值和nextval的值
書上關於next和nextval的修正值方法比較難理解,所以我這裡講解自己的方法。這裡我就不介紹關於字串匹配中kmp的優點,也不強調next的修正值比next的值好在哪,我們就說方法就行了。來,首先給我們乙個序列j1 2345 678模式串ab aabc acnext j 01 1223 12首先我...