KMP演算法學習

2021-06-26 18:40:50 字數 2055 閱讀 2864

1.   kmp演算法簡介

2.   樸素的匹配演算法

在介紹kmp演算法之前我們來看看那樸素的匹配演算法。定義:我們是在主串中搜尋模式串。如下圖當主串在e的位置與模式串發生失配時(e前面的都是匹配的),樸素的匹配演算法做的是,將模式串後移一位在去匹。我們可以思考這樣做是否有意義,因為模式串c前面是與主串匹配的,我們將模式串向後移動一位,與其自身對比,顯然是無法匹中的,那麼與主串肯定也是無法匹配的。那麼應該移動多少位合適呢,這就是kmp演算法討論的問題。

3.   kmp演算法詳解

kmp演算法主要為每個字元建立乙個跳轉表,通常用next陣列來表示。next[j]=k的含義是,當主串中第i個元素與模式串中的第j個元素不匹配時,,我們應當保持i指標不動,而將模式串中的下標為k的元素與主串中的下標為i的元素對齊。

簡單的解釋是:當模式串中第j個元素與主串匹不中時,應該跳轉到第k個元素與主串去匹配。

next陣列的構造是kmp演算法的核心。

kmp next陣列的構造:

根據定義next[0]=-1,假設next[j]=k, 即p[0...k-1]==p[j-k,j-1](1)

1)若p[j]==p[k],則有p[0..k]==p[j-k+1,j],很顯然,next[j+1]=next[j]+1=k+1;

2)若p[j]!=p[k],則可以把其看做模式匹配的問題,即匹配失敗的時候,k值如何移動,顯然k=next[k]。

1)        顯然,關鍵是2),2)的證明如下:

因為 next[j]=k

則:p[0….k-1] =p[j-k…..j-1]

又p[j]!=p[k]

則下面的任務是要找

p[0..k』]  是否有等於  p[j-k』..j]的    k』因為  p[j-k』…j-1]= p[ k-k』…k-1]

因此只要檢查是否存在k』使得    p[0..k』-1]= p[ k-k』…k-1] (2)並且p[k』]=p[j]

若存在則,next[j]=k』

比較(1)  (2)兩式可得   k』=next[k]

即:next[j]=next[next[j-1]

若p[k』]=p[j]還不相等,接著迭代

4.kmp演算法測試程式 

#include

#include

#include

voidmakenext(const char c,int *next)

int i=0,k=-1;

next[0]=-1;

int ilen = strlen(c);

while(iwhile(k>=0&&c[i]!=c[k])

k = next[k];

i++;k++;

next[i] = k;

intkmpsearch(const char *pstrobj,const char *pstrpattern)

int iobjlen,ipatternlen;

iobjlen = strlen(pstrobj);

ipatternlen = strlen(pstrpattern);

int next[iobjlen];

makenext(pstrpattern,next);

int i=0,j=0;

while(jif(j==-1||pstrpattern[j] ==pstrobj[i])

i++;

j++;

else

j=next[j];

if(j==ipatternlen)

return (i-ipatternlen);

else

return -1;

int main()

char str[20]="cfababacfgf";

char pattern[10] = "ababac";

int istart;

istart = kmpsearch(str,pattern);

if(istart == -1)

printf("not found!\n");

else

printf("finded, obj stringpos:%d\n",istart);

KMP演算法學習

先貼上一點 等腦子清醒點再好好理解 求next陣列 public static int getnext string pattern else else return next public static int search string src,string pattern,int nextva...

KMP演算法學習

一 什麼是kmp演算法 knuth morris pratt 字串查詢演算法 常簡稱為 kmp演算法 是在乙個 主文字字串 s內查詢乙個 詞 w的出現,通過觀察發現,在不匹配 發生的時候這個詞自身包含足夠的資訊來確定下乙個匹配將在 開始 以此避免對以前匹配過的字元重新檢查。在原串中匹配模式串 二 k...

KMP演算法學習

作者這篇文章講的真是好,雖然匹配 跳轉部分看不懂,作者說這部分是關鍵 部分匹配值 就是 字首 和 字尾 的最長的共有元素的長度。以 abcdabd 為例,a 的字首和字尾都為空集,共有元素的長度為0 ab 的字首為 a 字尾為 b 共有元素的長度為0 abc 的字首為 a,ab 字尾為 bc,c 共...