日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

KMP算法笔记

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的KMP算法笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。