




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、模式匹配的kmp算法Kmp算法是由Knuth、Morris、Pratt與1969年夏天提出的快速串匹配算法,它是由對BF算法的很大改進而成的,這主要體現在每當某趟匹配失敗是,指針不必回溯,而是利用已經得到的“部分匹配”結果,將模式向右“滑動“若干個位置后繼續比較。由于KMP算法避免了BF算法中頻繁的回溯,普遍提高了模式匹配的工作效率,因此它又被稱為“不回溯的字符串搜索算法”。假設有目標串T(t0,t1,t2,t3,tm-1)和模式串P(p,p1,p2,p3,pn-1),使用BF算法進行模式匹配,當進行第一輪比較時,若tkpk,則算法結束本輪比較,如下所示: T t0,t1,t2,tk,tk+1
2、,tn-2,tn-1,tm-2,tm-1 P p0,p1,p2,pk,pk+1,pn-2,pn-1 (第一輪比較結束)由于在字符串與中第一個不相等的字符位于處,所以兩字符串前個字符是相等的。此時,可用字符串P(p0,p1,p2,p3,pk-1) 字符串T(t0,t1,t2,t3,tk-1),于是原目標串可轉化為T(p0,p1,p2,p3,pk-1,pk,tm-1)。在進行第二輪比較前,算法同樣把字符串P整體向后移動一個字符,此時字符串T與P之間的關系如下: T p0,p1,p2,pk-1,pk, tn-2,tn-1,tm-2,tm-1 P p0,p1,p2,pk,pk+1,pn-2,pn-1(
3、第二輪比較)在第二輪比較中算法首先要比較的字符是P中首字符p0與T中第二個字符p1,若p0與p1相等,則算法順序比較P中第二個字符p1與T中第三個字符p2;若不等,則算法仍然把模式串P整體向后移動一個字符,此時字符串T與P之間的關系如下 T p0,p1,p2,pk-1,pk, tn-2,tn-1,tm-2,tm-1P p0,pk-3,pk-2,pn-1(第三次比較)算法依照同樣的次序,首先對P中字符p0與T中字符p2進行比較,若相等,則順序比較后續的字母;若不等,則把字符串P整體向后移動一個字符。仔細考慮上述過程,可能會發現:在第二輪比較開始是,首先進行比較的字符是p0和p1,其次進行的是p1
4、和p2;在第三輪比較開始時,首先進行比較的是p0與p2,其次進行的是 p1和p3。而p0,p1,p2,p3全部是字符串P中的字符,它們之間的關系可以在調用字符串匹配算法前就確定下來。 KMP算法正式利用這種思想,算法在對字符串進行匹配前,先計算出,模式串P中個字符的關系,然后再依據此關系對模式串與目標串T進行匹配。在上述過程中,記錄字符串P中各個字符之間關系的函數成為字符串P的失效函數。 下面是失效函數獲取的辦法(對于P=“caatcat”): 首先確定函數的定義域,失效函數自變量j的取值范圍是模式串在失配前匹配的字符個數,那么它的定義域為j0,1,2,3,4,5,由此可見失效函數的定義域是0
5、-len(p)-1。 接著是獲取失效函數值域的辦法,失效函數的取值k定義如下 Kk|0<=k<j其中,k是滿足條件p0p1pk=pj-kpj-k+1pj的最大正整數。這樣的k有可能并不存在,此時規定失效函數的取值為-1。下面是利用上述規則求字符串P的失效函數值域的過程: 當j=0時,由于0<=k<0,所以滿足條件的k并不存在,此時失效函數的取值為-1,即f(0)=-1.當j=1時,k可能的取值為0,由于p0 p1,所以k不能取0,此時滿足條件的失效函數的值仍為-1,即f(1)=-1。當j=2時,k的可能取值為0,1。由于p0p2且p0p1 p1p2,所以滿足條件的k不存
6、在,即f(2)=-1。當j=3時,k可能的取值為0,1,2。由于p0p3,p0p1p2 p3且p0p1p2p1p2 p3。所以滿足條件的k不存在,即f(3)=-1。當j=4時,k可能的取值為0,1,2,3。由于p0=p4,p0p1p3 p4,p0p1 p2p2 p3 p4且p0p1 p2 p3p1p2 p3 p4。所以滿足條件的k為0,此時f(4)=0。當j=5時,k可能的取值為0,1,2,3,4。由于p0p5,p0p1= p4p5,p0p1p2p3 p4 p5,p0p1 p2 p3p2 p3 p4 p5且p0p1 p2 p3 p4p1p2 p3 p4 p5,所以f(5)=1;同理可求當j=6
7、時,f(6)=-1。求完模式串p的失效函數后,就可以應用KMP算法對它進行匹配。具體的匹配過程分為兩種情況。假設在進行某一輪比較時,失配的情況發生在模式p的第j位,那么如果j=0,則讓目標的指針前進一位,模式串的起始比較地址 回到P0處。否則,在進行下一輪的比較時,目標指針不發生回溯,仍指向失配的位置,而模式串的起始比較地址為Pf(j-1)+1.由失效函數的計算過程可見,函數f(j)僅與字符串P有關,而與目標串無關。所以只需給定模式字符串P,無論目標字符串T的取值是什么,均可應用同一個失配函數對它匹配。例子 模式串P=”caatcat”,目標串T=”ctcaatcacaatcat”。第一次比較
8、: T c t c a a t c a c a a t c a t P c a a t c a t第二輪比較: T c t c a a t c a c a a t c a t P c a a t c a t第三輪比較: T c t c a a t c a c a a t c a t P c a a t c a t第四輪比較: T c t c a a t c a c a a t c a t P c a a t c a t第一輪比較,模式串與目標串在第二個字符處發生匹配 。算法檢測到失陪后結束本輪比較,并且指針不發生回溯,仍指向失配位置。由于失配發生在第二個字符處,此時j=1,所以模式匹配P在下一
9、輪匹配時的起始比較地址是P f(1-1)+1,即p0。第二輪比較中,由于模式字符串P所在的第一個字符處發生失配,此時j=0,所以讓目標的指針前進一位,模式的其實比較位置回到p0。接著進行第三輪比較。模式串P中的第7個字符發生失配,此時j=6。可知下一輪匹配的起始比較位置為P f(6-1)+1,即p2。目標指針不發生回溯,仍指向失配位置。接著進行第四輪匹配,第四輪匹配成功。 T c t c a a t c a c a a t c a tP c a a t c a t (成功)#include<stdio.h>#include<string.h>char str1000,s
10、t1000;int next1000;void getf()int j=0,k=-1,m;next0=-1;m=strlen(st);while(j<m)if(k=-1|stj=stk)j+;k+;if(stj!=stk)nextj=k;else nextj=nextk;else k=nextk;for(j=0;j<m;j+)printf("%d ",nextj);int KMP()int i=0,j=0;memset(next,0,sizeof(next);getf();int m=strlen(str);int n=strlen(st);while(i<m&&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 樂器行裝修預定金合同
- 健身房裝修租賃協議模板
- 電力工程服務居間合同范例
- 航海心理學課件
- 油漆店面的安全
- 社區組織安全教育
- 2024沈陽職業技術學院附屬中等職業學校工作人員招聘考試及答案
- 2024洛陽綠業信息中等專業學校工作人員招聘考試及答案
- 2024甘南藏族自治州中等職業學校工作人員招聘考試及答案
- 2024滄縣職業技術教育中心工作人員招聘考試及答案
- 《傳銷與直銷》課件
- 驗貨監裝柜合同范例
- 老年便秘個案護理查房
- 社會調查開題報告
- 【MOOC】生命的教育-浙江大學 中國大學慕課MOOC答案
- 消防課件-新能源汽車撲救
- (2024年更新)國家慢性疾病編碼新目錄
- 治療室物品分類擺放
- 一次性使用醫療用品管理制度
- 獸醫屠宰衛生人員考試題庫及答案(415題)
- 商務預算員培訓課件
評論
0/150
提交評論