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

模式匹配KMP 算法思想分析

2020-08-27 13:06:12任憲臻任美玲
魅力中國 2020年31期

任憲臻 任美玲

(1.北京信息職業技術學院 軟件與信息學院,北京 100018;2.煙臺南山學院 工學院計算機系,山東 煙臺 265700)

KMP 算法由 Knuth、Morris 和 Pratt 共同提出并設計的模式匹配改進算法,稱之為 Knuth-Morris-Pratt 算法,簡稱 KMP 算法。KMP 算法對BF 算法做了很大的改進。分析BF 算法的執行過程,造成BF 算法效率低的原因是回溯,即在某趟匹配失敗后,對于主串S 要回溯到本趟匹配開始字符的下一個字符,模式T 要回溯到第一個字符,而這些回溯往往是不必要的。若主串S=“ababcabcacbab”,模式T=“abcac”,現在我們來分析一下在BF 算法,在哪些情況下回溯是沒有必要的。主串S 和模式T 的表示如下圖1 所示。

圖1 主串S 和模式T

第一趟匹配:開始下標i=0,j=0,當i=2,j=2 時匹配失敗。利用本趟部分匹配的結果:S[1]=T[1]且T[0]≠T[1],我們可以得到這樣的關系:S[1]≠ T[0]。

第二趟匹配:如果需要進行,則應該是從開始下標i=1,j=0 開始,但是利用第一趟匹配中得到的結果S[1]≠ T[0],所以第二趟匹配是沒有必要進行的。

第三趟匹配:因為第二趟匹配是不必要的,所以第三趟匹配是從i=2,j=0 開始,當i=6,j=4 時匹配失敗。利用本趟部分匹配的結果:S[3]=T[1]且T[0]≠T[1],S[4]=T[2]且T[0]≠T[2],S[5]=T[3]且T[0]=T[3],我們可以得到這樣的關系:S[3]≠T[0],S[4]≠T[0],S[5]=T[0]。

第四趟匹配:如果需要進行,則應該是從下標i=3,j=0 開始,但是利用第三趟部分匹配的結果S[3]≠ T[0],所以第四趟匹配也是沒有必要進行的。

第五趟匹配:如果需要進行,則應該是從下標i=4,j=0 開始,但是利用第三趟部分匹配的結果S[4]≠ T[0],所以第五趟匹配也是沒有必要進行的。

第六趟匹配: 這趟匹配本應該從i=5,j=0 開始進行,但是利用第三趟部分匹配的結果S[5]=T[0],所以第6 趟匹配可以從i=6,j=1 時進行,即從S[6]和T[1]開始進行比較。當i=10,j=5 時,模式T 中的全部字符都被比較完畢,所以模式匹配成功,此時應該返回模式T 在主串S 中的位置序號6。

如果應用模式匹配BF 算法對上述實例進行匹配,需要進行六趟匹配,而且每次匹配主串S 和模式T 都需要回溯,而通過上述實例分析我們可以看到,在這六趟匹配中,如果能夠充分利用第三趟部分匹配成功的結果,則第二、第四和第五這三趟匹配是沒有必要進行的,所以總共只需要進行三趟匹配就可以得到最終的匹配結果,這種模式匹配的過程也就是KMP 算法的中心思想。因此,KMP 算法的主要思想是:每當某趟匹配失敗時,主串下標不回溯,而是利用已經得到的部分匹配的結果,將模式T向右“滑動”盡可能遠的一段距離后,繼續進行比較。

所以現在的問題就是如何確定模式T 向右“滑動”的距離,即:當某趟匹配在S[i]和T[j]匹配失敗后,如何做到主串S 的下標i 不回溯,而是根據當前部分匹配結果,確定模式T 的下標j 需要回溯到某個位置k,使得T[k]對準S[i]繼續進行比較。若主串S 和模式T 的某趟匹配在S[i]和T[j]匹配失敗后,j需回溯到位置k,那么根據當前部分匹配結果,有以下等式成立:T[k-1]=S[i-1]、T[k-2]=S[i-2]、T[k-3]=S[i-3]……T[0]=S[i-k],同時因為下一趟比較應該從S[i]和T[k]開始,若此趟匹配中,S[i]和T[j]匹配失敗,那么在部分匹配成功時,我們又會有這樣的等式成立:T[j-1]=S[i-1]、T[j-2]=S[i-2]、T[j-3]=S[i-3]……T[j-k]=S[i-k]。綜合這些等式,我們可以得到:T[0]~ T[k-1]=T[j-k]~T[j-1],這個等式說明:模式T 的下標j 需要回溯到某個位置k 與j 具有函數關系,由當前匹配失敗的位置j,可以計算出k 的值。

