KMP演算法中Next陣列的求法

2021-10-06 19:07:17 字數 1045 閱讀 9564

例如:

序列號 1  2  3  4  5  6  7  8 

模式串 a  b  a  a  b  c  a  c 

next值 0  1  1  2  2  3  1  2

next陣列的求解方法是:第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等為止,則這個位對應的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那麼需求的位上的next值即為1。

看起來很令人費解,利用上面的例子具體運算一遍

前兩位必定為0和1。

計算第三位的時候,看第二位b的next值,為1,則把b和1對應的a進行比較,不同,則第三位a的next的值為1,因為一直比到最前一位,都沒有發生比較相同的現象。

計算第四位的時候,看第三位a的next值,為1,則把a和1對應的a進行比較,相同,則第四位a的next的值為第三位a的next值加上1。為2。因為是在第三位實現了其next值對應的值與第三位的值相同。

計算第五位的時候,看第四位a的next值,為2,則把a和2對應的b進行比較,不同,則再將b對應的next值1對應的a與第四位的a進行比較,相同,則第五位的next值為第二位b的next值加上1,為2。因為是在第二位實現了其next值對應的值與第四位的值相同。

計算第六位的時候,看第五位b的next值,為2,則把b和2對應的b進行比較,相同,則第六位c的next值為第五位b的next值加上1,為3,因為是在第五位實現了其next值對應的值與第五位相同。

計算第七位的時候,看第六位c的next值,為3,則把c和3對應的a進行比較,不同,則再把第3位a的next值1對應的a與第六位c比較,仍然不同,則第七位的next值為1。

計算第八位的時候,看第七位a的next值,為1,則把a和1對應的a進行比較,相同,則第八位c的next值為第七位a的next值加上1,為2,因為是在第七位和實現了其next值對應的值與第七位相同。

next陣列求法和KMP演算法

首先介紹什麼是next陣列 定義 next i 表示是子串s 0 i 的最長相等前字尾的字首的最後一位下標。認真理解不難 下圖給出了next陣列的定義計算 其中下框第一行是字首,下框第二行是字尾 注意字首和字尾可以部分重疊但是不能使是s 0 i 本身 很好理解這是必然因為字首和字尾都是本身,比較毫無...

KMP演算法next求法

定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元 相同,且j的前面的1 k個字元與開頭的1 k 個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6 1,因t 3 t 6 3 ...

KMP中幾種Next陣列的求法

今天覆習到 kmp 演算法時候發現考研教材上的 next 陣列和我之前學的不一樣,所以特地拎出來比對一下,順便總結。因為我之前掌握的 kmp 是李煜東的 演算法競賽高階指南 上介紹的,而考研教材似乎更多用的是嚴蔚敏的 資料結構 c語言版 所以就對這兩種實現方式做整理。競賽版設 p i j 為模式串 ...