1. 程式人生 > >KMP演算法next求法

KMP演算法next求法

定義

1next[0]= -1  意義:任何串的第一個字元的模式值規定為-1

2next[j]= -1   意義:模式串T中下標為j的字元,如果與首字元

相同,且j的前面的1—k個字元與開頭的1—k

個字元不等(或者相等但T[k]==T[j])(1k<j)。

如:T=”abCabCad”  next[6]=-1,因T[3]=T[6]

3next[j]=k    意義:模式串T中下標為j的字元,如果j的前面k

字元與開頭的k個字元相等,且T[j] != T[k] 1k<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].1k<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    

根據(4)

         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,而不是=1next[6]=1,而不是= -1next[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.       其他值,不可能。