kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱kmp演算法)。kmp演算法的核心是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是通過乙個next()函式實現,函式本身包含了模式串的區域性匹配資訊。kmp演算法的時間複雜度o(m+n)。bf演算法中目標串的 i 存在大量回溯,同時模式串s的 j 也會回到0號位。
最好情況:
s=「aaaaaaaaaabcdcccc」
t=「bcd」
複雜度為o(m+n)
最壞情況:
s=「aaaaaaaaaaaabccccc」
t=「aaab」
複雜度為o(mn)
kmp演算法可以解決目標串的回溯問題,每次匹配,目標串 i 不後退,僅靠模擬串 j 向右移動,複雜度為o(m+n)。此時我們需要引入next[j]函式。
next[j]中的值僅與模擬串的字元相關:next[j]的值等於模擬串第i個字元(從0開始)前的字元前字尾大小,並預設next[0]=-1。
舉例:
int
index_kmp
(sqstring s,sqstring t)
//繼續比較後繼字元
else
j=next[j]
;//模式串右移}if
(j>t.len)
return i-t.len+1;
else
return0;
}
void
get_next
(sqstring t,
int next)
else
j=next[j];}
}
類似遞迴。使用next演算法,當 t.ch[i]=t.ch[next[i]] 時,會出現 i 右滑到next[i] 位置後仍然不匹配的現象,此時又要向右移動 next[next[i]] 個位置。
為減少重複操作,優化next演算法,當前面有重複字母的出現時,更改nextval[i]的值,使其與前面重複字母對應值nextval[j]相等,即nextval[i]=nextval[j]。
void
get_nextval
(sqstring t,
int nextval)
else
j=nextval[j];}
}
KMP演算法簡述
kmp演算法是模式匹配演算法的一種高效方式,即在乙個字串中查詢是否包含目標的匹配字串。對於在字串中查詢子串的方法,我們會很自然地想到一種方式。首先把被查詢的字串和要查詢的子串對齊,看第一位是否匹配,如果匹配就看第二位是否匹配。否則,就把子串整體向右滑動一位,再從子串的第一位開始和父串匹配,直到查詢到...
演算法 KMP演算法
kmp演算法主要解決的問題就是在字串 主串 中的模式 pattern 定位問題。記主串為t,模式串為p,則kmp演算法就是返回p在t 現的具體位置,如果沒有出現則返回 1。如果 i 指標指向的字元和 j 指標指向的字元不一致,那麼把 i 右移1位,j 從0位開始,從新開始匹配 如果 i 指標指向的字...
kmp演算法next例題 KMP演算法next陣列求解
kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...