KMP演算法小析

2021-05-22 00:01:07 字數 1356 閱讀 4115

對於串的模式匹配演算法,相信學data structure的都不會很陌生,不過當我們看到各種書上對演算法kmp的講解時,我們會有種不知所云的感覺就算有的c++的演算法實現,和例子的講解,當換成另外乙個串時,我們將無從下手,其中對next的求解,更讓我們痛苦。在這裡sinpoal將自己對這個演算法的看法記錄下來,在談及kmp之,我先談談另外一種串的模式匹配演算法(樸素的模式匹配)

eg :

object[i]    : q w e r t y u

subobject[j] : t y u

在上面寫出的兩個字串中我們用樸素的模式匹配來查詢 subobject[j] 這個字串, 首先定義兩個int 型數: int i=0;int j=0;

object[i]==?subobject[j]  beacusei=0; j=0;。q!=t; and now excute i++;

object[i]==?subobject[j]  beacusei=1; j=0;。w!=t; and now excute i++;

object[i]==?subobject[j]  beacusei=2; j=0;。e!=t; and now excute i++;

object[i]==?subobject[j]  beacusei=3; j=0;。r!=t; and now excute i++;

object[i]==?subobject[j]  beacusei=4; j=0;。t==t; and now excute      i++&&j++

object[i]==?subobject[j]  beacusei=5 j=1;。y==y; and now excute      i++&&j++

object[i]==?subobject[j]  beacusei=6; j=2;。u==u; and now excute      i++&&j++

此時查詢結束。

接下來我們看kmp演算法。 在這裡我給出next的演算法:

1)next[0]= -1  意義:任何串的第乙個字元的模式值規定為-1。

(2)next[j]= -1   意義:模式串t中下標為j的字元,如果與首字元

相同,且j的前面的1—k個字元與開頭的1—k

個字元不等(或者相等但t[k]==t[j])(1≤k如:t=」abeabead」 則 next[6]=-1,因t[3]=t[6]

(3)next[j]=k    意義:模式串t中下標為j的字元,如果j的前面k個

字元與開頭的k個字元相等,且t[j] != t[k] (1≤k即t[0]t[1]t[2]。。。t[k-1]==t[j-k]t[j-k+1]t[j-k+…t[j-1]

且t[j] != t[k].(1≤k(4) next[j]=0   意義:除(1)(2)(3)的其他情況。

Kmp演算法初析

考慮字串匹配問題。假設文字是乙個長度為n nn的字串t tt,模板是乙個長度為m mm的字串p pp,且m n m nm n。尋找匹配點使得t i p 0 t i m 1 1 p m 1 t i p 0 t i m 1 1 p m 1 t i p 0 t i m 1 1 p m 1 樸素方法 列舉起...

KMP演算法簡析

首先,kmp演算法是解決字串匹配問題的演算法,即在主串 s 中查詢子串 t。我們從問題入手,要在主串中查詢子串,顯然可以是用蠻力法逐個遍歷,即從主串的第乙個字元開始和子串的第乙個字元比較,若相等則繼續比較後續字元,若果不相等,則從主串的下乙個的字元 子串的第乙個字元重新開始比較。如果在主串遍歷完之後...

看毛片(KMP)演算法簡析

看毛片演算法又稱kmp演算法。該演算法之所以得名無外乎如下原因。每當涉及該演算法都甚新鮮,極想把玩一番,經過一番琢磨,終於悟透其本質。遂將其束之高閣,數月之後,再相邂逅,新鮮如初,又是一番把玩 醒悟 遺忘,如此迴圈以至無窮。足見,該演算法與看毛片的道理一脈相承。初看新鮮刺激,觀摩研究,醒悟不過如此而...