完全掌握KMP演算法思想

2021-03-31 08:56:31 字數 2159 閱讀 6434

學過資料結構的人,都對kmp演算法印象頗深。尤其是新手,更是難以理解其涵義,搞得一頭霧水。今天我們就來面對它,不將它徹底搞懂,誓不罷休。

如今,大夥基本上都用嚴蔚敏老師的書,那我就以此來講解kmp演算法。(小弟正在備戰考研,為了節省時間,很多課本上的話我都在此省略了,以後一定補上。

)嚴老的《資料結構》79頁講了基本的匹配方法,這是基礎。先把這個搞懂了。

80頁在講kmp演算法的開始先舉了個例子,讓我們對kmp的基本思想有了最初的認識。目的在於指出「由此,在整個匹配的過程中,i指標沒有回溯,」。

我們繼續往下看:

現在討論一般情況。

假設 主串:s: 『s(1)  s(2)  s(3) ……s(n)』 ;   模式串 :

p: 『p(1)  p(2)  p(3)…..p(m)』

把課本上的這一段看完後,繼續

現在我們假設 主串第i個字元與模式串的第j(j<=m)個字元『失配』後,主串第i個字元與模式串的第k(k個字元繼續比較

此時,s(i)≠p(j),  有

主串:s(1)……  s(i-j+1)…… s(i-1)   s(i) ………….

|| (相配)   ||       ≠(失配

)匹配串:p(1) …….  p(j-1)   p(j) 

由此,我們得到關係式

『p(1)  p(2)  p(3)…..p(j-1)』   =    』 s(i-j+1)……s(i-1)』

由於s(i)≠p(j),接下來s(i)將與p(k)繼續比較,則模式串中的前(k-1)個字元的子串必須滿足下列關係式,並且不可能存在k』>k  滿足下列關係式:(k

即:主串:

s(1)……s(i-k +1) s(i-k +2) ……s(i-1)     s(i) ………….

|| (相配)  ||           ||       ?(有待比較

)匹配串:p(1)      p(2)    …… p(k-1)    p(k)

現在我們把前面總結的關係綜合一下

有:s(1)…s(i-j +1)…  s(i-k +1) s(i-k +2)  ……    s(i-1)     s(i) ……

|| (

相配)||         ||               ||         ≠(失配

)p(1) ……p(j-k+1)   p(j-k+2)  …....   p(j-1)    p(j) 

|| (相配)  ||               ||          ?(有待比較

)p(1)       p(2)    …….    p(k-1)      p(k)

由上,我們得到關係:

『p(1)  p(2)  p(3)…..p(k-1)』   =    』 s(j-k+1)s(j-k+2)……s(j-1)』

接下來看「反之,若模式串中存在滿足式(4-4)。。。。。。。」這一段。看完這一段,如果下面的看不懂就不要看了。直接去看那個next函式的源程式。(偽**)

k 是和next有關係的,不過在最初看的時候,你不要太追究k到底是多少,至於next值是怎麼求出來的,我教你怎麼學會。

課本83頁不是有個例子嗎?就是圖

4.6你照著源程式,看著那個例子慢慢的推出它來。看看你做的是不是和課本上正確的next值一樣。

然後找幾道練習題好好練練,一定要做熟練了。現在你的腦子裡已經有那個next演算法的初步思想了,再回去看它是怎麼推出來的,如果還看不懂,就繼續做練習,做完練習再看。相信自己!!!

附:kmp

演算法查詢串s中含串p的個數

count

#include

#include

#include

using namespace std;

inline void next(const string& t,vector& next)

}  inline string::size_type count_kmp(const string&  s,

const string&  t){//

利用模式串t的next函式求t在主串s中的個數count的kmp演算法

//其中t非空,

vectornext(t.size());

next(t,next);

string::size_type index,count=0;   

for(index=0;index

李建平

完全搞懂KMP演算法

在串的模式匹配演算法中,kmp演算法稱得上是經典演算法了。簡約而不簡單,是對kmp演算法最恰當的評價。該演算法是由d.e.knuth,j.h.morris和v.r.pratt三人同時發現,因此人們稱它為kmp演算法。廢話不多說,現在開始進入正題。首先宣告兩點 字串 採用定長順序儲存結構,主串用s表示...

完全掌握flash AS中點 語法的應用

在as指令碼語言中我們經常看到點 官方對點語法 運算子 的說明是這樣的 運算子 用於定位影片剪輯的層次結構,以便訪問巢狀的 子級 影片剪輯 變數或屬性。點運算子也用於測試或設定物件的屬性 執行物件的方法或建立資料結構。上面的語言比較精練,不容易理解。在actionscrip指令碼語言中,點 點用來明...

輕鬆掌握KMP演算法 字串匹配

字串匹配是計算機的基本任務之一。舉例來說,有一個字串 bbc abcdab abcdabcdabde 我想知道,裡面是否包含另一個字串 abcdabd 許多演算法可以完成這個任務,knuth morris pratt演算法 簡稱kmp 是最常用的之一。它以三個發明者命名,起頭的那個k就是著名科學家d...

完全掌握加密解密實戰超級手冊

完全掌握加密解密實戰超級手冊 基本資訊 深入內涵,全盤理解,掌握精髓 來自安全技術一線培訓師與程式設計師的經驗之談,從入門到實踐,深入淺出地介 內容簡介 本書緊緊圍繞軟體的加密與解密來進行講解,在詳細講述加密 解密技術的同時 還介紹了相應的實現原理,並配合案例分析,使讀者能夠系統 深入地瞭解 加密 ...

完全掌握加密解密實戰超級手冊

完全掌握加密解密實戰超級手冊 基本資訊 深入內涵,全盤理解,掌握精髓 來自安全技術一線培訓師與程式設計師的經驗之談,從入門到實踐,深入淺出地介 內容簡介 本書緊緊圍繞軟體的加密與解密來進行講解,在詳細講述加密 解密技術的同時 還介紹了相應的實現原理,並配合案例分析,使讀者能夠系統 深入地瞭解 加密 ...