字符串搜索算法(Boyer-Moore)
BM算法簡介
- 1977年,德克薩斯大學的 Robert s.Boyer教授和J Strother moore教授發明了在字符串中搜索模式字符串的一種算法。
- BM算法是精確字符串匹配算法,在字符串比對過程中採用從右往左比對方式。
- BM算法基於“壞字符”和“好後綴”兩種啓發式。
BM算法相關概念
- 壞字符(Bad-Character):在比對過程中,不匹配的字符。
- 好後綴(Good-Suffix):如果字符串匹配失敗,則之前已經成功匹配的部分稱爲好後綴。
字符 “I” 爲本次匹配過程中產生的壞字符;後綴“E”、“LE”、“PLE”、“MPLE"爲本次匹配過程中產生的好後綴。
“壞字符”啓發規則
- 模式字符串後移位數=壞字符對應的模式字符串的位置 - 壞字符在模式字符串前面出現的位置。
- 當壞字符在模式字符串前部不存在時,則標記“壞字符在模式字符串前面出現的位置”爲"-1”。
例如在上面匹配過程中,“P”和"E"不匹配,則P爲"壞字符",由於P出現在模式字符串的第6位(座標從0開始),且壞字符P在模式字符串前面岀現的位置爲4,所以下一次比對時,模式字符串需要後移6-4=2位。
例如在上面匹配過程中,“S”和"E不匹配,則S爲"壞字符",由於S沒出現在模式字符串的前部,因把壞字符在模式字符串前面岀現的位置標記爲-1,所以下一次比對時,模式字符串需要後移6-(-1)=7位。
“好後綴”啓發規則
- 模式字符串後移位數=好後綴的位置-好後綴在模式字符串中上一次出現位置
注:(1)好後綴的位置是以好後綴的最後一個字符的位置爲準;
(2)如果最長好後綴在模式中沒有重複出現,則其他好後綴的上一次出現位置必須在頭部。
(3)所有好後綴在模式字符串沒有重複出現,則標記好後綴的上一次出現位置爲-1。
例如在本次比對過程中產生的好後綴有"MPLE"、“PLE”、“LE”、“E”。由於在所有的"好後綴"之中,最長好後綴"MPLE"沒有重複出現,在其他好後綴中,只有"E"在"EXAMPLE"中的頭部出現,且重複出現的位置爲0,所以下一次比對需要模式字符串後移6-0=6位。
BM算法思想
- Boyer-Moore算法的基本思想是:模式字符串每次後移時,以“壞字符”啓發規則和“好後綴”啓發規則各自產生的移動值中選擇較大的數爲標準。
- 這樣,可以使得模式字符串每次右移幅度儘可能大,極大提高字符串搜索效率
Boyer-Moore算法完整演示
-
搜索字符串T爲:
-
模式字符串P爲:
第一次匹配
移動前:
壞字符啓發規則產生的移動位數:6-(-1)=7,沒有產生好後綴。
因此實際移動以壞字符啓發規則爲主。
移動後:
第二次匹配
移動前:
壞字符啓發規則產生的移動位數:6-(4)=2,沒有產生好後綴。
因此實際移動以壞字符啓發規則爲主。
移動後:
第三次匹配
移動前:
壞字符啓發規則產生的移動位數:2(-1)=3;
好後綴啓發規則產生的移動位數:6-0=6;
因此實際移動以好後綴啓發規則爲主。
移動後:
第四次匹配
移動前:
壞字符啓發規則產生的移動位數:6(4)=2;
沒有產生好後綴
因此實際移動以壞字符啓發規則爲主。
移動後: