KMP演算法 字串的快速匹配

2021-10-04 12:05:56 字數 1880 閱讀 4354

先了解一下字串匹配的樸素模式匹配(b-f演算法):

當模式串中x匹配到字串z時,比較不等,則模式串右移一位,此時指標也跟著回到模式串的初始位置(如下圖所示),這個指標的移動叫做回溯。

為了消除這種回溯,提高執行效率,於是有了kmp演算法。

kmp演算法:

指標從模式串開頭移動,當匹配到z≠x時,尋找子串xzzxz最大的公共前字尾,為xz,則將模式串的字首移動到字尾的位置,指標不動,如下圖:

指標繼續掃瞄,遇到不匹配時,繼續尋找子串xzzxzx的最大公共前字尾,為x,將模式串的字首移動到字尾的位置,指標不動,如下圖:

發現模式串超出目標串的範圍,則匹配失敗。

下面介紹匹配成功的例子:

指標掃瞄到z與x不匹配時,尋找最大公共串xzx,將模式串字首移動到字尾位置,指標不動,如下圖:

指標繼續掃瞄,掃瞄到z與x不匹配,最大公共前字尾x,字首移到字尾位置。

指標繼續移動匹配到模式串末端,則匹配成功。

從上面的例子可以看出模式串的位置移動不需要目標串,只與模式串(模式串的對稱串)有關。將模式串提取出來如下圖。

設模式串p匹配到j位置,當模式串與目標串不匹配時,則令j=next[j]

(模式串一般的儲存方式如上圖,從0開始儲存也可以,原理一樣)

容易看出指標移動的位置為:最大公共前字尾的長度+1,即k+1(=j-next[j]).

假設此刻目標串s匹配到 i 位置,模式串p匹配到 j 位置

如果j = -1,或者當前字元匹配成功(即s[i] == p[j]),都令i++,j++,繼續匹配下乙個字元.

如果j != -1,且當前字元匹配失敗(即s[i] != p[j]),則令 i 不變,j = next[j].

kmp演算法實現快速匹配演算法adt:

int astring::

fastfind

(astring& pat,

int k,

int next)

const

else posp=next[posp];if

(posp

return-1

;//匹配失敗

else

return post-lengthp;

//匹配成功

};

計算next[j]的演算法——遞迴

void astring::

getnext

(int next)

else k=next[k];}

;

KMP演算法 字串快速匹配

kmp演算法的實現 最近學習了資料結構中乙個重要的內容 字串.涉及到乙個重要也是難理解的演算法 kmp演算法,即字串快速匹配模式串的演算法.在這裡寫一下心得體會,以便後來者參考.在開始之前,還是先講一講樸素的字串匹配演算法 暴力搜尋.先講幾個基本概念 所謂暴力搜尋,就是從主串和模式串開頭字元開始,乙...

KMP演算法 字串匹配

kmp演算法基本思想 我們在用常規的思想做 字串匹配時候是 如 對如 字元如果 t abab 用p ba 去匹配,常規思路是 看 t 第乙個元素 a 是否 和p 的乙個 b 匹配 匹配的話 檢視各自的第二個元素,不匹配 則將 t 串的 第二個元素開始 和 p 的第乙個匹配,如此 一步一步 的後移 來...

KMP字串匹配演算法

kmp核心思想 計算模式串的next陣列,主串的索引在比較的過程中不回朔 ifndef kmp h define kmp h class kmp endif include kmp.h include include include using namespace std int kmp calcu...