KMP演算法詳寫

2021-09-28 23:40:44 字數 1571 閱讀 5048

前言:今天上資料結構的課後想到之前學這個演算法的時候並沒有寫乙個詳細的部落格,現在補乙個,也算是加深印象。

子串的定位運算通常稱為串的模式匹配或串匹配。此演算法的應用非常廣泛,比如在 搜尋引擎拼寫檢查,語言翻譯,資料壓縮等應用中,都需要進行傳匹配

串的模式匹配設有兩個字串s和t,設s位主串,也稱正文串;設t為子串,也稱為模式在子串中查詢與模式t相匹配的子串,如果匹配成功,確定相匹配的子串中的第乙個字串s**現的位置。

著名的模式匹配演算法有bf演算法和kmp演算法,下面詳細介紹兩種演算法。

bf(brute force)演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和 t的第二個字元;若不相等,則比較s的第二個字元和t的第乙個字元,依次比較下去,直到得出最後的匹配結果。

比如

intbf(

char s,

char t,

int pos)}if

(t[j]

=='\0'

)//返回的是匹配找到的開始位置

return i+1;

else

return-1

;}

bf演算法比較直接,是一種蠻力演算法,該演算法最壞情況下要進行m*(n-m+1)次比較,時間複雜度為o(m*n)。

這個演算法的話時間複雜度高。

那麼對於有需要效率非常高的時候。我們就需要使用效率非常高的字串匹配演算法,即kmp演算法。

這個改進演算法是由knuth ,morris和 pratt 同時設計實現的,因此簡稱為kmp。

這個演算法是在bf演算法上改進的,那麼我們先來了解一下它是怎麼改進的。

每當一趟匹配過程**現字元比較不相等時,不需要回溯i指標,而是利用已經得到的"部分匹配"的結果將模式向右"滑動"盡可能遠的一段距離後,繼續進行比較。

舉個例子:

第一躺 : ababcabcacbab

: abc

第二趟:ababcabcacbab

: abc

第三趟 :ababcabcacbab

: abc

或者看動態圖

通過這個圖行我們可以理解了改進 後是怎麼比較的,那麼知道原理後,我們需要去實現kmp演算法。下面就是開始實現:

我們先得到next,然後實現kmp演算法。

void

get_next

(string t,

int next)

//else

j=next[j];}

}int

kmp(string s,string t,

int pos)

else

j=next[j];}

if(j>t[0]

)else

return0;

}

詳寫easyui的配置

短短幾行 苦尋研究了大半天。各種零碎資訊摻雜在一起,卻沒有乙個直接給出答案的。不是說網上人家寫的不好,而是人家寫的太多太大,顧慮不到這些小地方。而向我們這樣的零基礎中零基礎真的是太難理解了。下面給出今天得出的答案,希望能幫助到和我一樣被困擾的人.我不能說我寫的多麼的對,但是我能保證按我寫的去做 能得...

演算法 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進行思考後,我...