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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

七分钟理解什么是 KMP 算法

發布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 七分钟理解什么是 KMP 算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是介紹 什么是 BF算法KMP算法、BM算法 三部曲之一。

KMP算法 內部涉及到的數學原理與知識太多,本文只會對 KMP算法 的運行過程、 部分匹配表next數組 進行介紹,如果理解了這三點再去閱讀其它有關 KMP算法 的文章肯定能有個清晰的認識。

以下的文字描述請結合視頻動畫來閱讀~

視頻地址:https://www.bilibili.com/video/av60334201/

定義

Knuth-Morris-Pratt 字符串查找算法,簡稱為 KMP算法,常用于在一個文本串 S 內查找一個模式串 P 的出現位置。

這個算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年聯合發表,故取這 3 人的姓氏命名此算法。

是不是感覺 Donald Knuth 這個名字很眼熟?沒錯,在前面 這或許是講解 Knuth 洗牌算法最好的文章 一文中也出現了他!

下面直接給出 KMP算法 的操作流程:

  • 假設現在文本串 S 匹配到 i 位置,模式串 P 匹配到 j 位置
  • 如果 j = -1,或者當前字符匹配成功(即 S[i] == P[j] ),都令 i++,j++,繼續匹配下一個字符;
    如果 j != -1,且當前字符匹配失敗(即 S[i] != P[j] ),則令 i 不變,j = next[j]。此舉意味著失配時,模式串 P相對于文本串 S 向右移動了 j - next [j] 位
  • 換言之,將模式串 P 失配位置的 next 數組的值對應的模式串 P 的索引位置移動到失配處

看不明白?直接看動畫!

運行過程

以下圖文本串 S 與模式串 P 為例:

首先,列出模式串 P 的所有子串:

a???????
ab??????
aba?????
abaa????
abaab???
abaabc??
abaabca?
abaabcac

然后,求得每一個子串的所有前綴與后綴。

前綴 指除了最后一個字符以外,一個字符串的全部頭部組合;后綴 指除了第一個字符以外,一個字符串的全部尾部組合。

以第五列為例進行演示。

前綴

a???
ab??
aba?
aba?

后綴

b???
ab??
aAb?
baab

因此,它的前綴后綴的公共元素的最大長度為 2

求得原模式串 P 的子串對應的各個前綴后綴的公共元素的 最大長度表 下圖。

根據最大長度表 去求 next 數組next 數組相當于“最大長度值” 整體向右移動一位,然后初始值賦為-1。

好了,獲取了 next 數組 后,KMP 算法 的操作就很清晰了。

將模式串 P 與文本串 S 的字母一個個進行匹配,當失配的時候,模式串向右移動。

怎么移動?

比如模式串的 b 與文本串的 c 失配了,找出失配處模式串的 next數組 里面對應的值,這里為 0,然后將索引為 0 的位置移動到失配處。

轉載于:https://www.cnblogs.com/fivestudy/p/11287725.html

總結

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

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