KMP模式匹配演算法 next值求解

2021-09-07 08:02:30 字數 1695 閱讀 1519

j 1 2 3 4 5 6 7 8 

模式串 a b a a b c a c 

next[j] 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

kmp演算法簡介

kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱kmp演算法)。kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next()函式,函式本身包含了模式串的區域性匹配資訊。時間複雜度o(m+n)。

求解next [ j ] 值的思路

j-1對應的串與next[ j-1]對應的串進行比較,若相等,則next[ j ]=next[j-1]+1;若不相等,則將j-1對應的串與next[ next [ j-1 ] ]對應的串進行比較,迴圈直到相等或與next[ 1 ]比較,若都不等,則為next函式中的其他情況。

例子在字串的kmp模式匹配演算法中,需先求解模式串的next函式值,其定義如下式所示,若模式串p為「aaabaaa」,則其next函式值為(  )。

求解:① next[1]=0,next[2]=1

② 第三位的next值:第2位的模式串為a ,對應的next值為1;將第二位的模式串a與第一位的模式串a進行比較,相等;則next[3]=1+1=2

③ 第四位的next值:第3位的模式串為a ,對應的next值為2;將第三位的模式串a與第二位的模式串a進行比較,相同,則next[4]=2+1=3

④ 第五位的next值:第四位的模式串為b,對應的next值為3;將第四位的模式串b與第三位的模式串a進行比較,不相等;第三位的a對應的next值為2,則將第四位的模式串b與第二位的模式串a進行比較,不相等;第二位的a對應的next值為1,則將第四位的模式串b與第一位的a進行比較,不相等,則next[5]=1(其他情況為1)(若第四位的模式串與第一位的進行比較相等,則next[5]=next[2]+1=1+1=2)

⑤ 第六位的next值:第五位的模式串為a,對應的next值為1;將第五位的模式串a與第一位的模式中a進行比較,相同,則next[6]=1+1=2

⑥ 第七位的next值:第六位的模式串為a,對應的next值為2;將第六位的模式串a與第二位的模式串a進行比較,相等;則next[7]=2+1=3

所以p對應的next值為0123123

KMP模式匹配演算法求next陣列

j12 3456 78值a baab cacnext01 1223 12j是字串中的位置 從1開始計算 值是字串對應j位置的字母,next是next陣列中的值。下面是計算方法 1 首先next 1 0,next 2 1 這兩個是固定不變的 2 除了j 1和j 2時,求解next j 首先我們要獲取到...

KMP演算法之求next 的值

求子串的next值,用next陣列存放,全部輸出 sample input abaabcac sample output 0 1 1 2 2 3 1 2 例如 模式串ab aabc acnext值01 1223 12nextval值 next陣列的求解方法是 第一位的next值為0,第二位的next...

串 KMP模式匹配演算法(next陣列)

include include include void get next char t 100 int next int index kmp char s 100 char t 100 int pos int main void get next char t 100 int next else ...