kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt提出的,kmp演算法的核心是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。花了3小時終於理解kmp演算法了,kmp演算法的思路並不難,但是許多資料講的又難以讓人理解,所以我希望我的這篇文章能夠幫助到後來人,如果我寫的內容有差錯,希望大牛指出,幫助我改進學習。
*** 如果有兩個字串,char str1和char str2,我們的目的是要在a字串裡找到b字串的位置。這裡我對兩個變數的設定如下:
這裡我們先用樸素演算法來查詢str2在str1的位置吧。
第一次:
str1:ab
eaba
bcab
estr2:ab
cab第二次:
str1:ab
eaba
bcab
estr2:ab
cab第三次:
str1:ab
eaba
bcab
estr2:ab
cab。
。。直到找到:
str1:ab
eaba
bcab
estr2:ab
cab得出str2在str1的位置為6。
實現**
public
class
demo1
p2++;}
if(p2==str2.length)}}
}
上述**可以看出,這種演算法的效率很低,依次去比對,浪費了許多時間,所以需要我們對演算法進一步的改進,也就是所謂的kmp演算法。
kmp演算法思路
還是老規矩,我們手動模擬下過程
第一次:
str1:ab
eaba
bcab
estr2:ab
cab我們發現第3格str1與str2的位元組不相同,而前兩格ab是兩個不重複的字母,所以我們就得出第二次的操作了。
第二次:
str1:ab
eaba
bcab
estr2:ab
cab第三次:
str1:ab
eaba
bcab
estr2:ab
cab第四次
str1:ab
eaba
bcab
estr2:ab
cab找到字串,結束。。。。。。
怎樣?我懂,你還是很疑惑,所以我又找了個其他列子,方便你來理解。
第一次
str1:ab
caba
bcab
cdstr2:ab
cabc
d我們發現第6格str1與str2的位元組不相同,前面五格abcab,c前面的ab與c後面的ab是重複的(好像是廢話。。。),所以我們就得出第二步這樣的操作了。
第二次
str1:ab
caba
bcab
cdstr2:ab
cabc
d再次比較,我們發現還是第6格不同,而str2中c前面的字母沒有重複的,所以就得出我們第三步這樣的操作啦
第三次
str1:ab
caba
bcab
cdstr2:ab
cabc
d這裡,我們就遍歷得到str2在str1的位置了,與樸素演算法相比,大大減少了遍歷的時間,因為str2並不是像樸素演算法一樣一步一步按部就班,而是不講武德,可能走一步,也可能走多步,如果你能自己手動模擬出上面的操作,那麼就可以看如下的文字。
這裡我先說明一下字串的字首和字尾,字串的字首和字尾不能包含他本身, 如字串"aabae"拆分的字元aab字首:a,aa,aab,aaba。字尾:e,ae,bae,abae。
abcabca
abcab
abcabc
abcabcd
len000
1230
這裡我直接列公式
下次移動到的下標=str1與str2不同位置的下標-len,len是怎麼決定的呢?如str1=「abacdababc」 ,str2=「abcabcd」
當abacdababc
abcabcd
↑我們發現c與a不同,而c前面的ab對應的len為0,所以下一次移動的指向為2。
說了這麼多,我們回歸主題吧,直接上**吧!
public
class
demo1
} map[i]
=max;
}//初始化完畢
int index=
0,p=0;
while
(indexif(p==str2.length)}}
}
總而言之,你也許還是感覺很懵逼,但是至少思路清晰了點,對吧,那麼,再見。 對KMP演算法的理解
kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...
對KMP演算法的理解
kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...
對KMP演算法的理解
kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...