999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于KMP算法Next數組的分析與優化

2017-04-14 03:12:14天地常州自動化股份有限公司王曉波
電子世界 2017年20期
關鍵詞:文本優化

天地(常州)自動化股份有限公司 王曉波

基于KMP算法Next數組的分析與優化

天地(常州)自動化股份有限公司 王曉波

介紹了KMP算法的基本原理和實現方法,推導了Next數組的計算方法,分析了Next數組的缺陷,提出了修改方案,并且通過實例驗證了算法的可行性和有效性。

KMP算法;Next數組;字符串匹配

1 KMP算法簡述

字符串匹配是計算機科學中最古老、研究最廣泛的問題之一。字符串匹配問題就是在一個大的字符串T中搜索某個字符串P的所有出現位置。其中,T稱為文本,P稱為模式,T和P都定義在同一個字母表上[1]。 KMP算法是一種改進的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt共同發明的,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱KMP算法)。KMP算法的關鍵是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數以達到快速匹配的目的[2]。具體實現就是實現一個Next()函數,函數本身包含了模式串的局部匹配信息。時間復雜度O(m+n)[3]。

1.1 KMP算法基本原理

KMP算法是在暴力匹配算法基礎上進行改進,從而大大提高了算法的效率。暴力匹配算法思路如下:

1)如果當前字符匹配成功(即T[i]==P[j]),則i++,j++,繼續匹配下一個字符;

2)如果失配(即T[i]!=P[j]),令i=i-(j-1),j=0。相當于每次匹配失敗時,i回溯,j 被置為0。

這樣做雖然可行,但是效率很差,因為要把"搜索位置"移到已經比較過的位置,重比一遍。一個基本事實是,當空格與D不匹配時,其實知道前面六個字符是"ABCDAB"。KMP算法的想法是,設法利用這個已知信息,不要把"搜索位置"移回已經比較過的位置,繼續把它向后移,這樣就提高了效率[4]。

1.2 Next數組的作用

怎么做到這一點呢?可以針對搜索詞,算出一張《部分匹配表》(Partial Match Table)。這張表也稱為Next數組。此也意味著在某個字符失配時,該字符對應的Next值會告訴你下一步匹配中,模式串應該跳到哪個位置(跳到Next[j]的位置)。如果Next[j]等于0或-1,則跳到模式串的開頭字符,若Next[j]=k且k>0,代表下次匹配跳到j之前的某個字符,而不是跳到開頭,且具體跳過了k個字符。

2 計算Next數組

2.1 通過代碼遞推計算Next數組

問題的關鍵就是尋找模式串中最大長度的相同前綴和后綴,找到了模式串中每個字符之前的前綴和后綴公共部分的最大長度后,便可基于此匹配。而這個最大長度便正是Next數組要表達的含義:

1)如果對于值k,已有p0 p1, ..., pk-1 = pj-k pj-k+1, ..., pj-1,相當于Next[j]= k;

2)若p[k]==p[j],則Next[j+1]=Next[j]+1=k+1;

3)若p[k]≠p[j],如果此時p[Next[k]]==p[j],則Next[j+1]=Next[k]+1,否則繼續遞歸前綴索引k=Next[k],而后重復此過程。相當于在字符p[j+1]之前不存在長度為k+1的前綴"p0 p1,…,pk-1 pk"跟后綴“pj-k pjk+1,…,pj-1 pj"相等,那么是否可能存在另一個值t+1<k+1,使得長度更小的前綴 “p0 p1,…,pt-1 pt” 等于長度更小的后綴“pj-t pj-t+1, …,pj-1 pj”呢?如果存在,那么這個t+1便是Next[j+1]的值,此相當于利用已經求得的Next數組(Next[0,...,k,...,j])進行P串前綴跟P串后綴的匹配。

2.2 算法具體實現

下面,我們來基于Next數組進行匹配。給定文本串“BBC ABCDAB ABCDABCDABDE”,和模式串“ABCDABD”,現在要拿模式串去跟文本串匹配,

1)最開始匹配時P[0]跟S[0]匹配失敗

