algorithm - 从视觉上理解 Boyer-Moore
问题描述
我已经研究过 StackOverflow 上的各种解决方案,试图了解 Boyer-Moore 算法的功能,但是我正在寻找更多关于算法实际功能的分步说明(视觉学习对我来说要好得多)。
我试图理解这张图片,但我不完全理解为什么在比较 6 中它会向前跳过:
我希望看到它画得更好,但如果你能通过伪代码告诉我为什么会发生这种情况,我将不胜感激。
谢谢你。
解决方案
Boyer Moore 算法中最重要的是最后出现表,它是模式的预处理。它存储模式中每个不同字符出现的最后一个索引。
这些步骤可以分解如下所示,我在其中稍微修改了您的可视化。
移位步骤解释如下
文本字符a与模式字符b不匹配。字符a出现在索引为 4 的最后一个出现表中。移位模式使索引 4 与不匹配的文本字符a对齐。
文本字符a与模式字符c不匹配。字符a出现在索引为 4 的最后一个出现表中。移动模式以使索引 4 与不匹配的文本字符a对齐将使模式向后移动。这没有意义,所以我们所能做的就是将模式移动 1。
文本字符a与模式字符b不匹配。字符a出现在索引为 4 的最后一个出现表中。移位模式使索引 4 与不匹配的文本字符a对齐。
文本字符d与模式字符b不匹配。字符d未出现在最后一个出现表中。因此,我们可以将整个模式转移到这种不匹配之外。
文本字符a与模式字符b不匹配。字符a出现在索引为 4 的最后一个出现表中。移位模式使索引 4 与不匹配的文本字符a对齐。
所有字符都匹配,即我们有一个完全匹配。将模式天真地移动 1。
与比较 7 相同的情况。将模式的索引 4 与不匹配的文本字符a对齐。
与上述相同的场景。
与比较 2、3 和 4 完全相同的情况。将模式移位 1。
文本字符b与模式字符a不匹配。我们到了文本的结尾,所以我们完成了。
推荐阅读
- python - 如何避免烧瓶网络应用程序的内存泄漏?
- node.js - 使用 NodeJS 的 MongoDB 集合
- jquery - jquery中的函数在函数调用中定义时返回未定义
- angular - Angular 6 路由 ngOnInit 未调用
- xml - dotnet core REST API 发布数据无法从请求中的列表中读取 XML
- javascript - 在 javascript 中访问我的 json 响应的元素
- windows - 如何使用十六进制编辑器删除突出显示的代码行?
- hadoop - 卡在 ambari 2.6.2 中的应用时间线服务器安装
- java - Android Studio Activity 启动延迟
- security - 被浏览器拒绝的二级域的通配符 SSL/TLS 证书