KMP演算法的自己體會和實現

2021-07-24 05:19:10 字數 1121 閱讀 6646

資料結構講到字串匹配的時候,講到了乙個很優秀的演算法——kmp演算法!

相對於傳統的匹配演算法,kmp演算法有自己的一定優勢。當字串中有很長的一段重複字元的時候,可以省略過很大的一部分無效比較。跟傳統的匹配演算法不同的是,kmp演算法引進了乙個新的東西——

跳轉表,就是這個表在匹配時發揮了巨大的作用。

這是課本上的原理與例子,我加上了一些自己的理解。所以最重要的是得出跳轉表next來輔助我們匹配字串。首先是第一種匹配表:

void get_nextval1(string a,int next)

else

j = next[j];

}}

這種版本的跳轉表還有乙個問題就是前面有很多的字元相同的時候,仍得乙個乙個匹配,所以經過改進有了第二種改進版的跳轉表:

void get_nextval2(string a, int next)

else

j = next[j];

}}

這種跳轉表就很好的迴避了那個問題,當相同的時候會滑過那一串,具體的例子如下圖:

其實,kmp演算法的思路很好理解,但是在實現的時候如果把資料結構書上的**寫進去會發現各種越界,這就是另乙個問題了,在資料結構中,第乙個位置被預設存放了字串的長度,所以在寫為**的時候,應該使用length函式得到長度,而且所有的位置都應比書上少1!

最後上主函式和kmp函式。。。

int main()

int kmp(string a, string b, int next)//a為匹配字串,b為模式字串

else

j = next[j];

} if (j == b.length())

return i - b.length();

else

return 0;

}

KMP演算法的實現

概念 knuth morris pratt 字串查詢演算法,簡稱為 kmp 演算法 常用於在乙個文字串 s 內查詢乙個模式串 p 的出現位置,這個演算法由 donald knuth vaughan pratt james h.morris 三人於 1977 年聯合發表,故取這三人的姓氏命名此演算法。...

KMP演算法的實現

kmp演算法的核心就是求子串的重疊的位置 ababc 那麼對於c來說,它前面是abab,所以重疊的子串是ab,所以新位置是2 這都不重要,其他人說得很詳細,我要記錄我的 include include using namespace std 樸素匹配演算法 int match string spar...

KMP演算法實現

核心是模式串next陣列的生成 include stdio.h include string h define ns 100 intstrpos char s1 char s2 intn void next char s2,int n int main intargc,char args next ...