怎樣理解KMP演算法中模式串後移的目標位置?

2021-10-05 18:58:08 字數 1023 閱讀 6057

到這裡大家對kmp應該有所了解,這裡就不對kmp的相關概念進行介紹了。

kmp有個很基本的思想,就是當主串和模式串出現不匹配,需要進行下次匹配前,我們移動的是模式串,而非主串。例如:

串「abdabc」 和串"abc"

注:計算機中模式串是不會移動的,所以這裡所說的「移動」也就是其下標 j 指向的變化

插播一張:

中pj(圖有點不清晰,五個灰單元格後的那個單元格)即為模式串與主串發生不匹配的位置。

前面已經提到,kmp演算法中需要移動的是模式串,主串只有乙個作用:判斷與模式串中的字元是否相等,所以當發生不匹配,需要判斷下乙個匹配位置時,可以先將主串「大哥」晾在一邊,只分析模式串。

書中的定義:當位置(下標)j處發生不匹配時,j重新指向的位置恰好是f串中前後相重合子串的長度加1(串fl或fr的長度+1)

注:f,上述中p1~pj-1 長度的串,即pj之前的串

fi,i即 left,代表f左邊的一部分串

fr,r即right,代表f右邊的一部分串

這兩部分串相等(字元相等且長度相等,例如abcdab中fl=fr=「ab」)

其實這個定義很好理解,例如串「abacde」與串「abad」進行匹配

你想想,如果你是模式串,來到了主串中的第4個位置(此時發現與其字元不匹配),我們可能會想著讓j指向0,重新進行匹配,可是當不匹配位置(i=4)的前面明明有和模式串中前面一或多個字元相等的情況下,也就是這些相等的字元已經匹配過,那麼我們就應該從沒匹配的位置開始,也就是重合字串的長度+1。

其實我表達能力極差…不知道對有疑惑的小夥伴們能不能提供點幫助。

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

記錄貼膜小哥對kmp模式匹配演算法的粗淺理解以及筆記 詳細學習可以參考這篇 kmp不錯的講解。由於樸素模式匹配演算法的低效o n m 所以有三位前輩研究出了o n m 的匹配演算法 kmp 樸素演算法的低效在於,匹配不成功時候,主串和子串都要進行回溯。kmp演算法的優越性在於,主串不用回溯,且子串重...

KMP 模式串匹配演算法

這兩天讀了july的kmp,覺得很受益,寫下以作備忘。kmp最重要的就是求出next陣列,而next陣列則是通過不斷比較 str2 k 與 str2 j 來確定下乙個字元對應的 next數值 相等則直接next j k 不相等則令k next k 進行遞推直到出現 str2 k str2 j 相等的...

串 KMP模式匹配演算法

樸素模式匹配演算法就是簡單的二重迴圈,第一重迴圈主串s從1到n,然後第二重迴圈子串t從1到m進行匹配判斷,時間複雜度為o n m 1 m kmp演算法的核心思想是 第一 如果子串前r個字元均不相等,且子串前r個字元與主串某連續的r個字元匹配,但子串第r 1就不匹配了,則主串的匹配下標可以直接向前跳r...