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

2021-08-18 18:49:47 字數 1016 閱讀 7366

首先說一下為什麼當出現不匹配後,i不變,而j變成next(j)。主串abcabdc……,模式串abcabda。很明顯,當i=j=7時,出現不匹配,如果用暴力演算法,i回到2。j回到1。其實為了匹配子串,從子串的第乙個到最後乙個都要匹配,我們從子串第乙個字元a可以從主串中看出,當i=1時,主串為a,而下一次i=4時,主串才出現a,也就是說i是可以不經過2和3的。當主串中4為a時,子串中由於7以前都是匹配好的,所以,子串4也為a,假設此時i=4,j=1。再往下乙個i=5=b也是和j=2=b匹配的,此刻,利用之前的匹配,可看出j=i=5=b。匹配,。而當i=6=j6=d時!=j3=c。不匹配,所以從子串中就可以看出下一次j!=4。

再看乙個例子,主串abcabcd……,子串abcabca,同樣第七個不匹配,前六個都匹配,對應相等下一次子串有可能放在第四個位置,i=4=a處,一一比較,發現主串456和子串123匹配,而第七個由於之前沒有匹配成功,我們將可以從此刻再次重視這裡,從這裡再分析後面匹不匹配i=7了。由於主串子串前六個匹配,所以可以得到子串123和子串456匹配,next(7)=4,有乙個重要性質子串1到4-1和子串7前面4-1個,也就是456匹配,其他情況類似,這就是next(j)最重要的乙個性質。

我們來看看如何得到每乙個next(j)。我們首先要明確next(j)是子串的乙個性質,與主串無關。當next(9)=4時,說明123和678匹配如果9和4相等也就是匹配那麼1234和6789匹配,next(10)不就是5嗎,即若j(9)=next(j)(4),那麼next(j+1)(10)=next(j)+1(5)。

如果j!=next(j)舉個例子123456789中next(9)=6,但9和6的值不匹配那麼有12345和45678匹配。。next(6)=4且4和9的值相等,有123和345匹配,聯絡兩式,可以得出123和678匹配,又由於9和4的值相等所以1234和6789匹配,那麼next(10)就為5了。這裡有j(9)!=next(j)(6)但j(9)=next(next(9)(即6))=4,所以next(j+1)(10)=next(nextj)+1(4+1)=5,!,,

然後再根據相應**和書上內容,希望有所幫助理解kmp

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

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

KMP演算法理解

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

kmp演算法理解

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