KMP演算法失效函式計算演算法筆記

2021-08-31 07:21:03 字數 1237 閱讀 4677

kmp演算法是經典的字串匹配演算法,在序列時時間複雜度為線性。kmp演算法的思想很簡單,將參與匹配的模式串部分視為週期串(最短)後接字首串,週期串重複出現次數記為k,週期串長度記為l。當模式串的第j位與正文串第k位比較時(假設模式串首位與正文串第x位比較),如果字元不相同,最簡單的方法是將模式串相對於正文串的位置向後移動一位,即模式串從正文串第x+1位開始匹配。當參與匹配的模式串部分k大於1時,從x+1到x + l開始的匹配都是無意義的,因為如果能夠再次匹配到k這個位置,則證明週期串不是最小的,這與週期串的定義矛盾。因此在模式串的第j位與正文串的第k位匹配失敗後,直接將模式串後移l位,正文串第k+1位開始與模式串j-l位開始比較就可以了,這樣,正文串中的每個字元在演算法中,只參與一次比較,演算法的時間序列時間複雜度為線性。

kmp演算法的關鍵是要計算乙個next陣列,在這裡有詳細講解:

也有的地方叫做失效函式,今天看書的時候有點看不懂,看完了寫了一點筆記,抄錄上來以便日後查閱

輸入:模式串p[1 : m]

輸出:失效函式f(k), 1 ≤ k ≤ m + 1

begin

f(1) = 0

f(2) = 1 //f(2) = j - f(1) = 1 - 0 = 1

k = 2

j = 1

while k ≤ m do //在所有位置f(k)計算完成之前

if p(k) = p(j) then //如圖6.1(2)相等時,k這個位置能與前面匹配上的長度就是j + 1

j = j + 1

k + k + 1

f(k) = j

endif

if p(k) ≠ p(j) then //不相等時,將j移動乙個週期串長度(j = f(j)),繼續匹配

//如果一直匹配不到,j最終會變成0,那說明j的週期串加上

//字首串第乙個字元,並不是前面出現的乙個週期串,因此j要

//從頭再開始匹配

j = f(j)

if j = 0 then

k = k + 1

j = 1

f(k) = 1

endif

endif

endif

endwhile

end

C 星座星盤計算演算法

在 之前,筆者先分享一些基本知識,首先是12星座。其次是星和行星 上面的太陽 sun 和月亮 moon 就不必解釋了,其他的行星都給出了英文名 符號和解釋。網路的圖沒有冥王星英文是 pluto 好了開始 部分,首先我們要新增用於c 訪問的函式,define api export declspec d...

計算演算法複雜度

演算法的複雜度分為時間複雜度和空間複雜度 1.時間複雜度 在計算演算法複雜度時一般只用到大o符號,landau符號體系中的小o符號 符號等等比較不常用。這裡的o,最初是用大寫希臘字母,但現在都用大寫英語字母o 小o符號也是用小寫英語字母o,符號則維持大寫希臘字母 常見的演算法時間複雜度由小到大依次為...

分頁頁碼計算演算法

最近做 用到了分頁頁碼計算的演算法,覺得之前一直用的不好,自己寫了乙個,拿出來與大家共享一下 view code 1 package cnblogs.xiaoqiu.test 23 4 1.如果是5個可見頁碼,1 12345,2 12345,3 12345,4 23456,5 34567,6 456...