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

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

BM算法简介

  • 1977年,德克萨斯大学的 Robert s.Boyer教授和J Strother moore教授发明了在字符串中搜索模式字符串的一种算法。
  • BM算法是精确字符串匹配算法,在字符串比对过程中采用从右往左比对方式。
  • BM算法基于“坏字符”和“好后缀”两种启发式。

BM算法相关概念

  • 坏字符(Bad-Character):在比对过程中,不匹配的字符。
  • 好后缀(Good-Suffix):如果字符串匹配失败,则之前已经成功匹配的部分称为好后缀。

图解字符串搜索算法(Boyer-Moore)_第1张图片

字符 “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;

没有产生好后缀

因此实际移动以坏字符启发规则为主。

移动后:
在这里插入图片描述

你可能感兴趣的:(入侵检测)