所以執行“如果j!=-1,且當前字符匹配失敗(即S[i]!=P[j]),則令i不變,j = Next[j]”,所以j=-1,故轉而執行“如果j=-1,或者當前字符匹配成功(即S[i]==P[j]),都令i++,j++”,得到i=1,j=0,即P[0]繼續跟S[1]匹配。

P[0]跟S[1]又失配,j再次等于-1,i、j繼續自增,從而P[0]跟S[2]匹配。

P[0]跟S[2]失配后,P[0]又跟S[3]匹配。

P[0]跟S[3]再失配,直到P[0]跟S[4]匹配成功,開始執行此條指令的后半段:“如果j = -1,或者當前字符匹配成功(即S[i]==P[j]),都令i++,j++”。

2)P[1]跟S[5]匹配成功,P[2]跟S[6]也匹配成功,...,直到當匹配到P[6]處的字符D時失配(即S[10]!= P[6]),由于P[6]處的D對應的Next值為2,所以下一步用P[2]處的字符C繼續跟S[10]匹配,相當于向右移動:j-Next[j]=6-2=4位。

3)向右移動4位后,P[2]處的C再次失配,由于C對應的Next值為0,所以下一步用P[0]處的字符繼續跟S[10]匹配,相當于向右移動:j-Next[j]=2-0=2位。

4)移動兩位之后,A跟空格不匹配,模式串后移1位。

5)P[6]處的D再次失配,因為P[6]對應的Next值為2,故下一步用P[2]繼續跟文本串匹配,相當于模式串向右移動j-Next[j]=6-2=4位。

6)匹配成功,過程結束。

3 Next數組的優化

3.1 Next數組的缺陷

行文至此,咱們全面了解了暴力匹配的思路、KMP算法的原理、流程、流程之間的內在邏輯聯系,以及Next數組的簡單求解,最后基于《Next 數組》的匹配,看似洋洋灑灑,清晰透徹,但以上忽略了一個小問題。

比如,如果用之前的Next數組方法求模式串“abab”的Next數組,可得其Next數組為[-1 0 0 1],當它跟文本串去匹配的時候,如果第二個b失配,于是模式串右移j-Next[j]= 3-1=2位。右移2位后,第一個b取代了上一步第二個b的位置,必然失配。問題出在哪呢?

3.2 Next數組的改進

問題出在不該出現p[j]=p[Next[j]]。為什么呢?理由是:當p[j]!=s[i]時,下次匹配必然是p[Next[j]]跟s[i]匹配,如果p[j]=p[Next[j]],必然導致后一步匹配失敗(因為p[j]已經跟s[i]失配,然后你還用跟p[j]等同的值p[Next[j]]去跟s[i]匹配,很顯然,必然失配),所以不能允許p[j]=p[Next[j]]。如果出現了p[j]=p[Next[j]]咋辦呢?如果出現了,則需要再次遞歸,即令Next[j]=Next[Next[j]]。

只要出現了p[Next[j]]=p[j]的情況,則把Next[j]的值再次遞歸。例如在求模式串“abab”的第2個a的Next值時,如果是未優化的Next值的話,第2個a對應的Next值為0,相當于第2個a失配時,下一步匹配模式串會用p[0]處的a再次跟文本串匹配,必然失配。所以求第2個a的Next值時,需要再次遞歸:Next[2]=Next[Next[2]]=Next[0]=-1(此后,根據優化后的新Next值可知,第2個a失配時,執行“如果j=-1,或者當前字符匹配成功,都令i++,j++,繼續匹配下一個字符” ),同理,第2個b對應的Next值為0。利用優化過后的Next數組求法,可知模式串“abab”的新Next數組為:[-1 0 -1 0]。

對于優化后的Next數組可以發現一點:如果模式串的后綴跟前綴相同,那么它們的Next值也是相同的,例如模式串abcabc,它的前綴后綴都是abc,其優化后的Next數組為:[-1 0 0 -1 0 0],前綴后綴abc的Next值都為[-1 0 0]。

