資料結構 關於KMP演算法的效率分析

2021-04-29 06:21:15 字數 580 閱讀 6553

通常的kmp演算法可以描述如下,不知道的可以查相關資料。

從s的pos位置開始尋找字串t

int index_kmp(string s,string t,int pos)

else j=next[j];//i不變(不回溯),j跳動

}if(j>t.length) return i-t.length;//匹配成功

else return 0;

}假設n=s.length m=t.length (m<=n)

許多資料結構的書上說該演算法效率為o(m),卻沒有說明白。

查了些資料,其效率分析還是蠻有技巧的。其實主要在於while迴圈,每次if比較成功後,i++,j++,由於i一直遞增,所以顯然,由於s的length為n,該成功匹配執行的最大次數為n,所以j最多遞增了n次,而由於if比較失敗後 j=next[j],這裡j至少是要減1的,所以,因為j最多增了n次,所以j=next[j]也最多執行了n次,所以這個while迴圈中的if其實最多執行了2n次,

所以這個while迴圈的時間複雜度為o(n)。

有時候,在我們對於不定次數的迴圈的時間複雜度分析比較困難的時候,可以採取依靠某個變數來決定演算法的複雜度。

資料結構 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演算法,所以很多還明白的不是很透徹,在此記...