資料結構 KMP演算法

2021-09-22 20:04:24 字數 1562 閱讀 5323

如果我們要對下面的主串p和模式串p進行匹配

步驟一:i=10,j=6

步驟二:i=5,j=0

由此可見,簡單匹配演算法存在兩個問題

i 發生了回溯(從 i=10 跳到了 i=5 )

沒有利用到前面已匹配到的資訊(abcdab),增加了計算量

因此,我們提出了kmp演算法

步驟一:當 i=10,j=6 時

已匹配的資訊有相同的前字尾(如abcdab中,ab同時出現在字首和字尾中),此時模式串p的字首ab == 主串s的字尾ab(長度為2,即 next[j]=next[6]=2,ps:假設不存在相同的前字尾,則next[j]=0 ),不需要重複進行比較,那麼,我們僅需要對 j 進行修改(相當於模式串p向右移動了 j-next[j]=6-2=4, 令 j=next[j]=2 )

步驟二:改進後變成了 i=10,j=2

此時i 的回溯情況被解決(保持 i=10 ),所以當處理從外設輸入的龐大檔案,可以邊讀入,邊匹配,確保在發生不匹配(即s[i]!=p[j]時)不需要將之前寫回外存的部分再次讀入,減少了i/o 操作,提高了效率。

利用了已匹配到的資訊(abcdab),不需要重複計算,降低了演算法的時間複雜度。

上述內容介紹了 kmp 演算法的執行過程,那麼接下來我們將介紹如何求出 kmp 演算法中用到的 next 陣列

(1)尋找最長字首字尾

(2)得到最大長度表

(3)求出 next 陣列

next 陣列相當於「最大長度值」 整體向右移動一位,然後初始值賦為-1

ps:本文中的陣列範圍是從 0~ length-1,故設 next[0]=-1 作為臨界點,有一些文章的陣列範圍是從 1~ length,故設 next[i]=0(next[0]棄置不用)

kmp演算法在某些情況下仍存在缺陷,因此提出了改進的kmp演算法,具體可參考資料結構 —— 改進的kmp演算法

資料結構 KMP演算法

求串的模式值next n 定義 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...

資料結構 KMP演算法

在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...

資料結構 KMP演算法

要完善乙個string字串類,那麼實現查詢子串的功能是必不可少的,實現子串查詢可以使用樸素演算法,每次匹配乙個字元後向右移動乙個位置,這樣執行下來效率是比較低的,所以就有了kmp演算法,它能夠準確的知道當前字元不匹配後字串應該向右移動多少位,由於剛接觸kmp演算法,所以很多還明白的不是很透徹,在此記...