KMP字串模式匹配詳解 二

2021-08-29 17:33:06 字數 3243 閱讀 2199

.怎麼求串的模式值next[n]

定義: (

1)next[0]= -1 

意義:任何串的第乙個字元的模式值規定為-1。

(2)next[j]= -1  

意義:模式串

t中下標為

j的字元,如果與首字元

相同,且

j的前面的

1—k個字元與開頭的

1—k

個字元不等(或者相等但

t[k]==t[j])(1

≤k)。 如:

t=」abcabcad」

則next[6]=-1

,因t[3]=t[6] (

3)next[j]=k   

意義:模式串

t中下標為

j的字元,如果

j的前面k個

字元與開頭的

k個字元相等,且

t[j] != t[k] (1

≤k)。 即

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);

(4) next[j]=0  

意義:除(1)(

2)(3)的其他情況。

舉例: 01

)求t=「

abcac

」的模式函式的值。

next[0]= -1 

根據(1)

next[1]=0  

根據(4)   因(3

)有1<=k不能說,

j=1,t[j-1]==t[0]

next[2]=0  

根據(4)   因(3

)有1<=k(

t[0]=a)!=

(t[1]=b)

next[3]= -1 

根據(2)

next[4]=1  

根據(3) t[0]=t[3]

且t[1]=t[4] 即

下標 0

1 23 4

t ab c

a cnext -1

0 0-1 1

若t=「

abcab

」將是這樣: 下標

0 12 3

4 ta b

c ab

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 23 4

5 67 8

t ab a

b ca a

b cnext -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 12 3

4 56 7

t ab c

a bc a

dnext -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=」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表示

,s[m]的前k

個字元與

t中的開始

k個字元已經間接比較相等了,下一次比較

s[m]

和t[k]

相等嗎? 4.

其他值,不可能。

KMP字串模式匹配詳解

kmp字串模式匹配詳解 kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為o m n kmp匹配演算法。可以證明它的時間複雜度為o m n 一.簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t in...

KMP字串模式匹配詳解

簡單匹配演算法的時間複雜度為o m n kmp匹配演算法時間複雜度為o m n 一 簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t int pos if else k next k while get nextval 另一種寫法,也差不多。voi...

KMP字串模式匹配詳解

kmp字串模式匹配詳解 kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為 o m n kmp 匹配演算法。可以證明它的時間複雜度為 o m n 一.簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t...