exkmp


擴展kmp

                              廣饒一中二校區李儒昊

所謂擴展kmp指的是與kmp相似的求輔助數組的原理,但是本身與kmp關系不大。

1.exkmp的用途:給定一個主串s和一個子串t,求出s中每一個后綴和子串t的最長公共前綴。

2.算法推導:

給定一個主串:S=aaaaaaaaaabaaa

              T=aaaaaaaaaaa

(下標都是從零開始!!!)

                 第一步

需要有兩個輔助數組:extand[i]和next[i];

extand[i]:表示主串S以i開始的后綴與子串T的最長公共前綴。

next[i]:表示子串T中以i開始的后綴與子串本身的最長公共前綴。

 

首先看這個樣例,很顯然extend[1]=10。然后要求extend[2]。如果暴力求的話還要再用每個字符比較一遍太過麻煩。那么已經求得的extend[1]是不是可以利用呢?

通過求得的extend[1]我們已經知道了:S[1...10]=T[1…10](不知道為什么的看定義去)。那么S[2..10]=T[2…10]。再算extend[2]時很明顯extand[1]是沒有用的,所以要從S[2]匹配。於是我們就要再引入一個數組next[i]。根據定義:

因為next[2]=9;

所以T[211]=T[110]

所以T[210]=T[19](都刪去一個字符)

所以T[19]=S[210]

所以extand[2]就等於9啊!!!多么神奇啊!

第二步

求完extand[2]后就可以知道這種求法原理是一種遞推的。那么下面我們拋開特殊來看一般

我們假設extand[1…k]已經求好(就像剛剛那個extand[1]已經求好一樣)。並且,在以前匹配過程中在S當中所匹配到的最遠位置是p那么這個最遠的位置是不是就是i+extand[i]-1?(當前位置+匹配長度-1=匹配到的末端位置),其中i=1…k。不妨取這個最遠的位置所對應的i是a很顯然這個a是比p要小的。那么根據定義就可以推出            S[ap]=T[1p-a+1];

所以 S[k+1p]=T[k+a+2p-a+1](都刪去一段字符)

我們再定義一個L,另L= extand[k-a+2](注意:這是定義的,不要老是糾結他究竟是為了什么,不然會很痛苦!!!這個會用到的。)

那么根據L就可以推導出:T[1L]=T[k-a+2k+L-a+1]

相信看到這里大多數人都已經懵逼了,那我們還是先回想一下next數組的定義,然后畫個圖就能懂了:

 

是不是已經懂了?這是next數組的一個性質,前面在推extand[2]的時候應經用了。

                     第三步

現在就出現了兩種情況:

(一) k+L<p

 

圖中紅色的區域一定是相等的,即S[k+1k+1+L]=T[1L]

因為前面已經推導過T[1L]=T[k-a+2k+L-a+1](1)

並且S[k+1p]=T[k+a+2p-a+1](2)   p>k+L

所以(1)式的右端點在(2)式右端點的左邊。

所以 多出來的那塊=(p-a+1)-(k+L-a+1)

再用p-[(p-a+1)-(k+L-a+1)]+1=k+L+1!

所以就推出了S[k+1k+L+1]=T[1L]

那么就可以知道藍色的部分一定不會相等(因為L=extend[k-a+2]呀,如果相等的話那extend[k-a+2]不就等於L+1甚至更大了嗎?)

為什么k+L不能=p?  因為小於p時p之前一定存在一個字符與T[L+1]不匹配(圖中藍色區域)。如果等於p,那就無法判斷下一位是否不匹配了。

所以我們就得出了extend[k+1]=L,就求出來了!

(二) k+L>=p

 

明白了第一種,這種情況就比較通俗易懂啦!

上圖的紫色部分是未知的,紅色部分是已經匹配的。因為在計算extend[1…k]時達到的最遠位置是p,所以p之后的的位置無法訪問。那怎么辦?問我??這還用說:暴力求啊!

從S[p+1]和T[p-k+1]開始匹配不就完啦?之后更新extend[a]+a和extend[k+1]+k+1的大小,后者的就更新最遠位置p然后,,,就沒有然后了!!!!

那么next數組怎么求呢?其實next數組就是一個以T為主串,T為字串的一個特殊的擴展kmp!用上文介紹的相同算法計算next數組即可。

唉!這就完了。寫了整整一個晚上,因為下午剛學,連推公式帶迷茫的痛苦了三個小時,終於完成了再附一個代碼:

 

Return 0!!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM