KMP演算法初探

2021-09-08 06:00:30 字數 2516 閱讀 8653

[edit by xingoo]

kmp演算法其實就是一種改進的字串匹配演算法。複雜度可以達到o(n+m),n是參考字串長度,m是匹配字串長度。

傳統的演算法,就是匹配字串與參考字串挨個比較,如果相同就比較下乙個,如果不相同,就返回上一次的結果,再重新比較。

如圖1 如果失敗則字串會重新用s(參考字串)的第二個,與t(匹配字串)的第乙個比較,知道全部符合查詢,或找不到為止。

此時發現s[5] != t[5],因此用s[1]與t[0]進行比較。

此時發現s[1]!=t[0],因此用s[2]與t[0]比較。

此時,仍然不相等,繼續後移。

此時,s[3] == t[0],繼續比較,發現所有t元素都在s中找到,滿足查詢,返回開始匹配的下標3.

1

int old_index(char * s,char *t)

9else13}

14if(j ==strlen(t))

15return i-strlen(t);

16else

17return -1

;18 }

這種比較忽略了乙個問題,就是在t中,abcabx,第乙個字串因為不跟第二個,第三個一樣,因此,在一開始的匹配中,可以直接跳過比較,直接從s的第三個元素開始比較。這裡就涉及到乙個概念:最短子串對稱匹配。

首先,初始化,當j=0時,next(j)=-1;

當j=1時,字串0到j-1,只有"a",因此 next(j) = 0;

當j=2時,字串0到j-1,字串為"ab",因此next(j) = 0;

當j=3時,字串0到j-1,字串為"abc",因此next(j) = 0;

當j=4時,字串0到j-1,字串為"abca",此時,字首a在末尾出現,因此next(j) = 1;

當j=5時,字串0到j-1,字串為"abcab",此時,字首ab在末尾出現,因此next(j) = 2;

最後得到next的陣列為"-1 0 0 0 1 2"。

按照這個方法:

ababab的next陣列為"-1 0 0 1 2 3 4"

這裡面,當j=5時,字串"ababa",字首是"aba",字尾也是"aba",因此next值為3.

xingoo 閱讀(

...)

編輯收藏

KMP演算法初探

求出乙個字串的next陣列 字串 next陣列 static int getnextarray string t else next j 0 當k 1 跳出迴圈是,next j 0,否則next j 會在break之前被賦值 return next 對主串s和模式串t進行kmp模式匹配 主串 par...

初探KMP演算法之next nextval

這種演算法是d.e.knuth與v.r.pratt和j.h.morris同時發現的,因此人們稱它為克努特 莫里斯 普拉特演算法 簡稱為kmp演算法 此演算法可以在o m n 的時間數量級上完成串的模式匹配操作。其改進在於 每當一趟匹配過程中出現字元比較不等時,不需要回溯 i 指標,而是利用已經得到的...

演算法 KMP演算法

kmp演算法主要解決的問題就是在字串 主串 中的模式 pattern 定位問題。記主串為t,模式串為p,則kmp演算法就是返回p在t 現的具體位置,如果沒有出現則返回 1。如果 i 指標指向的字元和 j 指標指向的字元不一致,那麼把 i 右移1位,j 從0位開始,從新開始匹配 如果 i 指標指向的字...