串的模式匹配KMP演算法

2021-09-14 02:45:18 字數 2109 閱讀 6982

主要基於2019王道資料結構p268-272、2019天勤資料結構p95-101頁的講解,自己整理出來的一套手動計算next陣列值、nextval陣列值的方法

以下使用的例子是2019王道資料結構p270-271的例子編號1

2345

678字元sab

aabc

acnext01

1223

12nextval01

0213

021.求next

列的3-8是指編號j字元的與原來的字元比較,編號1和2的,直接給定next[1]=0,next[2]=1

①j=3時,比較編號2和1的字元,即b和a,不等,則看next[1]=0,遇到0則是比較到頭了,next[j]=1即next[3]=1

②j=4時,比較編號3和1的字元,即a和a,相等,則next[4]=next[3]+1=2

③j=5時,比較編號4和2的字元,即a和b,不等,則看next[2]=1;比較編號4和1,即a和a,相等,next[5]=next[1]+1=2

④j=6時,比較編號5和2的字元,即b和b,相等,則next[6]=next[5]+1=3

⑤j=7時,比較編號6和3的字元,即c和a,不等,則看next[3]=1;比較編號6和1,即c和a,不等,則看next[1]=0,遇到0則是比較到頭了,next[j]=1即next[7]=1

⑥j=8時,比較編號7和1的字元,即a和a,相等,則next[8]=next[7]+1=2

如a21只是為了方便記錄過程,表示的是所寫這一列的後一列即j=3的時候求next的過程,j=3的時候看的是j=2這一列,next[2]=1,所以比較編號2和1的字元,編號1的字元是a故記錄a21,和上方的b比較。其實kmp是自己和自己比,但也可以看成是兩個一模一樣的字串的比較。

2.求nextval

nextval[0]=0是直接給定的

①j=2時,s[2]=b,s[next[2]]=s[1]=a,不等,nextval[2]=next[2]=1

②j=3時,s[3]=a,s[next[3]]=s[1]=a,相等,nextval[3]=next[next[3]]=next[1]=0,已經追溯到1位置

③j=4時,s[4]=a,s[next[4]]=s[2]=b,不等,nextval[4]=next[4]=2

④j=5時,s[5]=b,s[next[5]]=s[2]=b,相等,nextval[5]=next[next[5]]=next[2]=1,已經追溯到2位置,步驟①證明2位置無法再往前追溯

⑤j=6時,s[6]=c,s[next[6]]=s[3]=a,不等,nextval[6]=next[6]=3

⑥j=7時,s[7]=a,s[next[7]]=s[1]=a,相等,nextval[7]=next[next[7]]=next[1]=0,已經追溯到1位置

⑦j=8時,s[8]=c,s[next[8]]=s[2]=b,不等,nextval[8]=next[8]=2

如步驟⑥,若從7位置追溯到5位置,5位置還能追溯到3位置,3位置才不能在往前追溯,那麼nextval[7]=next[3]

KMP 模式串匹配演算法

這兩天讀了july的kmp,覺得很受益,寫下以作備忘。kmp最重要的就是求出next陣列,而next陣列則是通過不斷比較 str2 k 與 str2 j 來確定下乙個字元對應的 next數值 相等則直接next j k 不相等則令k next k 進行遞推直到出現 str2 k str2 j 相等的...

串 KMP模式匹配演算法

樸素模式匹配演算法就是簡單的二重迴圈,第一重迴圈主串s從1到n,然後第二重迴圈子串t從1到m進行匹配判斷,時間複雜度為o n m 1 m kmp演算法的核心思想是 第一 如果子串前r個字元均不相等,且子串前r個字元與主串某連續的r個字元匹配,但子串第r 1就不匹配了,則主串的匹配下標可以直接向前跳r...

模式串匹配 KMP演算法

kmp是對字首暴力搜尋的改進,基於的想法其實是很樸素的。首先我們來看一下暴力搜尋。char bf char src,char pattern else if pattern temp 0 return src else return null 如果匹配失敗,則將關鍵字向右滑動乙個字元,從頭開始匹配關...