KMP 演算法原理解析與 C 實現

2021-10-04 12:56:18 字數 696 閱讀 3392

kmp 演算法包含兩個部分:

利用 pattern 構建 next 陣列

利用 next 資料去匹配長字串

使用 kmp 演算法的好處是,對於被匹配的長字串,我們始終不需要往回走

next 陣列中的每乙個元素,比如說 next[i] 代表的是在 pattern 中第 i 個位置之前存在的字首和字尾相等的長度。比如說abcdabce它的 next 陣列為-1, 0, 0, 0, 0, 1, 2, 3。next 陣列代表的意義是,匹配失敗時,下一次匹配對齊的位置。

vectorconstruct_next(string pattern);

vectornext(n, 0);

next[0] = -1;

next[1] = 0;

int j = 0, i = 2;

while(i < n)

else if (j > 0)

else

}return next;

}vectorgo(string text, string pattern)

if (text[i] == pattern[j])

else

else}}

return v;

}

KMP演算法原理解析

這種演算法不太容易理解,網上有很多解釋,但讀起來都很費勁。直到讀到jake boxer的文章,我才真正理解這種演算法。下面,我用自己的語言,試圖寫一篇比較好懂的kmp演算法解釋。首先,字串 bbc abcdab abcdabcdabde 的第乙個字元與搜尋詞 abcdabd 的第乙個字元,進行比較。...

kmp演算法的理解與實現

kmp演算法曾被我戲稱為看毛片演算法,當時笑噴.大三那個時候硬著頭皮把演算法導論的kmp演算法啃完,弄懂了kmp演算法 的原理,甚至還寫出了 這幾天再次溫習的時候,發現忘得比較徹底。我總結,學演算法不能只對著書本學理論,而應該 用自己的理解去看清演算法的本質,最好用文字把你的理解記錄下來,這樣才能做...

逐步理解KMP演算法C 完整實現

更進一步,如果模式串有相同的字元呢,很簡單,思路可以不變,只是失配的時候,我們可以把j向前移x步,而不是移到起始位置即可。失配時移動多少步只和模式有關和目標串無關。我們引進乙個陣列,陣列的值儲存的時模式串對應位置字元的部分匹配值,這個陣列的求法如下 首先要介紹一下字串的字首和字尾,字首 指除了最後乙...