kmp演算法詳解

2021-09-29 08:18:59 字數 1728 閱讀 9997

對於資料量小的字串sp,我們可以寫暴力匹配去達到要求,但資料量很大的話,效率就會很低。這裡我先講一下暴力匹配的寫法,因為高效的kmp演算法和暴力匹配演算法有很大關聯

首先給乙個字串s[ ]:"ababaaacd",再給乙個匹配的字串p[ ]:"abaa"如果我們想要寫乙個程式,讓程式告訴我們s串中是否含有p

思路很簡單:

1

:ababaaacd

abaa

在p的最後一位不相同跳出即可2:

ababaaacd

abaa

在p的第一位就不同,就沒有匹配下去的必要了,直接跳出3:

ababaaacd

abaa

匹配成功,結束即可

**實現:

#include

using namespace std;

#define maxn 1005

void v_kmp(char*s,char*p)

else

if(j==plen)}if

(flag)

else

}int main(

)

kmp演算法的高效在於next[ ]的應用,next[ ]求的是公共前字尾,公共前字尾的的作用是什麼?這是我接下來要講的

舉個栗子:

s[ ]:bbc abcdab abcdabcdabde

p[ ]:abcdabd

模擬一下匹配過程

bbc abcdab abcdabcdabde

abcdabd

abcdabd

abcdabd

abcdabd

省略了一步一步往前遷移的過程,當p[k]

!=p[j]的時候,在字首

k中找和p[j]相等的p[k]從而更新k值,當p[k]

==p[j]

,字首+

+

next[ ]的**:

void getnext(char *p,

intnext

)if(p[i]

==p[k]

)next

[i]=k;

//遞迴寫法

}}

寫出next後,暴力kmp就可以為真正的kmp,因為此時的kmp並不依靠乙個乙個找的過程,當匹配到後面的時候直接根據next進行跳越

kmp**實現:

void kmp(char* s,char* p)

if(s[i]

==p[j]

) j++;

if(j==plen)

} cout<<

"匹配失敗"

<}

KMP演算法詳解

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

KMP演算法詳解

kmp演算法即knuth morris pratt演算法,是模式匹配的一種改進演算法,因為是名字中三人同時發現的,所以稱為kmp演算法。因為偶然接觸到有關kmp的問題,所以上網查了一下next陣列和 nextval陣列的求法,卻沒有找到,只有在csdn的資料檔案裡找到了next陣列的簡單求法 根據書...

KMP演算法詳解

相信很多人 包括自己 初識kmp演算法的時候始終是丈二和尚摸不著頭腦,要麼完全不知所云,要麼看不懂書上的解釋,要麼自己覺得好像心裡了解kmp演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...