String,演算法 字串匹配的KMP演算法

2021-04-01 23:27:03 字數 2954 閱讀 9482

[string,

演算法

]字串匹配的

kmp演算法

:

字串匹配的

kmp演算法是由

knuth

、morris

和pratt

三位教授共同發明,其無回溯演算法的精巧程度令人嘆為觀止

.網上相關的參考

下面給出我的實現,演算法的精華是**背後的分析,這裡就不再詳述了,尤其是複雜度分析相當有難度

.具體請參考相關的資料

.1

演算法思路

:

在matchstr

中找是否含有

patternstr

子串: (

這裡字串的實現用的是字串的順序表示

)1.a)

外層的無回溯層:將

matchstr

與patternstr

進行比較:

1)如果

patternstr

的當前位置與

matchstr

的當前位置不匹配:

1.1)

若patternstr

的當前位置為

patternstr

的首位置,則

matchstr

的位置直接加

1.1.2)

若patternstr

的當前位置不為

patternstr

的首位置,則

matchstr

的位置停在當前位置,

patternstr

的下標回溯到前面的乙個恰當位置,利用

next

陣列進行回溯

.2)

如果patternstr

的當前位置與

matchstr

當前位置匹配,則

patternstr

和matchstr

的位置均前進1.3

)當patternstr

或matchstr

的長度到達其長度時,跳出,否則繼續做

1,2.

4)如果

matchstr

達到其長度,則輸出找到的位置,為

matchpos-patternpos+1.

如果patternstr

達到其長度,則輸出沒有找到的資訊

.1.b)next陣列的實現思路

:

next

陣列主要是標誌出乙個字元陣列的當前位置的最大真前,真後子綴的下標位置,這裡採用了乙個改進演算法

,為了配合

1.2裡的工作,讓

next

陣列裡的下標盡可能的往前移動

.這一部分對應的程式段為

:if(patternstr->c[i]==patternstr->c[k])//make the match quicker.

nextarr[i]=nextarr[k];

else

nextarr[i]=k;

在真前與真後子綴的查詢的演算法同樣有技巧:對於

patternstr

裡的第i

個位置,如果它的字首陣列的位置值為

k,則下乙個位置的字首陣列的最大位置只有可能為

k+1,

成立條件為

next[i]==next[k],

如果沒有找到,則下乙個位置的在字首陣列中的值為

-1.這一部對應的程式段為

:while(k>=0&&patternstr->c[i]!=patternstr->c[k])

k=nextarr[k];

//exit1:k=-1;exit2:p->c[i]=p->c[k],has true pre and rear zi zhui.

當這些演算法的細節都了解清楚後,你對

kmp的實現已基本沒有問題的,就像我一樣,但對其演算法的正確性,效率的分析還是得下一翻工夫才能真正領悟

.資料結構定義

:順序型字串

:#define string_len 15000

/*---start of seqstirng---*/

struct seqstring;

typedef struct seqstring* pseqstring;

struct seqstring

;/*core algorithm:kmp alogorithm*/

int kmpmatch1(pseqstring sourcestr,pseqstring patternstr)

else

}if(pmatch!=patternstr->len)

pos=-1;

else

pos=pscr-pmatch;

return pos;

}void makenext(pseqstring patternstr,int* nextarr)

}為了便於對比,給出乙個簡單的回溯型的匹配演算法的實現

:int ******match(pseqstring sourcestr,pseqstring patternstr)

if(j==patternstr->len)

else

}if(flag)

pos=i-j;

else

pos=-1;

return pos;}:

(測試程式是在

10000

個字元裡找

helloworld子串)

好了,就介紹這些

,附上原始碼

//。歡迎提出批評與指正意見

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...

字串匹配演算法

首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...

字串匹配演算法

平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...