思想:使用啟發式規則,通過每次的失敗的匹配嘗試,演算法都能根據這些資訊來排除盡可能多的無法匹配的位置(為什麼說是每次呢,因為每次的情況可能不一樣,通過資訊來跳過啟發式規則的得到的步數)
目的:利用啟發式規則,盡可能多跳過無法匹配的位置,從而達到更高的效率
方法:壞字元規則和好字尾規則,取其中移動步數較多的
壞字元規則:
1、當每輪匹配的時候,第一次出現模式串和主串不匹配的位置,在主串中對應位置的字元被成為壞字元。
2、遇到壞字元的處理方法:
(1)當壞字元沒有出現在模式串中(可以提前對所有可能出現的字符集進行預處理,得到字符集對應在模式串的位置的乙個陣列,到時使用時再利用該陣列。),則移動整個模式串到壞字元的下乙個字元(模式串的第乙個字元對準壞字元的下乙個字元),實質是:模式串後移位數 = 壞字元的位置(在模式串的位置) - 模式串中的最右出現位置(壞字元在模式串最右出現的乙個位置,如果沒有出現在字串是-1)
(2)壞字元在模式串**現,模式串後移位數 = 壞字元的位置(在模式串的位置) - 模式串中的最右出現位置(壞字元在模式串最右出現的乙個位置,如果沒有出現在字串是-1)
好字尾規則:
1、當每輪匹配的時候,第一次出現模式串和主串不匹配的位置,模式串從壞字元後面乙個字元開始到最後的字元組成的字尾成為好字尾
2、遇到壞字元時,使用好字尾的處理方法:
(1)當好字尾沒有再出現在模式串中,那麼整個模式串就移動到好字尾對應的下一位,實質是:模式串後移位數 = 好字尾的位置(在模式串的最後的位置,其實就是模式串的長度) - 模式串中的最右出現位置(如果沒有出現在字串是-1);其實當出現babcdab,好字尾為dab的時候,其實就是沒有再出現模式串中,直接就按沒有情況來。
(2)當好字尾出現在模式串中,那麼模式串後移位數 = 好字尾的位置(在模式串的最後的位置,其實就是模式串的長度) - 模式串中的最右出現位置(好字尾在模式串中最右出現的位置,但不能是好字尾的原位置,如果沒有出現在字串是-1);
之所以是最右,是因為避免跳過太多,比如模式串為babcb,如果主串為ddbabcbcd,在主串第二個b為好字尾的話,如果不是按照最右的來跳過,就會將匹配成功的主串最後部分的babcb給跳過了。
#include
using
namespace std;
#define size 256
//定義字符集的數量,用於對壞字元進行預處理, 256是ascii字符集,不能用於處理帶漢字的。想要處理帶漢字的需要用到寬字元
//預處理壞字元
void
badword
(string str1,
int badsite)
//將模式串的字元轉換成ascii值,再將陣列下標為該ascii值的賦上該字元再模式串的位置;然後需要使用的時候,只要查詢壞字元對應的ascii值為陣列下標,對應的陣列值就是壞字元在模式串的下標位置
for(i=
0;i//預處理好字尾
void
goodstring
(string str1,
int goodsite)
//計算出長度為1~len(模式串總長度)字尾在模式串其他地方出現的位置(與字尾相同的字串的最後字元下標)
for(i=
0;i1;i++)}
}//匹配函式
intalgo_bm
(string str1,string str2,
int badsite,
int goodsite)
if(j<0)
movebad=j-badsite[
int(str1[i])]
; movegood=len2-goodsite[str2.
substr
(j+1
,len2-j-1)
.length()
]-1;
i=i+
max(movebad,movegood)
; j=len2-1;
}return-1
;}intmain()
else
return0;
}
字串匹配 BM演算法
bm演算法 1 三個shift函式 d1,d2,d3,函式的作用是決定當匹配不成功時視窗的移動位數。1 d1 字尾u在模式串p中的另乙個位置是最右出現位置是j 不包括在模式串尾的出現 文字串的視窗安全移動方法是將視窗移動m j字元,使文字中的u與模式串中最右邊的u的出現位置相對齊。對模式中的每個字尾...
字串匹配(中) BM演算法
壞字串規則 問題 si xi可能是負數,示例如下 0 3 解決方案 好字尾規則 好字尾規則 字首子串 類似字尾子串 規則選取 實現 主串a,模式串b function bm a,b for let i 0 i let suffix let prefix generategs b,suffix,pre...
字串匹配演算法 蠻力演算法 KMP演算法 BM演算法
子串 字串中任一連續的片段,稱作其子串 substring 字首 prefix s,k s.substr 0,k s 0,k 字尾 suffix s,k s.sbustr n k,k s n k,n 串模式匹配 string pattern matching 對基於同一字元表的任何文字t t n 和...