算法——字符串匹配之BM算法

本文详细介绍了Boyer-Moore(BM)算法,一种高效的字符串匹配算法,优于KMP算法。BM算法包括预处理阶段和搜索阶段,通过坏字符规则和好后缀规则来快速移动模式串,提高匹配效率。预处理过程中,计算坏字符数组bmBc[]和好后缀数组bmGs[]。在匹配过程中,结合这两个规则确定模式串的移动距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法(简称BM算法),后缀匹配就是模式串从右到左开始比较,但模式串的移动依然是从左到右的。在实践中,BM算法效率高于前面介绍的《KMP算法》,算法分为两个阶段:预处理阶段和搜索阶段;预处理阶段时间和空间复杂度都是是O(m+sigma)sigma是字符集大小,一般为256在最坏的情况下算法时间复杂度是O(m*n);在最好的情况下达到O(n/m)

BM算法实现

BM算法预处理过程

        BM算法有两个规则分别为坏字符规则(Bad Character Heuristic)和好后缀规则(Good Suffix Heuristic);这两种规则目的就是让模式串每次向右移动尽可能大的距离。BM算法是每次向右移动模式串的距离是,按照好后缀算法和坏字符算法计算得到的最大值。以下给出基本概念:

    坏字符:输入文本字符串中的字符与模式串当前字符不匹配时,则文本字符串的该字符称为坏字符;

    好后缀:是指在遇到坏字符之前,文本串和模式串已匹配成功的字符子串;

    下面是坏字符和好后缀的图示:


    坏字符规则:当输入文本字符串中的某个字符跟模式串的某个字符不匹配时,模式串需要向右移动以便进行下一次匹配,移动的位数 = 坏字符在模式串中对应的位置 - 坏字符在模式串中最右出现的位置。此外,如果模式串中不存在"坏字符",则最右出现位置为-1;所以坏字符规则必然有两种情况,下面会进行讨论。
    好后缀规则:当字符失配时,后移位数 = 好后缀在模式串中对应的位置 - 好后缀在模式串上一次出现的位置,且如果好后缀在模式串中没有再次出现,则为-1。根据模式串是否存在好后缀或部分好后缀,可以分为三种情况,下面会逐一讨论。

坏字符规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值