本文是介紹什麼是bf演算法、kmp演算法、bm演算法三部曲之一。
kmp演算法內部涉及到的數學原理與知識太多,本文只會對kmp演算法的執行過程、部分匹配表、next陣列進行介紹,如果理解了這三點再去閱讀其它有關kmp演算法的文章肯定能有個清晰的認識。
knuth-morris-pratt 字串查詢演算法,簡稱為kmp演算法,常用於在乙個文字串 s 內查詢乙個模式串 p 的出現位置。
這個演算法由 donald knuth、vaughan pratt、james h. morris 三人於 1977 年聯合發表,故取這 3 人的姓氏命名此演算法。
是不是感覺 donald knuth 這個名字很眼熟?沒錯,在前面這或許是講解 knuth 洗牌演算法最好的文章一文中也出現了他!
下面直接給出kmp演算法的操作流程:
看不明白?直接看動畫!
以下**本串 s 與模式串 p 為例:
首先,列出模式串 p 的所有子串:
然後,求得每乙個子串的所有字首與字尾。
字首指除了最後乙個字元以外,乙個字串的全部頭部組合;字尾指除了第乙個字元以外,乙個字串的全部尾部組合。
以第五列為例進行演示。
字首為
字尾為
求得原模式串 p 的子串對應的各個字首字尾的公共元素的最大長度表下圖。
根據最大長度表去求next 陣列:next 陣列相當於「最大長度值」 整體向右移動一位,然後初始值賦為-1。
好了,獲取了next 陣列後,kmp 演算法的操作就很清晰了。
將模式串 p 與文字串 s 的字母乙個個進行匹配,當失配的時候,模式串向右移動。
怎麼移動?
比如模式串的b與文字串的c失配了,找出失配處模式串的next陣列裡面對應的值,這裡為0,然後將索引為0的位置移動到失配處。
如果大家看這一章能大概理解kmp演算法的執行過程的話,那麼後續對kmp演算法的更深入講解,比如**實現、next陣列優化、時間複雜度分析等知識點肯定也是理解的。
我的專欄:
和程式設計師小吳一起學演算法
❤️ 看完三件事:
如果你覺得這篇內容對你挺有啟發,我想邀請你幫我三個忙:
點讚,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
關注我和專欄,讓我們成為長期關係
七分鐘筆記 Git(1)
git是乙個開源的分布式版本控制系統,可以有效 高速的處理從很小到非常大的專案版本管理。在提及git的時候,有乙個人就不得不提起乙個開源史上的傳奇人物,linux的締造者 linus torvalds。時代 週刊對其評價 有些人生來就具有統率百萬人的領袖風範 另一些人則是為寫出顛覆世界的軟體而生。唯...
七分鐘筆記 Git(名詞解釋)
什麼是版本控制 幾種版本控制 分布式版本控制系統 代表 git 分布式,我想聽到這個名詞,你就知道git是怎樣的版本控制器了。其模型為也是乙個伺服器,多個客戶端,但是與集中式不同的是客戶端從服務端提取的不只是最新的檔案快照。而是整個檔案。所以可靠性在一定程度上得到了保證。除此之外,因為他存在本地倉庫...
上帝造題的七分鐘2
xlk覺得 上帝造題的七分鐘 不太過癮,於是有了第二部。第一分鐘,x說,要有數列,於是便給定了乙個正整數數列。第二分鐘,l說,要能修改,於是便有了對一段數中每個數都開平方 下取整 的操作。第三分鐘,k說,要能查詢,於是便有了求一段數的和的操作。第四分鐘,彩虹喵說,要是noip難度,於是便有了資料範圍...