第十一章 數據結構 串的模式匹配 BF算法 + KMP算法中next[]回退算法理解。

串的模式匹配

設有主串s和子串t, 子串t的定位就是要在s中找到一個與子串相等的子串。
通常把主串s稱爲目標串, 把子串t稱爲模式串, 因此定位也稱作模式匹配。
在目標串s中找到一個模式串t, 稱爲模式匹配成功。
在目標串s中找到一個模式串t, 稱爲模式匹配不成功。

Brute-Force算法

Brute-Force算法簡稱爲BF算法, 亦稱爲簡單匹配算法。
這個算法又稱爲暴力匹配。
假設我們用i和j分別代表主串與模式串當前比較的位置,如果當前匹配成功, 則i++,j++;若失敗, 則兩個指針都要回溯。
i = i - j + 2, j則是從頭開始。

BF算法在最好的情況下是O(m)O(m)的複雜度, 即主串的前m個字符正好等於模式串的m個字符。
在最壞的情況下時間複雜度爲O(nm)O(n * m)

KMP算法

KMP算法是由
D. E. Knuth、J.H.Morris和V.R.Pratt共同提出的算法, 簡稱KMP算法。
該算法較BF算法有較大的改進, 主要是消除了主串指針的回溯, 從而使算法效率有了某種程度的提高。

在KMP算法中, 通過分析模式串t從中提取出隱藏的加速匹配的有用信息, 利用它來提高模式匹配的效率。

採用next數組存放這些“部份匹配”信息。
t = “ababb” t4前面:t0t1 = t2t3;
在這裏插入圖片描述
記住, 一定要是t的開頭部份。
比如abaaabc 此時字符c前面有兩個與t開頭部份相同的字符。那麼next[i] = 2;i是c的下標。假設有多個這樣相同的情況,則我們取最大的。

Next例:

在這裏插入圖片描述

在KMP算法中求next數組的時間複雜度爲O(m)O(m),在後面的匹配中因主串s的下標不減即不回溯, 比較次數可記爲n,所以KMP算法的總時間複雜度爲O(n+m)O(n + m)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章