先了解一下字串匹配的樸素模式匹配(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...