如何進行匹配
kmp解決的是模式串
s s
和文字串
t' role="presentation">t
t之間的匹配問題。傳統和暴力演算法,在複雜度方面不夠優秀,根本原因在於對模式串沒有的規律沒有加以利用,導致進行了多餘的匹配。而kmp演算法的關鍵也在於ne
xtn ex
t陣列,求解出了模式串ne
xtn ex
t陣列,也就求解出來了對於當前模式串在某一位置失配後,接下來去哪一位置進行匹配的問題。有了這個從而提高在匹配過程中的效率。
對文字串和模式串進行如下的規定: |s
|=n,
|t|=
m,s=
s0s1
…sn−
1,t=
t0t1
…tm−
1 |s|
=n,|
t|=m
,s=s
0s1…
sn−1
,t=t
0t1…
tm−1
對nex
t nex
t陣列的理解,可以為:如果當前在模式串
s s
中的某一位置
x' role="presentation">x
x發生失配,即在主串
t t
中某一可能的位置
y' role="presentation">y
y,如果有sx
≠ty sx≠
ty
,對於模式串來說,應該用其的哪個字元接著和sx
s
x進行比較。
從上述描述中,不難發現,對於主串的指標,在失配的時候是不回退的。而在傳統的暴力求解演算法上,如果發生了失配,主串的指標是要回退到模式串頭部對應主串的位置+1的位置上,這樣的回退,顯然效率很低。從這個角度上來看,也說明了kmp有很好的效率。ne
xtn ex
t陣列的含義已經說過,其更本質的含義是,對於模式串的某一位置
x x
,s0s1…s
x−1' role="presentation">s0s
1…sx
−1s0
s1…s
x−1的字首和字尾相同的最大長度。這樣說還不夠具體,用乙個例項來描述一下。
假設有模式串s=
abab
aca s=a
baba
ca
x x
串最長字首和最長字尾相同的串
最長長度ne
xt' role="presentation">nex
tnex
t值0aan
ull' role="presentation">nul
lnul
l0-11aba
bnulln
ul
l0-1
2abaab
aa a
103a
bab' role="presentation">aba
baba
bab ab21
4ababaa
baba
aba aba
325aba
bac aba
bacnu
llnul
l0-1
6aba
bacaab
abac
aa a
10解釋一下上表,如當x=
6' role="presentation">x=6
x=6時,模式串最後發生了失配,也就是最後的
a a
和文字串不匹配,在保證主串指標不回退的情況下,那麼主串該和模式串的哪個字元來比較了,顯然是第0個字元,也就是開頭的
a' role="presentation">aa.
再比如,當x=
4 x=4
的時候發生失配,那麼下面就是主串的模式串的第2個字元進行比較。
void getnext()
}
tobecon
tinuedt
obec
onti
nued
KMP演算法學習
先貼上一點 等腦子清醒點再好好理解 求next陣列 public static int getnext string pattern else else return next public static int search string src,string pattern,int nextva...
KMP演算法學習
一 什麼是kmp演算法 knuth morris pratt 字串查詢演算法 常簡稱為 kmp演算法 是在乙個 主文字字串 s內查詢乙個 詞 w的出現,通過觀察發現,在不匹配 發生的時候這個詞自身包含足夠的資訊來確定下乙個匹配將在 開始 以此避免對以前匹配過的字元重新檢查。在原串中匹配模式串 二 k...
KMP演算法學習
1.kmp演算法簡介 2.樸素的匹配演算法 在介紹kmp演算法之前我們來看看那樸素的匹配演算法。定義 我們是在主串中搜尋模式串。如下圖當主串在e的位置與模式串發生失配時 e前面的都是匹配的 樸素的匹配演算法做的是,將模式串後移一位在去匹。我們可以思考這樣做是否有意義,因為模式串c前面是與主串匹配的,...