KMP算法是模式匹配專用算法。html
它是在已知模式串的next或nextval數組的基礎上執行的。若是不知道它們兩者之一,就無法使用KMP算法,所以咱們須要計算它們。算法
KMP算法由兩部分組成:數組
第一部分,計算模式串的next或nextval數組。設計
第二部分,利用計算好的模式串的nextval數組,進行模式匹配。htm
KMP算法中有next數組和nextval數組之分。 他們表明的意義和做用徹底同樣,徹底能夠混用。 惟一不一樣的是,next數組在一些狀況下有些缺陷,而nextval是爲了彌補這個缺陷而產生的。字符串
1、求解next程序設計
步驟:next數組值的程序設計求解方法:首先能夠確定的是第一位的next值爲0,第二位的next值爲1,後面求解每一位的next值時,根據前一位 進行比較。首先將前一位與其next值對應的內容進行比較,若是相等,則該位的next值就是前一位的next值加上1;若是不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等爲止,則這個位對應的值加上1即爲需求的next值;若是找到 第一位都沒有找到與前一位相等的內容,那麼需求的位上的next值即爲1。基礎
舉例:
模式串 a b a a b c a c
next值 0 1 1 2 2 3 1 2
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值對應的值與第七位相同。程序
2、求解nextval:方法
求nextval數組值有兩種方法,一種是不依賴next數組值直接用觀察法求得,一種方法是根據next數組值進行推理,兩種方法都可使用,視更喜歡哪一種方法而定。
本文主要分析nextval數組值的第二種方法:
模式串 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
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。
3、next和nextval比較
Next數組的缺陷舉例以下:
好比主串是「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數組。
4、嚴蔚敏
上:http://v.youku.com/v_show/id_XODYxNjExODQ=.html 第 34分鐘開始
下:http://www.56.com/u28/v_NjAwMzA0ODA.html