KMP MP 演算法詳解

2021-07-16 07:11:32 字數 2117 閱讀 8909

written with stackedit.

由於csdn伺服器的維護,我迫不得已地用了和csdn版本相近的stackedit

km

p 演算法,是一種字串匹配的演算法。當然,我們已經學過了一兩種字串匹配演算法,先來稍微回顧一下。

首先是暴力匹配,也就是將串中每乙個長度等於另一串的子串和另一串進行匹配。若兩串的長度為

n 和

m,那麼其的時間複雜度顯然是o(

nm) 。

然後是雜湊。雜湊在本質上是一種概率演算法,實際上是採用了一種對映的方法,如果將所有被雜湊之前的字串的集合設為

a ,而被雜湊之後的字串的雜湊值集合設為

b,那麼也就相當於定義了乙個對映ha

sh:a

→b,注意這不是乙個單射,因為在大多數的情況下,有|a

|<|b

| 。當然,有很多方法改進,但是只有完美雜湊使得它不再算乙個概率演算法,然而完美雜湊本身的操作過於繁瑣,一般適用於字串不變的情況,如編譯器中的指令。實際上,雜湊演算法的本質和暴力是一致的,但是由於對映的存在,使得雜湊演算法要比較的東西就不那麼多了,就像暴力演算法中只抽樣比幾位一樣,但是雜湊演算法相當於是在每一位中都抽一點點的樣(有些時候不是這樣),所以更為準確一些。其的時間複雜度為θ(

n+mlogvm

od) ,其中

v 是計算機所採用的進製(如現在的一般採用二進位制,不排除以後有更高進製的計算機,或者要求相關的互動題:)),mo

d則是你所使用的模數(因為我們當時只學了一種雜湊:-()。

好吧,回顧完了,我們來稍微了解一些關於km

p 的東西。km

p 的本質是暴力匹配的優化,而其有乙個較為簡單的版本,mp

。本文介紹時將先介紹mp

演算法,再比較km

p 與mp

之間那乙個′k

′ 的不同。

考慮暴力演算法,其思路大致是用指標

i 和

j分別遍歷兩個串,然後當失配(即兩個指標對應的字元不相等時)回到兩個串「前面的位置」,也就是像回溯一樣不斷嘗試。

但是,這樣單純地找,有時是不會有好結果的。如下所示,兩個串

a 和b:

a:ab

abab

c b:

abab

c 其中,若在串

a 中找串

b,那麼第一次嘗試匹配到ab

aba 時,只有最後一位的a 和

c 不一樣。但是,這時我們注意到,串

b 中有兩個ab

,所以當回溯時,我們並不用將串

a 中的指標

i前移,而只需將

b 中的指標

j前移到開頭即可。若設a=

a1a2

a3a4

… ,b=

b1b2

b3b4

… ,那麼因為已經比較,所以自然有a1

=b1,

a2=b

2,a3

=b3,

a4=b

4 ,於是又由於我們已知b1

=b3,

b2=b

4 ,那麼就有b1

=a3,

b2=a

4 。所以,只需從原位置繼續開始即可。 mp

演算法正是基於這樣的一種思想。倘若存在某個[1

,j]=

[i−j

,i] ,那麼我們定義j=

next

(i) ,表示當在

i 位置的字元失配時應當跳到**。其的求法我們先不管,但是這樣一來匹配就很好寫了,**這裡略去,請自行查詢資料。

那麼,nex

t(i)

的求法又應當是怎樣的呢?答案是:幾乎和匹配一樣!想想看,ne

xt(i

) 的求解,不正相當於是用自己匹配自己嗎?假如我們知道ne

xt(i

) ,那麼我們能找到乙個

j ,使得串s中有

si+1

=sj+

1 (當然,有時找不到,這時只需要設為乙個特殊值就行了:))那麼這樣的話,就應當有ne

xt(i

+1)=

j+1 。

這,就是mp

演算法的全套,至於km

p 演算法,請自行查閱資料。

A 演算法詳解

第一部分 a 演算法簡介 寫這篇文章的初衷是應乙個的要求,當然我也發現現在有關人工智慧的中文站點實在太少,我在這裡 拋磚引玉,希望大家都來熱心的參與。還是說正題,我先拿a 演算法開刀,是因為a 在遊戲中有它很典型的用法,是人工智慧在遊戲中的代表。a 演算法在人工智慧中是一種典型的啟發式搜尋演算法,為...

A 演算法詳解

a 演算法的基本原理 a star演算法是一種靜態路網中求解最短路徑最有效的直接搜尋方法,也是解決許多搜尋問題的有效演算法。演算法中的距離估算值與實際值越接近,最終搜尋速度越快。f i g i h i 以上式子中 g i 表示從起點到當前節點已經付出的代價,這個是準確的 a 演算法最重要的是估價函式...

KMP演算法詳解

模式匹配的kmp演算法詳解 這種由d.e.knuth,j.h.morris和v.r.pratt同時發現的改進的模式匹配演算法簡稱為kmp演算法。大概學過資訊學的都知道,是個比較難理解的演算法,今天特把它搞個徹徹底底明明白白。注意到這是乙個改進的演算法,所以有必要把原來的模式匹配演算法拿出來,其實理解...