字串匹配KMP演算法

2022-08-21 17:09:07 字數 956 閱讀 4525

字串匹配kmp演算法

kmp 演算法是 d.e.knuth、j,h,morris 和 v.r.pratt 三位神人共同提出的,稱之為 knuth-morria-pratt 演算法,簡稱 kmp 演算法。該演算法相對於 brute-force(暴力)演算法有比較大的改進,主要是消除了主串指標的回溯,從而使演算法效率有了某種程度的提高。

給定乙個主串s及乙個模式串p,判斷模式串是否為主串的子串;若是,返回匹配的第乙個元素的位置(序號從1開始),否則返回0;如s=「abcd」,p=「bcd」,則返回2;s=「abcd」,p=「acb」,返回0。

上面說道 kmp 演算法主要是通過消除主串指標的回溯來提高匹配的效率的,那麼,它是則呢樣來消除回溯的呢?就是因為它提取並運用了加速匹配的資訊!

樸素演算法中,p的第j位失配,預設的把p串後移一位。

但在前一輪的比較中,我們已經知道了p的前(j-1)位與s中間對應的某(j-1)個元素已經匹配成功了。這就意味著,在一輪的嘗試匹配中,我們get到了主串的部分內容,我們能否利用這些內容,讓p多移幾位(我認為這就是kmp演算法最根本的東西),減少遍歷的趟數呢?答案是肯定的。再看下面改進後的**:

這個模擬過程即kmp演算法,每次失配,s串的索引i不動,p串的索引j定位到某個數。t(n)=o(n+m),時間效率明顯提高

而這「定位到某個數」,這個數就是接下來引入的next值。(實際上也就是p往後移多少位,換一種說法罷了:從上圖中也可以看出,失配時固定i不變,令s[i]與p[某個數]對齊,實際上是p右移幾位的另一種表達,只有為什麼這麼表達,當然是因為程式好寫。)

開——始——劃——重——點!(圖對邏輯關係比較好理解,但i和j的關係對後面求next的演算法好理解!)

比如,pj處失配,綠色的是pj,則我們可以確定p1…pj-1是與si…si+j-2相對應的位置一一相等的

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...

KMP字串匹配演算法

在介紹kmp演算法之前,先介紹一下bf演算法。一.bf演算法 bf演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串p的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和p的第二個字元 若不相等,則比較s的第二個字元和p的第乙個字元,依次比較下去,直到得出最後的匹配...