BM算法图解
BM算法的概念:
BM算法也叫做精確字符集算法,它是一種從右往左比較(后往前),同時也應(yīng)用到了兩種規(guī)則壞字符、好后綴規(guī)則去計算我們移動的偏移量的算法。
1、壞字符規(guī)則
基本思路圖解:
首先:提供兩個字符串分別是文本串、模式串
因為是從右往左開始比較、為什么呢?因為這樣的話如果最后一個比較不上前面的一定就可以不用比較了。
這時:c、d不匹配。所以文本串中的d是壞字符。
這時利用公式計算出**后移位數(shù)。****
后移位數(shù) = 壞字符的位置 - 模式串中的上一次出現(xiàn)位置所以計算結(jié)果是:
6=5-(-1);
因為按數(shù)組下標計算,而且模式串中沒有該壞字符,所以是(-1)。
接下來繼續(xù)比較:
c、b不匹配,壞字符是b,發(fā)現(xiàn)模式串中有兩個壞字符。
這時選擇從右往左第一個出現(xiàn)的,因為如果選擇后面的話就容易會造成被有遺漏問題。
結(jié)果:
3=5-2,所以右移3位。
好后綴規(guī)則:
這里的文本串中的ab、c和模式串中的ab、c匹配的,所以ab,c就是好后綴。
在這里在第三個模式串中的a、b是不匹配的,如果使用壞字符方式進行移動的話:3-2=1;
那么有更好的移動方案嗎?
接下來是好后綴計算公式:
舉個例子:“afasdsadas” 中假設(shè)好后綴是as,那么as位置按s位置來算(就是按后面字符來算),那么就是9,模式串中上一次出現(xiàn)好后綴位置就是3那么后移量就是 9-3=6;
再舉個例子:“ababababc” 中假設(shè)好后綴是 c,那么c的位置是8,模式串中上一次出現(xiàn)好后綴位置是沒有那么就是(-1),所以后移量就是8-(-1)=9;
特別注意:
(1)"好后綴"的位置以最后一個字符為準。假定"ABCDEF"的"EF"是好后綴,則它的位置以"F"為準,即5(從0開始計算)。(2)如果"好后綴"在搜索詞中只出現(xiàn)一次,則它的上一次出現(xiàn)位置為 -1。比如,"EF"在"ABCDEF"之中只出現(xiàn)一次,則它的上一次出現(xiàn)位置為-1(即未出現(xiàn))。(3)如果"好后綴"有多個,則除了最長的那個"好后綴",其他"好后綴"的上一次出現(xiàn)位置必須在頭部。比如,假定"BABCDAB"的"好后綴"是"DAB"、"AB"、"B",請問這時"好后綴"的上一次出現(xiàn)位置是什么?回答是,此時采用的好后綴是"B",它的上一次出現(xiàn)位置是頭部,即第0位。這個規(guī)則也可以這樣表達:如果最長的那個"好后綴"只出現(xiàn)一次,則可以把搜索詞改寫成如下形式進行位置計算"(DA)BABCDAB",即虛擬加入最前面的"DA"。**舉個例子:**模式串:“asjsjss”,假設(shè)里面好后綴有ss,s。那么這時選哪個好綴呢,選ss,因為s的上一次出現(xiàn)不是在字符串頭。
**在舉一個:**模式串:“sjsjss”,假設(shè)里面好后綴有ss,s。那么這時選哪個好綴呢,選s,因為s的上一次出現(xiàn)是在字符串頭。
**總結(jié):**后移量是在好后綴、壞字符中后移量中去最大值。
總結(jié)
- 上一篇: 全国计算机等级考试题库二级C操作题100
- 下一篇: 全国计算机等级考试题库二级C操作题100