演算法學習 KMP入門

2021-08-21 07:55:47 字數 2111 閱讀 4531

如何進行匹配

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前面是與主串匹配的,...