KMP算法求next數組和nextval數組的簡單方法

next數組的求解方法是:

next數組的求解方法是:第一位的next值爲0,第二位的next值爲1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等爲止,則這個位對應的值加上1即爲需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那麼需求的位上的next值即爲1。 
看起來很令人費解,利用上面的例子具體運算一遍。 1.前兩位必定爲0和1。 
2.計算第三位的時候,看第二位b的next值,爲1,則把b和1對應的a進行比較,不同,則第三位a的next的值爲1,因爲一直比到最前一位,都沒有發生比較相同的現象。 
3.計算第四位的時候,看第三位a的next值,爲1,則把a和1對應的a進行比較,相同,則第四位a的next的值爲第三位a的next值加上1。爲2。因爲是在第三位實現了其next值對應的值與第三位的值相同。 
4.計算第五位的時候,看第四位a的next值,爲2,則把a和2對應的b進行比較,不同,則再將b對應的next值1對應的a與第四位的a進行比較,相同,則第五位的next值爲第二位b的next值加上1,爲2。因爲是在第二位實現了其next值對應的值與第四位的值相同。 
5.計算第六位的時候,看第五位b的next值,爲2,則把b和2對應的b進行比較,相同,則第六位c的next值爲第五位b的next值加上1,爲3,因爲是在第五位實現了其next值對應的值與第五位相同。 
6.計算第七位的時候,看第六位c的next值,爲3,則把c和3對應的a進行比較,不同,則再把第3位a的next值1對應的a與第六位c比較,仍然不同,則第七位的next值爲1。 
7.計算第八位的時候,看第七位a的next值,爲1,則把a和1對應的a進行比較,相同,則第八位c的next值爲第七位a的next值加上1,爲2,因爲是在第七位和實現了其next值對應的值與第七位相同。 

切記:始終是與當前所求next的前一位來比較,若相同就+1,若不同則繼續用對應的next來找,如果始終不相同則爲1,代表例子

ababaabab的next爲011234234

 模式串

 a

 b

 a

 a

 b

 c

 a

 c

 next

 0

 1

 1

 2

 2

 3

 1

 2

 nextval

 0

 1

 0

 2

 1

 3

 0

 2


nextval數組的求解方法是:

nextval[1]=0。從第二位開始,若要求nextval[i],將next[i]的值對應的位的值與i的值進行比較(例如,第i爲的值爲'b',next[i]=3,則將i的值'b'與第三位的值進行比較),若相等,nextval[i]=nextval【next[i]】(例,nextval[i]=nextval[3]);若不相等,則nextval[i]=next[i](例,nextval[i]=next[i]=3)。

1.第一位的nextval值必定爲0,第二位如果與第一位相同則爲0,如果不同則爲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。

切記:開始兩位若相同則nextval爲0,若不同則爲1.在求nextval是若當前值與當前next所對應的值不相同則直接爲當前next值,若相同則繼續查找對應的next,直到完全找完則爲0.如

ababaabab對應的next爲011234234,對應的nextval爲010104101
可在“aaaab”內進行驗證:

 模式串

 a

 a

 a

 a

 b

 next

 0

 1

 2

 3

 4

 nextval

 0

 0

 0

 0

 4



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章