現在我們來看一下T[0]~ T[k-1]=T[j-k]~ T[j-1]代表的物理意義。T[0]~ T[k-1]表示以T[0]開頭的長度為k 的前綴子串,而T[j-k]~ T[j-1]表示以T[j-1]結尾的長度為k 的后綴子串。對于模式T=“ababac”,當j=5時,因為T[0]=T[4]時,所以有k=1;又因為T[0]T[1]T[2]=T[2]T[3]T[4],所以k=3。所以當主串S 中的S[i]與模式T 中的T[j]不匹配時,需將S[i]與T[k]比較,此時選取k 的原則是:模式T 的前k 個字符子串等于T[j]之前的k 個字符子串,并且是具有此性質的最大子串的串長,也就是max {k |1 ≤k <j 且T[0]… T[k-1]=T[j-k]… T[j-1]}。

在模式T=“t1t2…tm”中,因為在T的每一個位置都可能發生不匹配的情況,所以模式T 中的每個字符T[j](0 ≤j <m) 都有一個與之對應k 值,而且這個k 值僅與模式T 本身有關而與主串S 無關(因為T[0]~ T[k-1]=T[j-k]~ T[j-1])。通常會定義next[j]函數來表示T[j](0 ≤j <m)對應的k 值,也就是用一個數組next 來保存模式T 中的每一個字符T[j](0 ≤j <m)所對應的k 值,通常next[j]函數的定義形式如下所示:

在next[j]函數的定義中next[j]=k 表示在匹配過程中當S[i]!=T[j]時,下標j 的回溯位置。通過next[j]函數求出模式T 的next 值后,KMP 算法的偽代碼描述如下所示:

算法:KMP

輸入:主串S,模式T,模式T 的next 值

輸出:T 在S 中的位置

1.設定S 和T 比較的開始下標i=0,j=0;

2.重復2.1-2.3 中的操作,直到S 或T 的所有字符均被比較完畢:

(1)如果S[i]==T[j],繼續比較S 和T 的下一對字符;

(2)否則,將j 回溯到next[j]位置,即j=next[j];

(3)如果 j==-1,則i++,j++,準備下一趟比較;

3.如果T 中所有字符均被比較完畢,則返回本趟匹配的開始位置;否則返回 0;

KMP 算法是一種經典的模式匹配改進算法,它消除了主串中下標回溯的問題,因而提高了匹配的效率,但是僅當模式與主串之間存在很多部分匹配情況下,KMP 算法那才能體現它的優勢,否則和BF 模式匹配算法差別不大。

主站蜘蛛池模板: 亚洲中文字幕无码爆乳| 国产三级毛片| 国产精品久久久久久搜索| 天堂在线亚洲| 国产精品无码AV片在线观看播放| 91精品国产一区| 亚洲日韩精品综合在线一区二区| 色综合五月婷婷| 内射人妻无套中出无码| 美女扒开下面流白浆在线试听| 国模视频一区二区| 亚洲人成网站色7799在线播放 | 91久久国产成人免费观看| 91精品网站| 一区二区三区国产精品视频| 久草视频中文| 动漫精品中文字幕无码| 有专无码视频| 久久99国产综合精品女同| 成人精品午夜福利在线播放| 精品久久久久久久久久久| 任我操在线视频| 久一在线视频| 国产一区二区影院| 国产伦精品一区二区三区视频优播| 欧美成人第一页| 亚洲人成网7777777国产| 伊人激情综合网| 国产在线观看第二页| 一级毛片免费观看不卡视频| 国产在线视频二区| 内射人妻无套中出无码| 人妻少妇久久久久久97人妻| 精品亚洲国产成人AV| 日本www在线视频| 国产又色又刺激高潮免费看| 国产日韩欧美一区二区三区在线| 免费国产高清视频| 欧美性猛交xxxx乱大交极品| 国产成人无码综合亚洲日韩不卡| 亚洲成人77777| 国产剧情国内精品原创| 日韩人妻少妇一区二区| 欧洲av毛片| 国产精品亚洲专区一区| 国产乱人乱偷精品视频a人人澡| 国产九九精品视频| 亚洲无码高清视频在线观看| 福利在线一区| 欧美福利在线播放| 精品久久久久久中文字幕女| 国产不卡网| 99在线观看国产| 国产精品亚洲а∨天堂免下载| 国产免费黄| 国产在线98福利播放视频免费| 97精品国产高清久久久久蜜芽| 成人毛片免费观看| 国产免费怡红院视频| 91精品最新国内在线播放| 亚洲中文精品人人永久免费| a天堂视频在线| 国产乱人伦AV在线A| 色天堂无毒不卡| 免费啪啪网址| 午夜福利视频一区| 99久久这里只精品麻豆| 国产精品网址你懂的| 国产在线精品美女观看| 国产高清毛片| 这里只有精品国产| 久久久国产精品无码专区| 国产成人高清在线精品| 日本精品一在线观看视频| 亚洲嫩模喷白浆| 国产在线拍偷自揄拍精品| 欧美五月婷婷| 国产在线拍偷自揄拍精品| 91偷拍一区| 女同国产精品一区二区| 国产成人亚洲精品蜜芽影院| 国产综合在线观看视频|