有關kmp的演算法具體的實現網上有很多,不具體闡述。這裡附上c的實現。
談談我自己的理解。kmp相較於樸素演算法,其主要目的是為了使主串中的遍歷引數i不回溯,而直接改變目標串中的遍歷引數j。
比如說要是目標串中沒有乙個重複的字元,那麼當遍歷到主串中的i與目標串的j不想等時,只需要把目標串的遍歷引數j歸1(在這裡字串的首字元用來儲存該串的長度),從主串中i的位置從頭比對目標串。然後繼續向後比較、遍歷主串即可。
但是對於大部分的目標串,並不是所有的字元都不同。那麼就引入了重複度這個概念。建立next陣列,用next陣列儲存重複度。重複度即為從頭開始,第一次出現相同的字元的位置。(如 abaabx 中,第6位的x之前為ab,第一次出現ab且和現在不同的位置是3,那麼我就直接回到3繼續對比)
遍歷到主串,發生不相等時間,目標串中的j自動匹配到next陣列中儲存的位置,從而主串引數不回溯的目的。
網上還有很多人說strstr比自己寫的kmp要快,我覺得大概是strstr其實也用了kmp,但是語句更精簡,直接用組合語言,底層優化之類的(blablabla也是瞎說沒有考證)。總之kmp的自動匹配的思維,是非常具有啟發意義的。(當然還牽扯到算重複度的思維)。
#include
#include
#include
#define n 1000
typedef
char* string;
void get_string(string a)
void get_next(string t,int *next)else j = next[j];
}}int index_kmp(string s,string t,int pos)
if(j >t[0]) return i - t[0];
else
return0;}
int main()
資料結構學習筆記之KMP模式匹配
kmp模式匹配演算法目的在於省去一般匹配中大量重複性的操作 每當匹配過程 現字元不同時不需回溯 i 指標,利用已的得到的部分匹配結果將模式串右移繼續匹配 以提高匹配效率,其中表示模式串前字尾特點的 next 陣列是此演算法的關鍵 include include include 前字尾資訊陣列 voi...
資料結構 模式匹配kmp演算法
暴力演算法 暴力演算法 intindex sstring s,sstring t,int pos else if j t 0 return i t 0 else return0 kmp演算法 next陣列的求法 例子 abaabcac 模式串的下標從1開始 第一位固定為0 第二位固定為1 從第三位 ...
資料結構 模式匹配 KMP演算法
模式匹配 在主串中找到與模式串相同的子串,並返回其位置 在討論kmp時,先來看看樸素模式匹配有什麼問題。樸素模式匹配的思路是把主串中與模式串長度相同的所有子串搞出來,挨個與模式串對比,有乙個字元不匹配時,立即放棄當前子串,轉而索引下乙個子串。在最壞的情況中,主串指標向前走m步,回退m 1步 前m 1...