關於我對kmp演算法的理解

2021-10-10 13:59:37 字數 2730 閱讀 8665

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"

字首:a,aa,aab,aaba。字尾:e,ae,bae,abae。

拆分的字元aab

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個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...