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...