[1]S.Baluja.Population-based Incremental Learning[J].Technical Report,CMU-CS-94-163,CarnegieMellon University,1994.

[2]嚴蔚敏,吳偉民.數據結構第二版[M.北京:清華大學出版社,1997:42.

[3]蔣文沛.對字符串模式匹配KMP算法的探討[J].廣西民族師范學院學報,2001,08(02):72-74.

[4]胡琨元,朱云龍,汪定偉.自適應KMP算法求解合同優化匹配問題[J].系統工程,2004,22(12):87-91.

猜你喜歡
文本優化
超限高層建筑結構設計與優化思考
房地產導刊(2022年5期)2022-06-01 06:20:14
民用建筑防煙排煙設計優化探討
關于優化消防安全告知承諾的一些思考
一道優化題的幾何解法
由“形”啟“數”優化運算——以2021年解析幾何高考題為例
初中群文閱讀的文本選擇及組織
甘肅教育(2020年8期)2020-06-11 06:10:02
在808DA上文本顯示的改善
基于doc2vec和TF-IDF的相似文本識別
電子制作(2018年18期)2018-11-14 01:48:06
文本之中·文本之外·文本之上——童話故事《坐井觀天》的教學隱喻
論《柳毅傳》對前代文本的繼承與轉化
人間(2015年20期)2016-01-04 12:47:10
主站蜘蛛池模板: 亚洲色图狠狠干| 精品夜恋影院亚洲欧洲| 国产麻豆va精品视频| 亚洲高清免费在线观看| 专干老肥熟女视频网站| 国产第一页屁屁影院| 国产白浆在线观看| 91娇喘视频| 99这里只有精品在线| 人妻丰满熟妇αv无码| 国产精品福利导航| 亚洲综合在线最大成人| 国产自视频| 欧美www在线观看| 美臀人妻中出中文字幕在线| 国产丝袜无码精品| 日韩在线永久免费播放| 国产午夜一级毛片| 精品国产香蕉在线播出| 欧美黄色a| 日本人又色又爽的视频| 精品中文字幕一区在线| 久草网视频在线| 亚洲欧美日本国产综合在线| 欧美笫一页| 久久semm亚洲国产| 国产熟睡乱子伦视频网站| 国产乱论视频| 激情综合五月网| 国产99在线| 欧美日韩国产成人在线观看| 伊人久久婷婷| 自拍偷拍欧美日韩| 国产午夜小视频| 九月婷婷亚洲综合在线| 欧洲熟妇精品视频| 伊人成人在线视频| 无码中文AⅤ在线观看| 波多野结衣一区二区三区四区视频| 亚洲欧洲自拍拍偷午夜色无码| 国产在线视频欧美亚综合| 成年看免费观看视频拍拍| 日本在线亚洲| 亚洲小视频网站| 亚洲乱码视频| 国产精品尤物在线| 制服丝袜在线视频香蕉| 1024你懂的国产精品| 国产97公开成人免费视频| 亚洲欧美日韩中文字幕一区二区三区| 免费国产高清视频| a网站在线观看| 国内丰满少妇猛烈精品播| 91在线精品免费免费播放| 亚洲男人的天堂在线观看| aa级毛片毛片免费观看久| 91成人在线观看| 亚洲精品自拍区在线观看| 青草视频久久| 欧美特黄一免在线观看| 欧美yw精品日本国产精品| 亚洲国产成人精品无码区性色| 综合网天天| 99精品热视频这里只有精品7| 日韩天堂视频| 欧美区一区| 成年人免费国产视频| 最新国产麻豆aⅴ精品无| 日韩在线欧美在线| av无码一区二区三区在线| 99青青青精品视频在线| 欧美成人a∨视频免费观看| 五月婷婷导航| 欧美国产日韩在线观看| 美女啪啪无遮挡| 亚洲成肉网| 伊人成人在线| 草草影院国产第一页| 国产日韩精品欧美一区灰| 男女男免费视频网站国产| 99re热精品视频国产免费| 亚洲熟女中文字幕男人总站|