BM算法(字符串匹配问题)

1.什么是BM算法

        Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。此算法仅对搜索目标字符串(关键字)进行预处理,而非被搜索的字符串。虽然Boyer-Moore算法的执行时间同样线性依赖于被搜索字符串的大小,但是通常仅为其它算法的一小部分:它不需要对被搜索的字符串中的字符进行逐一比较,而会跳过其中某些部分。通常搜索关键字越长,算法速度越快。它的效率来自于这样的事实:对于每一次失败的匹配尝试,算法都能够使用这些信息来排除尽可能多的无法匹配的位置。

2.为什么我们需要BM算法

       在上次的博文中,我们讲述了KMP算法以及KMP算法的论证过程,讲诉了如何从暴力匹配算法向KMP算法延生,但是KMP算法并不是真正实用的算法,在日常使用中,文本串的长度通常远大于模式串的长度,所以暴力匹配算法在通常情况下的时间复杂度与KMP算法近似相当,那么今天我们要讨论的算法的时间复杂度非常至少,甚至于只与模式串的长度有关,时间复杂度以及优化至O(n).至今仍被作用于很多领域中.

3.KMP算法与BM算法的区别

        KMP算法的匹配是从右向左匹配,也就是从前向后匹配,而BM算法是从后向前匹配,也就是从右向左匹配.

        KMP算法计算的是模式串的最大公共长度,而BM算法计算的则是计算模式串子串在模式串中最近的出现位置.

4.BM算法的实现过程

           在知道BM算法的实现过程前,我们需要先了解两个规则.

        1.坏字符规则.

         在字符串模式匹配的过程中,由模式串从后向前匹配,匹配到失配位置时,在模式串中向左查找与失配字符相同的最近位置,并将最近位置对准失配位置,若在模式串中没有再次出现该字符,则将模式串头对准失配位置继续匹配.

         具体过程如下图文所示

        

             若未找到相同字符,则直接在失配位置处移动整个字符串长度

             

          2.好后缀规则

              在匹配的过程中,每次移动前都会出现一部分匹配成功的部分,也就是上图出现的黑体部分,我们称为好后缀.与坏字符规则基本相同,我们需要从右向左查找好后缀在模式串中最近一次出现的位置,并将失配位置对准寻找到的位置,其中需要注意的是,好后缀并不只有一个字符串.而是一个字符串集合,也就是匹配成功部分以及成功部分的所有子串的集合.

             以下我们演示好后缀规则的移动过程:

       此时要注意的是,利用好后缀规则移动的步骤不止一个,我们选择的是利用好后缀规则查找到的最大长度。

注:在每次失配时,都存在好后缀规则以及坏哦字符规则,此时需要比较两规则的最大距离,以达到最快速移动的目的。

           3.辅助数则的创建

                在了解到了好后缀和坏字符规则后,我们就只需要建议辅助数组,在失配时快速找到需要移动的步数。

                坏字符辅助数组:创建长度为文本串长度的数组,每一位储存从本位起从右向左查找到的最近相同字符,若没有找到,则将该位设为-1。 在每次失配时,将指针移动至坏字符辅助数组存储的数字位上,若是-1,则从头开始比较。

如下图所示:

                好后缀辅助数组:创建长度为文本串长度的数组,每一位储存从从本位起,后缀在本位之前出现的位置,在每次失配时,将指针移动到好后缀辅助数组存储的数字位上。

好后缀辅助数组的得到方式与上图基本相同(此处不做演示)

               

以上则是BM算法的简单过程,觉得需要证明过程可以私信我,或者参考KMP算法的证明过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值