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的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最...