KMP演算法next求法
定義:
(1)next[0]= -1 意義:任何串的第一個字元的模式值規定為-1。
(2)next[j]= -1 意義:模式串T中下標為j的字元,如果與首字元
相同,且j的前面的1—k個字元與開頭的1—k
個字元不等(或者相等但T[k]==T[j])(1≤k<j)。
如:T=”abCabCad” 則 next[6]=-1,因T[3]=T[6]
(3)next[j]=k 意義:模式串T中下標為j的字元,如果j的前面k個
字元與開頭的k個字元相等,且T[j] != T[k] (1≤k<j)。
即T[0]T[1]T[2]。。。T[k-1]==
T[j-k]T[j-k+1]T[j-k+2]…T[j-1]
且T[j] != T[k].(1≤k<j);
(4) next[j]=0 意義:除(1)(2)(3)的其他情況。
舉例:
01)求T=“abcac”的模式函式的值。
next[0]= -1 根據(1)
next[1]=0 根據 (4) 因(3)有1<=k<j;不能說,j=1,T[j-1]==T[0]
next[2]=0 根據 (4) 因(3)有1<=k<j;(T[0]=a)!=(T[1]=b)
next[3]= -1 根據 (2)
next[4]=1 根據 (3) T[0]=T[3] 且 T[1]=T[4]
即
下標 |
0 |
1 |
2 |
3 |
4 |
T |
a |
b |
c |
a |
c |
next |
-1 |
0 |
0 |
-1 |
1 |
若T=“abcab”將是這樣:
下標 |
0 |
1 |
2 |
3 |
4 |
T |
a |
b |
c |
a |
b |
next |
-1 |
0 |
0 |
-1 |
0 |
為什麼T[0]==T[3],還會有next[4]=0呢, 因為T[1]==T[4], 根據 (3)” 且T[j] != T[k]”被劃入(4)。
02)來個複雜點的,求T=”ababcaabc” 的模式函式的值。
next[0]= -1 根據(1)
next[1]=0
next[2]=-1 根據 (2)
next[3]=0 根據 (3) 雖T[0]=T[2] 但T[1]=T[3] 被劃入(4)
next[4]=2 根據 (3) T[0]T[1]=T[2]T[3] 且T[2] !=T[4]
next[5]=-1 根據 (2)
next[6]=1 根據 (3) T[0]=T[5] 且T[1]!=T[6]
next[7]=0 根據 (3) 雖T[0]=T[6] 但T[1]=T[7] 被劃入(4)
next[8]=2 根據 (3) T[0]T[1]=T[6]T[7] 且T[2] !=T[8]
即
下標 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
T |
a |
b |
a |
b |
c |
a |
a |
b |
c |
next |
-1 |
0 |
-1 |
0 |
2 |
-1 |
1 |
0 |
2 |
只要理解了next[3]=0,而不是=1,next[6]=1,而不是= -1,next[8]=2,而不是= 0,其他的好象都容易理解。
03) 來個特殊的,求 T=”abCabCad” 的模式函式的值。
下標 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
T |
a |
b |
C |
a |
b |
C |
a |
d |
next |
-1 |
0 |
0 |
-1 |
0 |
0 |
-1 |
4 |
next[5]= 0 根據 (3) 雖T[0]T[1]=T[3]T[4],但T[2]==T[5]
next[6]= -1 根據 (2) 雖前面有abC=abC,但T[3]==T[6]
next[7]=4 根據 (3) 前面有abCa=abCa,且 T[4]!=T[7]
若T[4]==T[7],即T=” adCadCad”,那麼將是這樣:next[7]=0, 而不是= 4,因為T[4]==T[7].
下標 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
T |
a |
d |
C |
a |
d |
C |
a |
d |
next |
-1 |
0 |
0 |
-1 |
0 |
0 |
-1 |
0 |
如果你覺得有點懂了,那麼
練習:求T=”AAAAAAAAAAB” 的模式函式值,並用後面的求模式函式值函式驗證。
意義:
next 函式值究竟是什麼含義,前面說過一些,這裡總結。
設在字串S中查詢模式串T,若S[m]!=T[n],那麼,取T[n]的模式函式值next[n],
1. next[n]= -1 表示S[m]和T[0]間接比較過了,不相等,下一次比較 S[m+1] 和T[0]
2. next[n]=0 表示比較過程中產生了不相等,下一次比較 S[m] 和T[0]。
3. next[n]= k >0 但k<n, 表示,S[m]的前k個字元與T中的開始k個字元已經間接比較相等了,下一次比較S[m]和T[k]相等嗎?
4. 其他值,不可能。