没有合适的资源?快使用搜索试试~ 我知道了~
33丨字符串匹配基础(中):如何实现文本编辑器中的查找功能?1
需积分: 0 1 下载量 109 浏览量
2022-08-03
15:18:39
上传
评论
收藏 3.09MB PDF 举报
温馨提示
试读
25页
当然,你用上一节讲的 BF 算法和 RK 算法,也可以实现这个功能,但是在某些极端情况下,BF 算法性能会退化的比较严重,而 RK 算法需要用到哈希算法,而设计
资源详情
资源评论
资源推荐
33 | 字符串匹配基础(中):如何实现文本编辑器中的查找功能?
2018-12-07 王争
数据结构与算法之美
进入课程
讲述:修阳
时长 18:20 大小 16.80M
文本编辑器中的查找替换功能,我想你应该不陌生吧?比如,我们在 Word 中把一个单词
统一替换成另一个,用的就是这个功能。你有没有想过,它是怎么实现的呢?
当然,你用上一节讲的 BF 算法和 RK 算法,也可以实现这个功能,但是在某些极端情况
下,BF 算法性能会退化的比较严重,而 RK 算法需要用到哈希算法,而设计一个可以应对
各种类型字符的哈希算法并不简单。
对于工业级的软件开发来说,我们希望算法尽可能的高效,并且在极端情况下,性能也不要
退化的太严重。那么,对于查找功能是重要功能的软件来说,比如一些文本编辑器,它们的
查找功能都是用哪种算法来实现的呢?有没有比 BF 算法和 RK 算法更加高效的字符串匹配
算法呢?
下载APP
今天,我们就来学习 BM(Boyer-Moore)算法。它是一种非常高效的字符串匹配算法,
有实验统计,它的性能是著名的KMP 算法的 3 到 4 倍。BM 算法的原理很复杂,比较难
懂,学起来会比较烧脑,我会尽量给你讲清楚,同时也希望你做好打硬仗的准备。好,现在
我们正式开始!
BM 算法的核心思想
我们把模式串和主串的匹配过程,看作模式串在主串中不停地往后滑动。当遇到不匹配的字
符时,BF 算法和 RK 算法的做法是,模式串往后滑动一位,然后从模式串的第一个字符开
始重新匹配。我举个例子解释一下,你可以看我画的这幅图。
在这个例子里,主串中的 c,在模式串中是不存在的,所以,模式串向后滑动的时候,只要
c 与模式串有重合,肯定无法匹配。所以,我们可以一次性把模式串往后多滑动几位,把模
式串移动到 c 的后面。
由现象找规律,你可以思考一下,当遇到不匹配的字符时,有什么固定的规律,可以将模式
串往后多滑动几位呢?这样一次性往后滑动好几位,那匹配的效率岂不是就提高了?
我们今天要讲的 BM 算法,本质上其实就是在寻找这种规律。借助这种规律,在模式串与
主串匹配的过程中,当模式串和主串某个字符不匹配的时候,能够跳过一些肯定不会匹配的
情况,将模式串往后多滑动几位。
BM 算法原理分析
BM 算法包含两部分,分别是坏字符规则(bad character rule)和好后缀规则(good
suffix shift)。我们下面依次来看,这两个规则分别都是怎么工作的。
1. 坏字符规则
前面两节讲的算法,在匹配的过程中,我们都是按模式串的下标从小到大的顺序,依次与主
串中的字符进行匹配的。这种匹配顺序比较符合我们的思维习惯,而 BM 算法的匹配顺序
比较特别,它是按照模式串下标从大到小的顺序,倒着匹配的。我画了一张图,你可以看
下。
我们从模式串的末尾往前倒着匹配,当我们发现某个字符没法匹配的时候。我们把这个没有
匹配的字符叫作坏字符(主串中的字符)。
我们拿坏字符 c 在模式串中查找,发现模式串中并不存在这个字符,也就是说,字符 c 与
模式串中的任何字符都不可能匹配。这个时候,我们可以将模式串直接往后滑动三位,将模
式串滑动到 c 后面的位置,再从模式串的末尾字符开始比较。
这个时候,我们发现,模式串中最后一个字符 d,还是无法跟主串中的 a 匹配,这个时
候,还能将模式串往后滑动三位吗?答案是不行的。因为这个时候,坏字符 a 在模式串中
是存在的,模式串中下标是 0 的位置也是字符 a。这种情况下,我们可以将模式串往后滑
动两位,让两个 a 上下对齐,然后再从模式串的末尾字符开始,重新匹配。
剩余24页未读,继续阅读
尹子先生
- 粉丝: 19
- 资源: 324
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0