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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[算法系列之二十六]字符串匹配之KMP算法

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [算法系列之二十六]字符串匹配之KMP算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 簡介

KMP算法是一種改進的字符串匹配算法,由D.E.Knuth與V.R.Pratt和J.H.Morris同時發現,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱KMP算法)。KMP算法的關鍵是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數以達到快速匹配的目的。

二 基于部分匹配表的KMP算法

舉例來說,有一個字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含搜索串”ABCDABD”?

步驟1:字符串”BBC ABCDAB ABCDABCDABDE”的第一個字符與搜索串”ABCDAB D”的第一個字符進行比較。因為字符B與A不匹配,所以搜索串后移一位。

步驟2:因為字符B與A不匹配,所以搜索串再往后移一位。

步驟3:就這樣,直到字符串有一個字符與搜索串的第一個字符相同為止。

步驟4:接著比較字符串和搜索串的下一個字符,還是相同。

步驟5:直到字符串有一個字符與搜索串對應的字符不相同為止。

步驟6:這時,最自然的反應是,將搜索串整體后移一位,再從頭逐個比較。這樣做雖然可行,但是效率很差,因為你要把”搜索位置”移到已經比較過的位置,重比一遍。(這就是之前講的[算法系列之十二]字符串匹配之蠻力匹配)

步驟7:一個基本事實是,當空格與D不匹配時,你其實知道前面六個字符是”ABCDAB”。KMP算法的想法是,充分利用這個已知信息,不要把”搜索位置”移回已經比較過的位置,繼續把它向后移。這樣就提高了效率。

步驟8:怎么做到這一點呢?可以針對搜索串,算出一張《部分匹配表》(Partial Match Table)。這張表是如何產生的,后面再介紹,這里只要會用就可以了。

步驟9:已知空格與D不匹配時,前面六個字符”ABCDAB”是匹配的。

查表可知,最后一個匹配字符B對應的”部分匹配值”為2,因此按照下面的公式算出向后移動的位數:

移動位數 = 已匹配的字符數 - 失配字符的上一位字符對應的部分匹配值

因為 6 - 2 等于4,所以將搜索串向后移動4位,如下圖。

步驟10:因為空格與C不匹配,搜索串還要繼續往后移。這時,已匹配的字符數為2(”AB”),對應的”部分匹配值”為0。所以,移動位數 = 2 - 0,結果為 2,于是將搜索串向后移2位。

步驟11:因為空格與A不匹配,繼續后移一位。逐位比較,直到發現C與D不匹配。

于是,移動位數 = 6 - 2,繼續將搜索串向后移動4位。

步驟12:逐位比較,直到搜索串的最后一位,發現完全匹配,于是搜索完成。

如果還要繼續搜索(即找出全部匹配),移動位數 = 7 - 0,再將搜索串向后移動7位,這里就不再重復了。

三 部分匹配表(Partial Match Table)

下面介紹《部分匹配表》是如何產生的。首先,要了解兩個概念:前綴后綴

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

舉例說明:

部分匹配值就是前綴和后綴的最長的共有元素的長度

以”ABCDABD”為例。

由此得到部分匹配表,如下:

“部分匹配”的實質是,有時候,字符串頭部和尾部會有重復。比如,”ABCDAB”之中有兩個AB,那么它的”部分匹配值”就是2(AB的長度)。搜索詞移動的時候,第一個AB向后移動4位(字符串長度-部分匹配值),就可以來到第二個AB的位置。

四 基于next數組的KMP算法

通過以上的匹配過程可以看出,問題的關鍵就是尋找搜索串中最大長度的相同前綴和后綴。找到了搜索串中每個字符之前的前綴和后綴公共部分的最大長度后,便可基于此匹配。而這個最大長度便正是next 數組要表達的含義。

4.1:根據《部分匹配表》求next 數組

經過上面敘述我們已經知道搜索串“ABCDABD”各個前綴后綴的最大公共元素長度了,如下圖所示:

部分匹配表也由此而出如下所示:

有了部分匹配表我們就可以利用下面公式計算移動位數:

移動位數 = 已匹配的字符數 - 失配字符的上一位字符對應的部分匹配值

上文利用部分匹配表和移動位數計算公式進行匹配時,我們發現,當一個字符失配時,其實沒必要考慮這個失配的字符,我們每次都是看的是失配字符的上一位字符“部分匹配值”。如此,便引出了next 數組。

把next 數組跟“部分匹配表”對比后,不難發現,next 數組相當于“部分匹配表” 整體向右移動一位,然后第一個元素值賦為-1。意識到了這一點,你會驚呼原來next 數組的求解竟然如此簡單:就是找最大對稱長度的前綴后綴,然后整體右移一位,第一個元素值賦為-1(當然,你也可以直接計算某個字符對應的next值,就是看這個字符之前的字符串中有多大長度的相同前綴后綴)。

