kmp演算法是對普通模式匹配演算法的一種改進演算法,這種改進演算法是d.e.knuth與v.r.pratt和j.h.morris同時發現的,因此人們稱它為kmp演算法。
kmp演算法最大的特徵就是引進了跳轉表(next表),下面我們來說說kmp演算法與普通演算法的區別。
這裡我們先提乙個已知條件:目標串(target)中某乙個子串與模式串(pattern)的前i個字元相匹配時
(即target[m……m+(i-1)]
與pattern[1……i]相匹配)。若發生target[m+i]與pattern[i+1]不匹配,我們來看看普通演算法跟kmp演算法的不同。
普通演算法:將pattern[1]與target[m+i]對齊,然後逐一匹配。
kmp演算法:將模式串後移 i+1-next[i+1] 個字元,使pattern[next[i+1]]與target[m+i]對齊,然後依次向後匹配。
看到這裡我們大概知道next表歸根結底解決的是乙個字首包含問題,而kmp演算法的核心就在於next表。
我們假設模式串pattern = 'p1p2……pn',在這裡我們引入乙個概念f(j)。f(j):所有使'p1……pk-1' = 'pj-(k-1)……pj-1'成立的k的最大值。
這個概念一定要理解透徹。
我們回到上方的已知條件,當pattern[i+1]與target[m+i]進行匹配時,若匹配成功則依次向後繼續匹配,若不成功,則要找到使上式成立的f(j),也就是k的最大值,然後從第k個字元開始與target[m+i]匹配,也就是說模式串中與target[m+i]匹配的字元從pattern[i+1]跳轉到了
pattern[k](即將模式串向後移 i+1-next[i+1]),這裡的跳轉用到了next表,即 next[i+1] = k。
next函式值的演算法如下:
void get_next(sstring t, int next)
else
j = next[j]; }
}
KMP演算法理解
kmp演算法的理解著實花了不少時間,幸好網上前輩的部落格寫得都相當好,結合幾篇部落格仔細想想還是可以理解的,這裡僅做一下整理。kmp演算法概念理解看這篇部落格就夠了字串匹配的kmp演算法by阮一峰 主要的邏輯那篇部落格都有講,求出next陣列,進行簡單的加減即可完成匹配。至於求解next陣列,則是k...
kmp演算法理解
宣告 下面兩段 摘自 結構之法 演算法之道 博主july大神的部落格。這裡,我只標記和注釋一下 算是自己的學習心得吧。優化過後的next 陣列求法 void getnextval char p,int next else 求next陣列,初始時 next 0 1,這個是固定的,k為當前最新求得的最長...
KMP演算法理解
在已知 母串 長度為n 中尋找 子串 長度為m 與在給定集合中尋找特定子集類似,但不同。暴力搜尋 類似滑動匹配 思路簡單,網上很多講解,不贅述。時間複雜度為o n m kmp模式匹配 充分利用 子串 特性,時間複雜度為o n m 發生匹配失敗時,子串滑動至 已匹配成功串 的 最長公共字尾 位置。在c...