




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、KMP算法一、樸素的字符串匹配一、樸素的字符串匹配我們可以寫出很容易實現(xiàn)的字符串匹配的算法,從A的起始位置和B的起始位置開始比較,如果匹配不成功則從A原先起始位置的下一位開始和B的起始位置開始比較。如果A和B的字符個數(shù)分別是m和n,那么這個算法的效率是O(mn),雖然大部分情況下不至于m*n次但還是有很多不幸的情況發(fā)生。一、樸素的字符串匹配一、樸素的字符串匹配設(shè)A=“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab” B=“aaaaaaaab”按照樸素算法,每次比到B的最后一位發(fā)現(xiàn)不同又要重新從B的開頭和A的下一個字符開始比較。一、樸素的字符串匹配一、樸素的字符串匹配樸素算法
2、中不可避免的存在“回溯”現(xiàn)象,因此降低了算法的效率,下面介紹的是一種最壞情況下O(n)的算法(這里假設(shè) m=n),即傳說中的KMP算法。二、算法概述二、算法概述KMP算法是用來處理字符串匹配的。換句話說,給你兩個字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。例如”Today is Tuesday”.中是否包含”day”,在哪些位置包含。這個算法是由Knuth、Morris、Pratt三個提出來的,取了這三個人的名字的頭一個字母。二、算法概述二、算法概述假如,A=abababaababacb,B=ababacb,我們來看看KMP是怎么工作的。我們用兩個指針i和j分別表示,Ai-j
3、+ 1.i與B1.j完全相等。也就是說,i是不斷增加的,隨著i的增加j相應(yīng)地變化,且j滿足以Ai結(jié)尾的長度為j的字符串正好匹配B串的前 j個字符(j當然越大越好),現(xiàn)在需要檢驗Ai+1和Bj+1的關(guān)系。當Ai+1=Bj+1時,i和j各加一;什么時候j=m了,我們就說B是A的子串(B串已經(jīng)整完了),并且可以根據(jù)這時的i值算出匹配的位置。二、算法概述二、算法概述當Ai+1Bj+1,KMP的策略是調(diào)整j的位置(減小j值)使得Ai-j+1.i與B1.j保持匹配且新的Bj+1恰好與Ai+1匹配(從而使得i和j能繼續(xù)增加)。我們看一看當 i=j=5時的情況。位置。i: 1 2 3 4 5 6 7 8 9
4、10A: a b a b a b a a b a b B: a b a b a c bj: 1 2 3 4 5 6 7 8 9 10B: a b a b a c bj: 1 2 3 4 5 6 7 8 9 10i: 1 2 3 4 5 6 7 8 9 10A: a b a b a b a a b a b B: a b a b a c bj: 1 2 3 4 5 6 7 8 9 10二、算法概述二、算法概述從上面的這個例子,我們可以看到,新的j可以取多少與i無關(guān),只與B串有關(guān)。我們完全可以預(yù)處理出這樣一個數(shù)組Pj,表示當匹配到B數(shù)組的第j個字母而第j+1個字母不能匹配了時,新的j最大是多少。Pj
5、應(yīng)該是所有滿足B1.Pj=Bj-Pj+1.j的最大值。A: a b a b a b a a b a b i: 1 2 3 4 5 6 7 8 9 10A: a b a b a b a a b a b B: a b a b a c bj: 1 2 3 4 5 6 7 8 9 10二、算法概述二、算法概述此時,A7=B5,又出現(xiàn)Ai+1Aj+1的情況,由于P5=3,所以j=3。A: a b a b a b a a b a b i: 1 2 3 4 5 6 7 8 9 10A: a b a b a b a a b a b B: a b a b a c bj: 1 2 3 4 5 6 7 8 9 10
6、i: 1 2 3 4 5 6 7 8 9 10A: a b a b a b a a b a b B: a b a b a c bj: 1 2 3 4 5 6 7 8 9 10二、算法概述二、算法概述此時,i=7,j=3,依舊Ai+1Aj+1,我們將j的值改為P3=1。A: a b a b a b a a b a b i: 1 2 3 4 5 6 7 8 9 10A: a b a b a b a a b a b B: a b a b a c bj: 1 2 3 4 5 6 7 8 9 10i: 1 2 3 4 5 6 7 8 9 10A: a b a b a b a a b a b B: a b
7、 a b a c bj: 1 2 3 4 5 6 7 8 9 10二、算法概述二、算法概述依舊Ai+1Aj+1,我們將j的值改為P1=0。A: a b a b a b a a b a b i: 1 2 3 4 5 6 7 8 9 10A: a b a b a b a a b a b B: a b a b a c bj: 1 2 3 4 5 6 7 8 9 10i: 1 2 3 4 5 6 7 8 9 10A: a b a b a b a a b a b B: a b a b a c bj: 0 1 2 3 4 5 6 7 8 9 10二、算法概述二、算法概述i: 1 2 3 4 5 6 7 8
8、 9 10A: a b a b a b a a b a b B: a b a b a c bj: 0 1 2 3 4 5 6 7 8 9 10終于,A8=B1,i變?yōu)?,j為1。事實上,有可能j到了0仍然不能滿足Ai+1=Bj+1(比如A8=d時)。因此,準確的說法是,當j=0了時,我們增加i值但忽略j直到出現(xiàn)Ai=B1為止。二、算法概述二、算法概述【算法實現(xiàn)】最后的j:=Pj是為了讓程序繼續(xù)做下去,因為我們有可能找到多處匹配。 這個程序或許比想像中的要簡單,因為對于i值的不斷增加,代碼用的是for循環(huán)。因此,這個代碼可以這樣形象地理解:掃描字符串A,并更新可以匹配到B的什么位置。 j:=0;
9、 for i:=1 to m do begin while (j0)and(aibj+1) do j:=Pj; if ai=bj+1 then inc(j); if j=n then begin writeln(Found at ,i-n+1); j:=Pj; end; end;二、算法概述二、算法概述在此我們應(yīng)該注意一個現(xiàn)象,Pi的值既是B串前i個中的最大相同前后綴的個數(shù)。B: a b a b a c bP: 0 0 1 2 3 求P數(shù)組的值二、算法概述二、算法概述預(yù)處理不需要按照P的定義寫成O(m2)甚至O(m3)的。我們可以通過P1,P2,.,Pj-1的值來獲得Pj的值。對于剛才的B=“
10、ababacb”,假如我們已經(jīng)求出了P1,P2,P3和P4,看看我們應(yīng)該怎么求出P5和P6。B: a b a b a c bP: 0 0 1 2求P數(shù)組的值由于P4=2,可知B3.4=B1.2,由于B5=B3=a,所以可知P5=33B: a b a b a c b二、算法概述二、算法概述現(xiàn)在求P6。由于P5=3,可知B3.5=B1.3求P數(shù)組的值B6B4,沒有找到相同的前后綴,那么我們能否退而求其次,看在更小的范圍內(nèi)是否能找到Bi+1=Bj+1的情況。在P5=3的范圍內(nèi)能保證的最大相同前后綴是P3=1,因此我們對齊,再做嘗試,仍然不行,直到P6=0B: a b a b a c bP: 0 0
11、1 2 3B: a b a b a c bB: a b a b a c bP: 0 0 1 2 3B: a b a b a c b0二、算法概述二、算法概述怎么這個預(yù)處理過程跟前面的KMP主程序這么像呢?其實,KMP的預(yù)處理本身就是一個B串“自我匹配”的過程。它的代碼和上面的代碼神似:求P數(shù)組的值 P1:=0;j:=0; for i:=2 to n do begin while (j0)and(bibj+1) do j:=Pj; if bi=bj+1 then inc(j); Pi:=j; end;三、算法分析三、算法分析為什么這個程序是O(n)的?其實,主要的爭議在于,while循環(huán)使得執(zhí)行
12、次數(shù)出現(xiàn)了不確定因素。我們將用到時間復(fù)雜度的攤還分析中的主要策略,簡單地說就是通過觀察某一個變量或函數(shù)值的變化來對零散的、雜亂的、不規(guī)則的執(zhí)行次數(shù)進行累計。KMP的時間復(fù)雜度分析可謂攤還分析的典型。我們從上述程序的j 值入手。每一次執(zhí)行while循環(huán)都會使j減?。ǖ荒軠p成負的),而另外的改變j值的地方只有第五行。每次執(zhí)行了這一行,j都只能加1;因此,整個過程中j最多加了n個1。于是,j最多只有n次減小的機會(j值減小的次數(shù)當然不能超過n,因為j永遠是非負整數(shù))。這告訴我們,while循環(huán)總共最多執(zhí)行了n次。按照攤還分析的說法,平攤到每次for循環(huán)中后,一次for循環(huán)的復(fù)雜度為O(1)。整個過
13、程顯然是O(n)的。這樣的分析對于后面P數(shù)組預(yù)處理的過程同樣有效,同樣可以得到預(yù)處理過程的復(fù)雜度為O(m)。四、算法應(yīng)用四、算法應(yīng)用 最后補充一點:由于KMP算法只預(yù)處理B串,因此這種算法很適合這樣的問題:給定一個B串和一群不同的A串,問B是哪些A串的子串。串匹配是一個很有研究價值的問題。事實上,我們還有后綴樹,自動機等很多方法,這些算法都巧妙地運用了預(yù)處理,從而可以在線性的時間里解決字符串的匹配。next值的求法值的求法例如: 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2next數(shù)組的求解方法是:第一位的next值為0,第二位的next值為1,后面求解每
14、一位的next值時,根據(jù)前一位進行比較。首先將前一位與其next值對應(yīng)的內(nèi)容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續(xù)尋找next值對應(yīng)的內(nèi)容來與前一位進行比較,直到找到某個位上內(nèi)容的next值對應(yīng)的內(nèi)容與前一位相等為止,則這個位對應(yīng)的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內(nèi)容,那么需求的位上的next值即為1。next值的求法值的求法例如: 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 21.前兩位必定為0和1。2.計算第三位的時候,看第二位b的next值,為1,則把b和1對應(yīng)的a進行
15、比較,不同,則第三位a的next的值為1,因為一直比到最前一位,都沒有發(fā)生比較相同的現(xiàn)象。next值的求法值的求法例如: 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 23.計算第四位的時候,看第三位a的next值,為1,則把a和1對應(yīng)的a進行比較,相同,則第四位a的next的值為第三位a的next值加上1。為2。因為是在第三位實現(xiàn)了其next值對應(yīng)的值與第三位的值相同。next值的求法值的求法例如: 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 24.計算第五位的時候,看第四位a的next值,為2,則把a和2對應(yīng)的b進行比較
16、,不同,則再將b對應(yīng)的next值1對應(yīng)的a與第四位的a進行比較,相同,則第五位的next值為第二位b的next值加上1,為2。因為是在第二位實現(xiàn)了其next值對應(yīng)的值與第四位的值相同。next值的求法值的求法例如: 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 25.計算第六位的時候,看第五位b的next值,為2,則把b和2對應(yīng)的b進行比較,相同,則第六位c的next值為第五位b的next值加上1,為3,因為是在第五位實現(xiàn)了其next值對應(yīng)的值與第五位相同。next值的求法值的求法例如: 模式串 a b a a b c a c next值 0 1 1 2 2
17、3 1 2 6.計算第七位的時候,看第六位c的next值,為3,則把c和3對應(yīng)的a進行比較,不同,則再把第3位a的next值1對應(yīng)的a與第六位c比較,仍然不同,則第七位的next值為1。7.計算第八位的時候,看第七位a的next值,為1,則把a和1對應(yīng)的a進行比較,相同,則第八位c的next值為第七位a的next值加上1,為2,因為是在第七位和實現(xiàn)了其next值對應(yīng)的值與第七位相同。nextval值的求法值的求法例如主串為“aaabaaaab”、 模式串為“aaaab”在計算nextval之前要先弄明白,nextval是為了彌補next函數(shù)在某些情況下的缺陷而產(chǎn)生的。例如主串為“aaabaaa
18、ab”、模式串為“aaaab”那么,比較的時候就會發(fā)生一些浪費的情況:比較到主串以及模式串的第四位時,發(fā)現(xiàn)其值并不相等,據(jù)我們觀察,我們可以直接從主串的第五位開始與模式串進行比較,而事實上,卻進行了幾次多余的比較。使用nextval可以去除那些不必要的比較次數(shù)。nextval值的求法值的求法例如主串為“aaabaaaab”、 模式串為“aaaab”求nextval數(shù)組值有兩種方法,一種是不依賴next數(shù)組值直接用觀察法求得,一種方法是根據(jù)next數(shù)組值進行推理,兩種方法均可使用,視更喜歡哪種方法而定。nextval值的求法值的求法模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 nextval值 0 1 0 2 1 3 0 21.第一位的nextval值必定為0,第二位如果于第一位相同則為0,如果不同則為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 超市防盜與安全監(jiān)控策略
- 高效的時間管理藝術(shù)在商業(yè)中的應(yīng)用及匯報重點
- 工程經(jīng)濟呂正輝呂正輝41課件
- 腦積水的護理常規(guī)
- 六險二金總部鄂爾多斯淮河能源西部煤電集團2025屆招聘100名工作人員筆試參考題庫附帶答案詳解
- 通過信息技術(shù)助力企業(yè)降低成本并提升工作效率的路徑探討
- 外語專家聘用合同范本
- 廣東醫(yī)科大學(xué)《水工程設(shè)施運營與管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年福建省寧德市霞浦縣數(shù)學(xué)四下期末調(diào)研試題含解析
- 上海第二工業(yè)大學(xué)《建筑施工組織課程實訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 科學(xué)計算語言Julia及MWORKS實踐 課件 4-Syslab簡介
- 2024年高考語文復(fù)習(xí):酬和類古代詩歌閱讀 專項練習(xí)題匯編(含答案解析)
- GB/T 36547-2024電化學(xué)儲能電站接入電網(wǎng)技術(shù)規(guī)定
- 醫(yī)療廢物管理條例
- 消防工程常用設(shè)施三維圖解
- 慢性乙型肝炎防治指南(2022年版)解讀
- 搟筋課件教學(xué)課件
- 醫(yī)院工程改造工程施工組織設(shè)計方案
- 英語人稱代詞和物主代詞練習(xí)題(附答案)
- 計算機一級考試WPS試題及答案
- 《Windows server操作系統(tǒng)》Windows Server 2019全套教學(xué)課件
評論
0/150
提交評論