更新一下搜索串移動位數的計算公式

移動位數 = 失配字符的位置 - 失配字符next值

其實兩公式實質上是一樣的,失配字符的位置等于已匹配的字符數,失配字符next 值等于失配字符的上一位字符的部分匹配值,只是換一種說法而已。

4.2 遞推求解next數組

對于給定的字符串p,其next數組的含義是:對于k=next[j],p的前綴p[0…k-1]和p的后綴p[j-k…j-1]匹配,k要盡可能的大,且k< j。我們可以根據上述含義寫出next的蠻力計算方法。復雜度應該是O(^2)。

換個思路,現在next[0]=-1,next[1]=0。
假設k=next[j],則p[0…k-1]=p[j-k…j-1],那么求next[j+1]有兩種情況:

  • 如果p[k] = p[j],則p[0…k]=p[j-k…j],所next[j+1]=k+1=next[j]+1
  • 如果p[k] != p[j],這是可以看做另外一個字符串匹配的問題,主串和模式串都是p,當匹配失敗時,k應該如何移動呢?顯然是k=next[k]
void GetNext(string T,int next[]){int size = T.size();next[0] = -1;int k = -1;int j = 0;while(j < size - 1){// p[k]表示前綴,p[j]表示后綴if(k == -1 || T[k] == T[j]){++k;++j;next[j] = k;}//ifelse{// 回溯k = next[k];}}//while}

引用:

字符串匹配的KMP算法
從頭到尾徹底理解KMP
KMP算法求next數組
KMP算法的next[]數組通俗解釋

總結

以上是生活随笔為你收集整理的[算法系列之二十六]字符串匹配之KMP算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 精品一区二区不卡 | 黄网在线 | 国产二区精品视频 | 可以在线观看的黄色 | 国产精品久久久久久久av | 色悠悠国产精品 | 欧美精品aaa | 精品日日夜夜 | 国产一区在线视频 | 波多野结衣免费视频观看 | 精品国产丝袜一区二区三区乱码 | 日韩视频在线观看免费 | 免费看成人aa片无码视频羞羞网 | 国产精品久久久久久人妻精品动漫 | 亚洲婷婷综合网 | 2022av视频 | 中国三级视频 | 国产二区三区 | 国产精品熟女久久久久久 | 一本在线| 一区二区三区天堂 | 99欧美精品 | 免费福利av| 99久久精品免费视频 | 麻豆成人免费视频 | 91天堂在线视频 | 91看片在线观看 | 波多野42部无码喷潮 | 欧美一卡二卡 | 亚洲福利二区 | 大乳女喂男人吃奶 | 丝袜高跟av | 国产真实伦对白全集 | 欧美国产在线观看 | 热久久91| 亚洲熟女少妇一区二区 | 仙踪林av | 久久99国产综合精品免费 | 免费成人av在线播放 | 一边摸一边做爽的视频17国产 | 窝窝视频在线观看 | 亚洲精品久久久久av无码 | 国产a级精品 | 欧美十大老熟艳星 | 欧美自拍在线 | 欧美另类极品videosbest使用方法 | 白丝久久 | 国产九九精品视频 | 黄色性视频 | 国产精品久久久久久婷婷天堂 | 色香蕉网 | 每日av在线 | 天天草天天爽 | 国产又粗又猛又爽 | 欧美无马 | 在线观看免费日韩av | 91在线看黄| 日韩精品四区 | 黄色一级大片在线免费看国产一 | 成人午夜一区二区 | 色老头av | 国产情侣av自拍 | 日本欧美一区二区三区 | 亚洲一级淫片 | 91国内精品视频 | 久操视频网 | 永久黄网站色视频免费观看w | 欧美aaa级| 日韩免费毛片 | 亚洲成人一区二区在线观看 | 久久久亚洲国产精品 | 国产按摩一区二区三区 | 亚洲中字 | 亚洲久久综合 | 欧美在线视频免费 | 91在线在线 | 天天射夜夜 | 国产丰满大乳奶水在线视频 | 五月婷婷网站 | 天天色网站 | 人妻在卧室被老板疯狂进入 | 四虎最新站名点击进入 | 欧美亚洲一区二区在线观看 | 亚洲精品人妻av | 欧美黑人一区二区 | 亚洲国产精品免费视频 | 中文无码熟妇人妻av在线 | 欧美大片a | 三级小说视频 | 中文字幕亚洲综合 | 亚洲毛片在线播放 | 成人在线超碰 | 亚洲午码 | 一区二区不卡视频在线观看 | 久久亚洲色图 | 久久久xxx| 黄色va | 精品欧美一区二区精品少妇 | 91偷拍精品一区二区三区 |