KMP演算法深入淺出

2021-06-14 04:25:59 字數 1044 閱讀 1054

s:  ababcababa

p:  ababa

kmp演算法與bf演算法的區別就在於kmp演算法巧妙的消除了指標i的回溯問題,只需確定下次匹配j的位置即可,使得問題的複雜度由o(mn)下降到o(m+n)。

在kmp演算法中,為了確定在匹配不成功時,下次匹配時j的位置,引入了next陣列,next[j]的值表示p[0...j-1]中最長字尾的長度等於相同字串行的字首。

對於next陣列的定義如下:

1) next[j] = -1  j = 0

2) next[j] = max(k): 03) next[j] = 0  其他

如:p      a    b   a    b   a

j      0    1   2    3   4

next    -1   0   0    1   2

其實如果這段你覺得很難看懂(確實開始挺難看懂的),那麼我們就實際的比量一下

next[0]=-1,next[1]=0,這個就是約定俗成了,不管它了。其餘的j,就是相當於p[0,j-1]這個串裡,重合度最高的那兩個字串,它們的長度,這兩個字串要滿足什麼條件呢?第乙個子串的開始位置是0,第二個子串的結尾位置是j-1,上例中next[4]為什麼等於2?因為p[0,4]=abab,而abab重合度最高的就是ab,它恰好也滿足上述條件,於是next[4]=2.

再例:t      a    b   a    a   b  d

j      0    1   2    3   4   5

next    -1   0   0    1   1   2

這回比較明白了吧?當然這個next的表示,有人是以-1作為基數的,有人為0作基數,都不打緊,你要是願意以0作基數,那每個next元素上都+1就完了唄,為了接近計算機表示法,我還是支援以-1作為基數

next算出來了,然後怎麼用呢?

在匹配過程中,先從若發生不匹配的情況,如果next[j]>=0,則目標串的指標i不變,將模式串的指標j移動到next[j]的位置繼續進行匹配;若next[j]=-1,則將i右移1位,並將j置0,繼續進行比較。

這回可以很快地從s中找到p了吧?

KMP演算法 深入淺出

還是進入正題吧,整理整理大佬的blog kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現。kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next 函式,函式本身包含了模式...

深入淺出K Means演算法

摘要 在資料探勘中,k means演算法是一種 cluster analysis 的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最近均值的演算法。在資料探勘中,k means演算法是一種cluster analysis的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種...

深入淺出K Means演算法

在資料探勘中,k means演算法是一種 cluster analysis 的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最近均值的演算法。在資料探勘中,k means演算法是一種cluster analysis的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最...