KMP演算法next求法

2021-07-31 04:11:24 字數 2551 閱讀 9032

定義

(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 2

3 4

t a

b c

a c

next -1

0 0-1 1

若t=「abcab」將是這樣:下標0

1 23 4

t ab c

a bnext -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 34 5

6 78 t

a ba b

c aa 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

1 23 4

5 67 t

a bc a

b ca 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表示,s[m]的前k個字元與t中的開始k個字元已經間接比較相等了,下一次比較s[m]和t[k]相等嗎?

4.       其他值,不可能。

next陣列求法和KMP演算法

首先介紹什麼是next陣列 定義 next i 表示是子串s 0 i 的最長相等前字尾的字首的最後一位下標。認真理解不難 下圖給出了next陣列的定義計算 其中下框第一行是字首,下框第二行是字尾 注意字首和字尾可以部分重疊但是不能使是s 0 i 本身 很好理解這是必然因為字首和字尾都是本身,比較毫無...

KMP演算法中Next陣列的求法

例如 序列號 1 2 3 4 5 6 7 8 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 next陣列的求解方法是 第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,...

kmp演算法next例題 KMP演算法next陣列求解

kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...