串 KMP模式匹配演算法理解筆記

2021-09-24 21:39:24 字數 1716 閱讀 7022

記錄貼膜小哥對kmp模式匹配演算法的粗淺理解以及筆記

詳細學習可以參考這篇–kmp不錯的講解。

由於樸素模式匹配演算法的低效o(n*m),所以有三位前輩研究出了o(n+m)的匹配演算法–kmp

樸素演算法的低效在於,匹配不成功時候,主串和子串都要進行回溯kmp演算法的優越性在於,主串不用回溯,且子串重複部分也不用回溯。

理解kmp演算法的關鍵在於理解f陣列:

1-什麼是f陣列

2-f陣列如何生成

舉個栗子:兩個串匹配時,e和f匹配失敗,按照樸素匹配演算法,主串後移一位,子串回溯重置。

其實子串bcdf與主串的bcd已經匹配成功,且bcd不同,這樣其實子串b和主串的c,d再進行匹配是重複工作。

所以,可以直接跳到該步,相當於主串+n,子串置0

然而在現實生活中 bcdf這種串還是太少見,如果遇到bcbc這種重複的串就不能直接跳過了。

通過查詢已批配的主串的字尾和子串的字首相同最大長度作為子串的回溯位置。比如,bcb的前字尾最大長度為 b=1,所以子串從1的位置–c可是匹配。

所以f陣列是什麼呢?f陣列存放失敗位置之前的串的最大前字尾長度。用來控制子串回溯的位置。子串不重複,完全回溯,子串重複,回溯除了重複的部分。重複也就是最大重複,最大重複就是前字尾最大長度。

f陣列的生成,本質上是子串自己匹配自己

再舉個栗子:

乙個子串,最大的前字尾長度,f[i]和f[i-1]是有關係的。匹配成功時,f[i]=f[i-1]+1。就如 已知 "abc …ab"串的最大長度為2 ,串「abc…abc」,只要判斷c==c則最大長度為2+1.若串"abc…aba"不相等,則迭代回溯,即回溯f[f[2]]即判斷b是否等於a,失敗,再回溯到a,f[0],判斷是否等於a,相等,所以"abc…aba"的f陣列為0+1=1

//f陣列

else}}

intkmpsearch

(char

* s,

char

* p)

else}if

(j == plen)

return i - j;

else

return-1

;}intmain()

模式匹配kmp演算法理解分析

首先說一下為什麼當出現不匹配後,i不變,而j變成next j 主串abcabdc 模式串abcabda。很明顯,當i j 7時,出現不匹配,如果用暴力演算法,i回到2。j回到1。其實為了匹配子串,從子串的第乙個到最後乙個都要匹配,我們從子串第乙個字元a可以從主串中看出,當i 1時,主串為a,而下一次...

KMP演算法理解

kmp演算法的理解著實花了不少時間,幸好網上前輩的部落格寫得都相當好,結合幾篇部落格仔細想想還是可以理解的,這裡僅做一下整理。kmp演算法概念理解看這篇部落格就夠了字串匹配的kmp演算法by阮一峰 主要的邏輯那篇部落格都有講,求出next陣列,進行簡單的加減即可完成匹配。至於求解next陣列,則是k...

kmp演算法理解

宣告 下面兩段 摘自 結構之法 演算法之道 博主july大神的部落格。這裡,我只標記和注釋一下 算是自己的學習心得吧。優化過後的next 陣列求法 void getnextval char p,int next else 求next陣列,初始時 next 0 1,這個是固定的,k為當前最新求得的最長...