kmp演算法是一種改進的模式匹配演算法,與樸素的模式演算法(即模式串與主串逐一匹配,匹配失敗模式串整體右移一位再次逐一匹配至完全匹配成功)相比,主串中指標無需回溯,時間複雜度為o(n+m),n為主串長,m為模式串長(樸素為o(n*m))。
一、next陣列kmp演算法中多了乙個next陣列,要用kmp演算法進行模式匹配,首先應計算出模式串s的next[ ]。
手工求解next[ ]方法:
編號模式串從1開始
①next[1]=0,next[2]=1。
②令k=next[j-1](從第3個字元開始);
③比較s[j-1]與s[k]:
a.相等,則該元素的next[j]=k+1;
b.不等,令k=next[k],若k不等於0繼續③,若k等於0,該元素next[j]=1。
舉例:求模式串s=『alibaba』的next陣列
(1)next[1]=0,next[2]=1
(2)當j=3時,k=next[j-1]=next[2]=1
s[j-1]=s[2]=l,s[k]=s[1]=a不等,
所以k=next[k]=next[1]=0,即next[3]=1;
(3) j=4時,next[4]=1;
當j=5時,next[5]=1;
當j=6時,k=next[5]=1,
s[5]=a,s[1]=a,相等
所以next[6]=k+1=2
當j=7時,next[7]=1
二、匹配過程
匹配過程是在next[ ]基礎上,這裡用例子說明,沿用上面的模式串s。
方法:比較主串與模式串對應位置是否匹配(這裡分別用i,j表示),若匹配則比較下乙個位置(即比較i+1,j+1);若不匹配則找到模式串相應元素的next[j],i不變,令匹配從主串的i和模式串j=next[j]繼續。若next[ ]為0,匹配i+1和j=1。重複至完全匹配。
假設主串m=『abalibabahy』,模式串s=『alibaba』.
(1)始化:i=1,j=1
比較m[1]與s[1],匹配,i和j自動加1
(2)i=2,j=2
比較m[2]和s[2],不匹配,i不變,j=next[2]=1
(3)i=2,j=1
比較m[2]和s[1],不匹配,i不變,j=next[1]=0;i=i+1=3,j=j+1=1
(4)i=3,j=1
比較m[3]和s[1],匹配,i=i+1,j=j+1
匹配成功。
[1] 王道論壇. 資料結構 . 北京:電子工業出版社,2018
[2] 嚴蔚敏. 資料結構. 北京:清華大學出版社,2012
[3] 率輝.資料結構高分筆記. 北京:機械工業出版社,2018
初學KMP演算法
從書上看完kmp之後發現還是有部分不懂,發現kmp比樸素演算法強在不用次次回溯,可以通過向後延伸來進行比較,另外,kmp的演算法改進版nextval還不是特別理解,明天繼續看。簡述求解next 先寫出maxl 通過標出標號對t串進行標記從1開始 頭和尾重合幾個maxl就寫幾 就像這樣,當序號為1時,...
KMP演算法初學next陣列
參考 講解的很詳細 乙個字串的字首是指包含該字元第乙個字母的連續子串,例如 abcd的所有字首為a,ab,abc,abcd。給出乙個字串s,求其所有字首中,字元長度與出現次數的乘積的最大值。例如 s abababa 所有的字首如下 a 長度與出現次數的乘積 1 4 4,ab 長度與出現次數的乘積 2...
KMP演算法詳解 適合初學KMP演算法的朋友
相信很多人 包括自己 初識kmp演算法的時候始終是丈二和尚摸不著頭腦,要麼完全不知所云,要麼看不懂書上的解釋,要麼自己覺得好像心裡了解kmp演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...