KMP算法笔记
1.KMP算法本質上就是對樸素匹配算法(BF)的一個優化,減少樸素匹配算法中不必要匹配的次數,核心代碼和樸素匹配算法差不多,BF是移動字串逐個字符匹配,每次模式串(子串)匹配只移動一個字符單位,而KMP算法是每次模式串匹配移動j-next個字符單位,next存放在next[]數組里,j為匹配失敗的那個字符位置。
2.為什么KMP算法可以減少不必要的匹配次數?
利用了之前已經匹配過的字符前綴信息,比如下圖:(第一行為主串,第二行為模式串)
可以看到在第七個位置匹配失敗,只需要滿足主串a字符前面從右邊開始,從左往右數的字符串 等于 模式串c字符前面從左邊開始,從左往右數的字符串。其最大字符個數就為next的值,這里就是next[j]=4,接著將模式串移動到模式串j=4(也就是j=next[j])的位置。如下圖:
從兩圖可以看到模式串移動了2個單位,而不是像BF那樣每次移動一個單位。
注意:
- 模式串移動的過程中i是不會變的。
- 字符匹配的下標可以從1開始,也可以從零開始。
接下來就是確定next數組的值(next數組計算方法是KMP精華的部分),能夠確保每次模式串移動的單位。
考試時的做法
以前準備數據結構考試計算next[]的時候,只要計算模式串從字符前從右邊開始,從左往右數 等于 模式串字符前面從左邊開始,從左往右數 的最大字符個數(不包括模式串本身)。
具體計算過程:將模式串的前綴都抽出來,如下圖。
- 為什么只需要利用模式串?
因為 主串和模式串匹配失敗時,匹配失敗字符的前綴內容是一樣的,所以之前的主串a字符前面從右邊開始,從左往右數的字符串 等于 模式串c字符前面從左邊開始,從左往右數的字符串可以替換為模式串c字符前面從右邊開始,從左往右數的字符串 等于 模式串c字符前面從左邊開始,從左往右數的字符串
編程的方法求next。
說白了就是模式串自己與自己匹配,比較其開頭和結尾即可,得到最大 相同字符的個數 即可,下標建議都從1開始,且next[1]=0,因為模式串本身并不算,所以下圖直接從第二個元素開始比。目的是求next[i[的值,舉例流程如下圖:
參考文章:KMP
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 行业性质怎么填
- 下一篇: Requests库基本使用