KMP演算法的理解

來源:互聯網
上載者:User

標籤:

  這麼有名的串模式比對演算法,在此不作詳細介紹了。如果有不瞭解的請看參考文獻的兩篇文章。

  這裡,我只準備介紹一下該演算法核心next數組的含義(怎麼求,相關部落格也很詳細)。很多文章介紹next數組的時候,一上來會介紹字串首碼和尾碼的概念,我這裡也提一下。給定一個字串T[0...n],其首碼有:T[0], T[0,1], ..., T[0...n-1],其尾碼有:T[1], T[1,2], ..., T[1...n]。

  既然是串匹配,則必然會有目標串和模式串,當然目標串的長度要比模式串大。這些基礎知識在此不再贅述。

  傳統暴力匹配演算法(所有介紹KMP演算法都會介紹,我在此不做闡述),一旦模式串和目標串發生失配時,模式串將回退至起始位置,目標串將回退至該輪比較起始位置的下一個位置(有點繞哈)。KMP演算法解決的問題是,失配發生時,確保目標串不發生回退,僅改變模式串的位置(有的文章也稱為滑動模式串)。

  設:目標串為S[0]S[1]...S[m],模式串為T[0]T[1]...T[n],m>n,現在處於如下匹配狀態:

                 ↓

  目標串:s[0]...s[i-j]...s[i-1]s[i]...s[m]

  模式串:    T[0]...T[j-1]T[j]...T[n]

                ↑

  即:目標串S[i]和模式串T[j]發生了失配,現在怎麼才能保持上面那個箭頭,也就是i不變呢?換句話說,S[i]下一次該與T[?]比較呢?我們做如下分析:

  要想模式串向前滑動一個位置,也就是S[i]與T[j-1]比較,我們要保證什嗎?我們必須要確保:

        T[0]T[1]...T[j-2] == T[1]T[2]...T[j-1]      (1),

  若(1)做不到,則必然會導致S[i]與T[j-1]之前就發生失配了。為什嗎?因為根據之前匹配,我們有:

        S[i-j]==T[0], S[i-j+1]==T[1], ... ,S[i-1]==T[j-1]  (2)

  模式串向前滑動一步,我們必須要保證:S[i-j+1]==T[0], S[i-j+2]==T[1], ... ,S[i-1]==T[j-2],才能將匹配進行到S[i]與T[j-1],綜合上述,我們必須確保(1)式成立,否則滑動沒意義;

  同樣的,要模式串向前滑動兩部,類似的,我們必須保證:T[0]T[1]...T[j-3] == T[2]T[3]...T[j-1]。——上述分析的這些,不都是T[0]T[1]...T[j]首碼和尾碼嗎?!

  因此,根據上面分析,我們不難得出下述結論:要確保目標串中指標不變,那麼下一個匹配的位置就是最大公用首碼的下一個元素。因為大多數語言數組索引以0開始,所以下一個位置就是最大公用首碼的長度了,對不對?於是,我們得到:

  失配發生時,有:下一個匹配位置 = k, T[0]T[1]...T[k-1] == T[j-k]T[j-k+1]...T[j-1] ,這個值定義為next[j],即

                next[j]=k  (3)

  那next[0]是什麼呢?它沒有首碼啊,這裡我們將其定義為next[0]=-1,為什麼這麼定義,我想可能是特殊處理吧!如果沒有公用前尾碼,此時next[j] = 0,這也是符合(3)式定義的。

  另外還有一種情況我們沒有討論,就是參考文獻[2]的最佳化部分:(3)式的得出沒有考慮T[k] != T[j]這種情況,如果出現這一情況,則可以進一步最佳化,有next[j] = next[k],這樣就進一步減少了比較。

  綜合上述,我們有next數組運算式如下:

  next[j] = { -1, j == 0;

       { k, T[0]T[1]...T[k-1] == T[j-k]T[j-k+1]...T[j-1], T[k] == T[j]

        {   next[k],  T[0]T[1]...T[k-1] == T[j-k]T[j-k+1]...T[j-1], T[k] != T[j]

       { 0,  others.

  關於next數組解釋至此為止,上述為個人學習總結,如有問題,請留言。時間緊張,故寫的比較簡單。

 

附:參考文獻:

[1]從頭到尾徹底理解KMP:http://blog.csdn.net/tukangzheng/article/details/38438481

[2]KMP串匹配演算法解析與最佳化:http://www.cnblogs.com/tr0217/p/4735279.html

  

KMP演算法的理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.