【數據結構】KMP算法中的next數組解釋

博主說幾個重要的理解點,便於各位朋友理解next數組

 

解惑next數組的求解

一、先理解前綴後綴

如:abcdef

前綴爲:a,ab,abc,abcd,abcde    含頭不含尾。

後綴爲:bcdef,cdef,def,ef,f    含尾不含頭。

二、子串

如:abcdef

子串爲  a,ab,abc,abcd,abcde,abcedf

從左到右。

三、舉例

模式串:P = abctabcabctabct

P所代表的字符串數組,總計15個字符,數組下標 0 ~ 14.

 

重要點:前後綴的匹配需理解爲 對稱匹配。

Q:求P的next數組

我們先通過案例找一下規律。

 

問題:已知P[13] 對應的 next值,即next[13] = 7,求 p[14]所對應的next值,即求next[14]

首先記住一點,對稱性。即 ① 和 ②對稱。

其次記住,數組下標 0~ 14

最後記住一點,P[14] 的最大元素最多比p[13]多一個,因爲P[13] 對應的next值爲 7 ,所以 p[14] 對應的next值 最大爲8,這條一定要好好理解。

 那麼對於 p[14] 和 p[13] 的前綴後綴來說,已知 ① = ②,那麼 ④相當於 ②後面加個字符“t”(P[14]),那麼與此同時,③相對於①來說,也應該增加一位。即①後面加個字符“a”(P[7])

即最後 ③ 與 ④比較 等價於

①+P[7]  與 ②+P[14] 做比較,① = ② 那麼就是 P[7] 與P[14]比較,這裏的 數字 7 是什麼,是 P[13]對應的next值。

這裏是重要的一個知識點,大家多畫一下自己理解一下。

其實也很好理解,在P[13]時候 ① = ②,那麼當 ②後面增加一個字符後,①也得增加一個字符,然後再比較。那這時候 就是看 ①增加的字符和 ②增加的字符是不是相等。

那麼就可以知道。 對於 p[14] 所對應的next值來說,先判斷 p[14] 與 p[next[13]] 的關係,也就是p[14] 和 p[7] 的關係。

如果相等,那麼 next[14] = next[13] + 1

如果不相等。那麼進行下一步。

重要:重要:重要:

我們可以看到 p[14] != p[7]  這時候應該怎麼辦?   

首先:先記住 ① = ②

其次:①這個字符串,我們之前對其進行過前後綴的求值

①中  ⑤等於⑥。  ②中⑦等於⑧。① = ②。

可以推算出 ⑤ = ⑧

這裏有小夥伴會問爲什麼寫 ⑤等於⑧

大家想一想,對於P[14] 得出的next值是什麼,是前綴和後綴獲得。

⑧+第14位字符“t” 和 ⑤+第3位字符“t” 是不是一個P[14]是後綴 一個是 P[14]的前綴

 

那麼就相當於比較 P[14] 字符 和 P[3] 字符是否相等。這裏的 3 是什麼,是 P[7 - 1] 所對應的next值

 

這時候大家再對照一下代碼,我寫一下僞代碼

1、先得到 next[13] 的值,變量 K 代替,即 K = next[13] = 7

2、判斷 P[14]  和 P[K](即P[7])是否相等

3、如果相等,則next[14] = next[13]+ 1;如果不相等那麼 這時候 K = next[K - 1] 即 K = next[7 - 1] = next[6] = 3

4、判斷P[14] 和 P[K](即P[3]) 是否相等

5、相等 next[14] = next[6] + 1 = 4

OK  我們這時候從頭開始推算

a b c t a b c a b c t a b c t
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

K = 0

1、next[0] = 0;

2、next[1],判斷P[1] 和 P[K]的關係,即P[1] 和P[0],不相等,這時候 K = next[K - 1] = next[-1] 這種情況不應該出現,所以會需要有判斷K 與 0 的關係。暫時不表。結果: next[1] = K = 0

3、next[2],判斷P[2] 和 P[K] 的關係,即P[2] 和 P[0],不相等。結論 next[2] = K = 0

4、next[3],判斷P[3] 和 P[K] 的關係,即P[2] 和 P[0],不相等。結論 next[3] = K = 0

5、next[4],判斷P[4] 和 P[K] 的關係,即P[4] 和 P[0],相等。結論 next[4] = K + 1 = 1 ;同時 K =  K + 1 = 1

6、next[5],判斷P[5] 和 P[K] 的關係,即P[5] 和 P[1],相等。結論 next[5] = K + 1 = 2;同時 K = K+ 1 = 2;

7、next[14],判斷P[14] 與 P[K] 的關係,即P[14] 和 P[7],不相等,這時候 K = next[K - 1] = next[6] = 3,判斷P[14] 和 P[K]的關係,即P[14] 和 P[3],相等,next[14] = K + 1 = 3 + 1 = 4

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章