KMP演算法中計算next值和nextval的值

2021-10-01 18:35:51 字數 1321 閱讀 6032

書上關於next和nextval的修正值方法比較難理解,所以我這裡講解自己的方法。這裡我就不介紹關於字串匹配中kmp的優點,也不強調next的修正值比next的值好在哪,我們就說方法就行了。

來,首先給我們乙個序列j1

2345

678模式串ab

aabc

acnext[j]01

1223

12首先我給出乙個大的方法,然後按照這個方法一一展示求解的過程。

預設第乙個和第二個字元的next值為0、1。那麼從第三個開始依次執行如下操作:

找到當前要求next字元的前乙個,以它為標準,找到其next對應下標的字元,和這個字元做比較。若相等,那麼當前字元的next值就位此字元next加一;若不等,繼續找現在字元next所指的下乙個字元,還是和之前的字元比較,直到找到第乙個位置為止,那麼next為1。

a,bnext值為0,1

要求next[3],那麼我看3的前面的字元b,b的next值指的下標為第一位,第一位字元和b不相等,而且已經指到了最後一位,那麼next[3]的值就1.

要求next[4],那麼看前乙個字元a,a的next所指的下標為第一位,第一位的字元和a相等,那麼當前next[4]值就為next[3]+1=2

要求next[5],那麼看前乙個字元a,a的next所指的下標為第二位,第二位的字元和a不相等,那麼我們看第二位next所指的字元是第一位,第一位的字元與a相等,所以next[5]=next[2]+1=2

依次類推即可。j1 

2345

模式串aaa

abnext[j]01

234nextval[j]0 0

00在求出next的值的基礎上,求nextval的方法其實很簡單。預設第乙個nextval的值是0,第二個字元如果和第乙個字元相等,那麼它的nextval的值就為0,不等就為1。之後遵循如下方法:

找到當前要求nectval值的字元,看它的next值下標所指向的字元是否和它相等,相等那麼nextval為當前所指下標的nextval值,不相等nextval的值就為本身字元的next值。

第乙個nextval值預設是0,第二個和第乙個相等,所以也是nextval值也是0

第三個字元next所指的字元是2號位置的a,和它相等,那麼nextva[3]的值就位nextval[2]得值,即為0

第四個字元next所指的字元是三號位置的a,和它相等,所以nextval的值就為3號位置的nextval值,即為0

第五個字元的next所指的字元是四號位置的a,和它不相等,那麼nextval的值就是它自己的next的值,即為4

依次類推即可

KMP演算法next計算

kmp演算法是在最近這兩年的軟體設計師考試中才出現的。2次都是讓求next函式的序列 其實是 先看看題吧。2011年下半年上午題 2012年上半年上午題 其實做這個題很簡單,我先說說這個題裡的各種概念。給定的字串叫做模式串t。j表示next函式的引數,其值是從1到n。而k則表示一種情況下的next函...

KMP演算法next值的求解

求next函式值的過程本身是乙個遞迴過程,分析如下 next 7 2,存在t 6 t 1 k 1 t 7 t 2 t 6,7 t 1,2 next 8 3 t1 t3 已知 next 1 0 假設 next j k 又t j t k 則 next j 1 k 1 若 t j t k 則需要往前朔,檢...

kmp程式計算next和改進的next

include include includeusing namespace std int next 100 1 val 1 此時意味著主串和子串的下標都需要加1 2 val 中的任意值,k為正在比較的第k個字元,也就是說當他們不相等時,需要回溯到val繼續比較 void get next cha...