




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、BM模式匹配算法原理(圖解) 修改瀏覽權(quán)限 | 刪除 首先,先簡單說明一下有關(guān)BM算法的一些基本概念。BM算法是一種精確字符串匹配算法(區(qū)別于模糊匹配)。BM算法采用從右向左比較 的方法,同時應(yīng)用到了兩種啟發(fā)式規(guī)則,即壞字符規(guī)則 和好后綴規(guī)則 ,來決定向右跳躍的距離。BM算法的基本流程: 設(shè)文本串T,模式串為P。首先將T與P進(jìn)行左對齊,然后進(jìn)行從右向左比較 ,如下圖所示: 若是某趟比較不匹配時,BM算法就采用兩條啟發(fā)式規(guī)則,即壞字符規(guī)則 和好后綴規(guī)則 ,來計算模式串向右移動的距離,直到整個匹配過程的結(jié)束。
2、160; 下面,來詳細(xì)介紹一下壞字符規(guī)則 和好后綴規(guī)則 。 首先,詮釋一下壞字符和好后綴的概念。 請看下圖: 圖中,第一個不匹配的字符(紅色部分)為壞字符,已匹配部分(綠色)為好后綴。 1)壞字符規(guī)則(Bad Character): 在BM算法從右向左掃描的過程中,若發(fā)現(xiàn)某個字符x不匹配,則按如下兩種情況討論: &
3、#160; i. 如果字符x在模式P中沒有出現(xiàn),那么從字符x開始的m個文本顯然不可能與P匹配成功,直接全部跳過該區(qū)域即可。 ii. 如果x在模式P中出現(xiàn),則以該字符進(jìn)行對齊。 用數(shù)學(xué)公式表示,
4、設(shè)Skip(x)為P右移的距離,m為模式串P的長度,max(x)為字符x在P中最右位置。 例1: 下圖紅色部分,發(fā)生了一次不匹配。
5、 計算移動距離Skip(c) = 5 - 3 = 2,則P向右移動2位。 移動后如下圖: 2)好后綴規(guī)則(Good Suffix):
6、0; 若發(fā)現(xiàn)某個字符不匹配的同時,已有部分字符匹配成功,則按如下兩種情況討論: i. 如果在P中位置t處已匹配部分P'在P中的某位置t'也出現(xiàn),且位置t'的前一個字符與位置t的前一個字符不相同,則將P右移使t'對應(yīng)t方才的所在的位置。
7、; ii. 如果在P中任何位置已匹配部分P'都沒有再出現(xiàn),則找到與P'的后綴P''相同的P的最長前綴x,向右移動P,使x對應(yīng)方才P''后綴所在的位置。 用數(shù)學(xué)公式表示,設(shè)Shift(j)為P右移的距離,m為模式串P的長度,j 為當(dāng)前所匹配的字符位置,s為t'與t的距離(以上情況i)或者x與P''的距離(以上情況ii)。 &
8、#160; 以上過程有點抽象,所以我們繼續(xù)圖解。 例2: 下圖中,已匹配部分cab(綠色)在P中再沒出現(xiàn)。 &
9、#160; 再看下圖,其后綴T'(藍(lán)色)與P中前綴P'(紅色)匹配,則將P'移動到T'的位置。 移動后如下圖: &
10、#160; 自此,兩個規(guī)則講解完畢。 在BM算法匹配的過程中,取SKip(x)與Shift(j)中的較大者作為跳躍的距離。 BM算法預(yù)處理時間復(fù)雜度為O(m+s),空間復(fù)雜度為O(s),s是與P, T相關(guān)的有限字符集長度,搜索階段時間復(fù)雜度為O(m·n)。最好情況下的時間復(fù)雜度為O(n/m),最壞情況下時間復(fù)雜度為O(m·n)。(二)所謂精確字符串匹配問題,是在文本 T 中找到所有與查詢 P 精確匹配的子串。而 BM 算法可以非常有效地解決這個問題,讓時間復(fù)
11、雜度降到低于線形的水平。 BM 算法主要用了三種巧妙而有效的方法,即從右到左掃描,壞字符規(guī)則和好后綴規(guī)則。 從右到左掃描的意思是從最后一個字符開始向前匹配,而不是習(xí)慣上的從開頭向后匹配。 壞字符規(guī)則是,從右到左的掃描過程中,發(fā)現(xiàn) Ti 與 Pj 不同,如果P 中存在一個字符 Pk 與 Ti 相同,且 k<i 那么就將直接將 P 向右移使 Pk 與 Ti 對齊,然后再從右到左進(jìn)行匹配。如果 P 中不存在任何與 Ti 相同的字符,則直接將 P 的第一個字符與 Ti 的下一個字符對齊,再從右到左進(jìn)行比較。
12、60; 如圖: T: a b c b a d f t a t e P: c b a x a d P: c b a x a d 用 R(x) 表示字符 x 在 P 中出現(xiàn)的最右位置,此例中 R(b)=2。 可以看出使用從右到左掃描和壞字符規(guī)則可以跳過 T 中的很多
13、位置不去檢查,從而使時間復(fù)雜度低于線性。 好后綴規(guī)則是,從右到左的掃描過程中,發(fā)現(xiàn) Ti 與 Pj 不同,檢查一下相同的部分 t 是否在 P 中的其他位置 t' 出現(xiàn),a) 如果 t 與 t' 的前一個字母不相同,就將 P 向右移,使 t' 與 T 中的 t 對齊。b) 如果 t' 沒有出現(xiàn),則找到與 t 的后綴相同的 P 的最長前綴 x,向右移動P ,使 x 與 T 中 t 的后綴相對應(yīng)。 如圖a): N: &
14、#160; 1 N: 1 2 3 4 5 6 7 8 9 0
15、1 2 3 4 5 6 7 8 T: a b c b a d f t b c f a q v t b c e. P: c b c a b c e a b c P:
16、; c b c a b c e a b c f 可見,并不是將 P 向右移讓 P5 與 T9 對齊,而是讓 P2 與 T9 對齊,因為 P1 與 P8 不相同。用 L(i) 表示 t' 的最大位置,此例中, L(9)= 3。 如圖b): N:
17、160; 1 N: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 T: a b c b a d f t b
18、160;c f a q v t b c e. P: b c c a b c e t b c P: b c c a b c e t b c
19、160; 可見,當(dāng) P 向左找不到 “tbc”時,就找到 “tbc”的最長與 P 的前綴匹配的后綴,并將 P 向右移。用 l(i) 表示這個最長后綴的長度,這個例子中 i=8。 整個算法是這樣的:預(yù)處理 輸入查詢字符串 P, 計算 P 中每個位置的 L(i) 和 l(i),并計算 R(i)。查詢 &
20、#160; k:=n; / n 是 T 中字符的總數(shù) while k<=m do begin i :=n; / i 表示 P 中字符的位置 h :=k; / h 表示 T 中字符的位置 while i>0 and P(i)=T(i) do begin &
21、#160; i:=i-1; h:=h-1; end; if i=0 then begin 輸出 T 的這個位置上的字符串;
22、; k:= k+n-l(2); end else 移動 P(增加 k),k 取 好后綴規(guī)則和壞字符規(guī)則決定的最大值 end; 預(yù)處理
23、階段可以根據(jù)上一篇文章提到的 Zbox 方法進(jìn)行處理,時間復(fù)雜度為線性。 整個算法的時間復(fù)雜度最壞的情況是 O(m),m 是 T 的長度。(三)#include <stdio.h>#include <string.h>* 生成skip數(shù)組,即delta1數(shù)組 *int *make_skip(char *ptrn, int plen)int *skip = (int *)malloc(256 * sizeof(int);int *sptr = skip + 256;if (ski
24、p = NULL) fprintf(stderr, "malloc failed!"); while (sptr- != skip) *sptr = plen + 1; while (plen != 0) skip(unsigned char)*ptrn+ = plen-; return skip;* 生成shift數(shù)組,即delta2數(shù)組*int *make_shift(char *ptrn, int plen)int *s
25、hift = (int *)malloc(plen * sizeof(int);int *sptr = shift + plen - 1;char *pptr = ptrn + plen - 1;char c;if (shift = NULL) fprintf(stderr, "malloc failed!");c = ptrnplen - 1;*sptr = 1;while (sptr - != shift) char *p1 = ptrn + plen - 2, *p2, *p3;
26、60; do while (p1 >= ptrn && *p1- != c); p2 = ptrn + plen - 2; p3 = p1; while (p3 >= ptrn && *p3- = *p2- && p2 >=pptr); while (p3 >=
27、 ptrn && p2 >= pptr); *sptr = shift + plen - sptr + p2 - p3; pptr-;return shift;* 搜索函數(shù) *int mSearch(char *buf, int blen, char *ptrn, int plen, int *skip, int *shift)int b_idx = plen;if (plen = 0) return 1; while (b_idx <= blen) int p_idx = plen, skip_stride, shift_stride; while (buf-b_idx = ptrn-p_idx)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 禮儀用品行業(yè)品牌形象塑造與品牌傳播策略研究考核試卷
- 電機運行與維護(hù)管理考核試卷
- 耐火土石礦山開采對地形地貌的影響考核試卷
- 抗疫“心”能量-生命主題教育課程
- 水電工程建設(shè)項目后評價方法與案例考核試卷
- 肉類罐頭銷售渠道拓展與管理考核試卷
- 體育用品租賃業(yè)務(wù)中的用戶體驗優(yōu)化考核試卷
- 糖果的食品安全突發(fā)事件應(yīng)對考核試卷
- 少兒美術(shù)教育課程
- 幼兒園的法制教育課件
- 青馬工程筆試試題及答案
- 豆粕交易合同協(xié)議
- 項目設(shè)計安全管理制度
- 電子化采購招投標(biāo)平臺系統(tǒng)建設(shè)項目解決方案
- 小學(xué)京劇知識
- (2025)漢字聽寫大會競賽題庫(含答案)
- 鐵塔土建施工方案
- 2025年演出經(jīng)紀(jì)人《演出市場政策與經(jīng)紀(jì)實務(wù)》考前點題卷一
- GB/T 45235-2025電子電氣產(chǎn)品中雙酚A的測定高效液相色譜法
- 消防管線施工方案
- 2025年度祠堂宗教用品銷售承包合同3篇
評論
0/150
提交評論