圖解字符串搜索算法(Boyer-Moore)

字符串搜索算法(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;

沒有產生好後綴

因此實際移動以壞字符啓發規則爲主。

移動後:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章