[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2013-11-19 标题【转】字符串匹配的Boyer-Moore算法分类编程 / 数据结构与算法 标签算法·Boyer-Moore算法【转】字符串匹配的Boyer-Moore算法文档信息本文转自http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html上一篇文章我介绍了KMP算法。但是它并不是效率最高的算法实际采用并不多。各种文本编辑器的查找功能CtrlF大多采用Boyer-Moore算法。Boyer-Moore算法不仅效率高而且构思巧妙容易理解。1977年德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。下面我根据Moore教授自己的例子来解释这种算法。假定字符串为HERE IS A SIMPLE EXAMPLE搜索词为EXAMPLE。首先字符串与搜索词头部对齐从尾部开始比较。这是一个很聪明的想法因为如果尾部字符不匹配那么只要一次比较就可以知道前7个字符整体上肯定不是要找的结果。我们看到S与E不匹配。这时**“S就被称为坏字符”bad character即不匹配的字符。**我们还发现S不包含在搜索词EXAMPLE之中这意味着可以把搜索词直接移到S的后一位。依然从尾部开始比较发现P与E不匹配所以P是坏字符。但是P包含在搜索词EXAMPLE之中。所以将搜索词后移两位两个P对齐。我们由此总结出**“坏字符规则”**后移位数 坏字符的位置 - 搜索词中的上一次出现位置如果坏字符不包含在搜索词之中则上一次出现位置为 -1。以P为例它作为坏字符出现在搜索词的第6位从0开始编号在搜索词中的上一次出现位置为4所以后移 6 - 4 2位。再以前面第二步的S为例它出现在第6位上一次出现位置是 -1即未出现则整个搜索词后移 6 - (-1) 7位。依然从尾部开始比较E与E匹配。比较前面一位LE与LE匹配。比较前面一位PLE与PLE匹配。比较前面一位“MPLE与MPLE匹配。**我们把这种情况称为好后缀”good suffix即所有尾部匹配的字符串。**注意“MPLE”、“PLE”、“LE”、E都是好后缀。比较前一位发现I与A不匹配。所以“I是坏字符”。根据坏字符规则此时搜索词应该后移 2 - -1 3 位。问题是此时有没有更好的移法我们知道此时存在好后缀。所以可以采用**“好后缀规则”**后移位数 好后缀的位置 - 搜索词中的上一次出现位置举例来说如果字符串ABCDAB的后一个AB是好后缀。那么它的位置是5从0开始计算取最后的B的值在搜索词中的上一次出现位置是1第一个B的位置所以后移 5 - 1 4位前一个AB移到后一个AB的位置。再举一个例子如果字符串ABCDEF的EF是好后缀则EF的位置是5 上一次出现的位置是 -1即未出现所以后移 5 - (-1) 6位即整个字符串移到F的后一位。这个规则有三个注意点1好后缀的位置以最后一个字符为准。假定ABCDEF的EF是好后缀则它的位置以F为准即5从0开始计算。2如果好后缀在搜索词中只出现一次则它的上一次出现位置为 -1。比如EF在ABCDEF之中只出现一次则它的上一次出现位置为-1即未出现。3如果好后缀有多个则除了最长的那个好后缀其他好后缀的上一次出现位置必须在头部。比如假定BABCDAB的好后缀是DAB、“AB”、“B”请问这时好后缀的上一次出现位置是什么回答是此时采用的好后缀是B它的上一次出现位置是头部即第0位。这个规则也可以这样表达如果最长的那个好后缀只出现一次则可以把搜索词改写成如下形式进行位置计算(DA)BABCDAB即虚拟加入最前面的DA。回到上文的这个例子。此时所有的好后缀MPLE、PLE、LE、E之中只有E在EXAMPLE还出现在头部所以后移 6 - 0 6位。可以看到坏字符规则只能移3位好后缀规则可以移6位。所以Boyer-Moore算法的基本思想是每次后移这两个规则之中的较大值。更巧妙的是这两个规则的移动位数只与搜索词有关与原字符串无关。因此可以预先计算生成《坏字符规则表》和《好后缀规则表》。使用时只要查表比较一下就可以了。继续从尾部开始比较“P与E不匹配因此P是坏字符”。根据坏字符规则后移 6 - 4 2位。从尾部开始逐位比较发现全部匹配于是搜索结束。如果还要继续查找即找出全部匹配则根据好后缀规则后移 6 - 0 6位即头部的E移到尾部的E的位置。完文档信息版权声明自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0原文网址http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html最后修改时间2013年11月 5日 10:21付费支持[](https://me.alipay.com/ruanyf) | [](https://www.paypal.com/cgi-bin/webscr?cmd_xclickbusinessyifeng.ruangmail.comcurrency_codeUSDamount0.99returnhttp://www.ruanyifeng.com/thank.htmlitem_nameRuan%20YiFeng’s%20Blogundefined_quantity1no_note0)
C/C++宏定义深度解析:从基础语法到高级应用与避坑指南 1. 项目概述:为什么宏定义值得“深入浅出”地聊?干了这么多年C/C开发,我敢说,宏定义(Macro)绝对是让开发者又爱又恨的一个特性。爱它,是因为它能在编译前完成文本替换,实现一些看似“…
OJ(Online Judge)一览 USACO USACO详细介绍 全球中小学生均可参加 USACO详细介绍 全球中小学生均可参加_usaco竞赛适合哪些学生?-CSDN博客 USACO 学习 USACO竞赛精选题解-CSDN博客 USACO竞赛书籍推荐 USACO竞赛书籍推荐_guide to competitive programming pdf-CSDN博客 USACO资料集(2022…
Siemens DesignCenter 2606 Build 1700. (NX2606免安装版) Win64 ⚠️ 注意:在 NX2606 系列中保存的文件无法在 NX-2512系列及更早版本中打开。 发布年份/日期:2026 年 当前版本:NX 2606 Build 1700 开发商:Siemens PLM Software 官网:www.plm.automation.siemens.com 系统架构&…
零依赖纯JS版2048网页游戏:含完整资源、中文说明与本地运行支持 本文还有配套的精品资源,点击获取 简介:直接双击就能玩的2048网页游戏,所有功能都用原生JavaScript写成,没用任何框架(只附带一个jquery文件供可选扩展)。游戏包含完整的键盘操作(方向键控制…
Pixhawk无人机硬件装配系统指南:信号流与物理域双轨集成 1. 项目概述:这不是一份“拼装说明书”,而是一份飞控硬件系统级装配指南你手里的这份《Pixhawk无人机教程-3.1 装配说明》,表面看是教你怎么把电机、电调、飞控板、GPS模块一块块拧上去,但实际它解决的是一个更本质的问题…
终极指南:如何为Honey Select 2安装增强补丁,一键解锁完整游戏体验 终极指南:如何为Honey Select 2安装增强补丁,一键解锁完整游戏体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为《Honey Selec…
深圳配眼镜速查手册五分钟搞懂去哪配怎么选 - 配眼镜新资讯 深圳配眼镜速查手册,五分钟搞懂去哪配怎么选深圳配眼镜如果不想花大量时间逐一探店对比,这份速查手册用简短的篇幅把渠道、价格、流程、避坑要点梳理清楚,帮助你快速决策。无论你是初次在深圳配眼镜还是想换个更靠谱…
2026免费查重网站红黑榜:这3类千万别碰,论文泄露哭都来不及 一句话答案:免费查重网站水很深,红榜选有口碑、可查可删的正规平台,黑榜坚决远离"完全免费要你上传全文"的不明小站,查重完一定要删稿。一、免费查重的现状与坑毕业季,"免费查重"是高频搜索词&…
MATLAB音乐信号处理教学包:简谱转音频、实时频谱显示与可调滤波GUI 本文还有配套的精品资源,点击获取 简介:用MATLAB做信号处理实验,直接从简谱或音符序列生成真实感音频,支持播放验证;输入音频后自动完成傅里叶变换,同步绘制幅频和相频曲线,清楚呈现各频率能…
2026综合实力出众的国内投票系统服务商汇总:兼顾安全与性价比 网络投票早已不是“能发起就行”的时代了。刷票毁公平、收费毁预算、卡顿毁体验、导不出数据等于白干——这四条铁律,是无数活动组织者用真金白银换来的教训。市面上打着“免费”旗号的投票工具多如牛毛,但真正能做到永久免费、零广告、强防刷、免费导出…
【小程序毕业设计】基于 SpringBoot 的畲族特色文创产品电商小程序的设计与实现 八闽畲族文化数字化交流与线上交易系统(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…
微信投票到底该怎么做?2026三大平台对比+人人微投票保姆级图文教程 在 2026 年的微信生态中,投票依然是社群互动、品牌营销和校园赛事中最直接有效的“流量引擎”。无论是幼儿园想办一场引爆朋友圈的“萌宝大赛”,还是企业要评选年度“优秀员工”,选对工具,活动就成功了一半。然而,面对…
PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 在软件开发过程中,清晰的系统设计往往比编码本身更为关键。传统拖拽式UML工具虽然直观,却常常成为效率杀手——频繁的鼠标操作打断设计思路,版本控制困难,…
【RT-DETR涨点改进】29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 开篇故事 上个月帮一家安防厂商做项目优化,他们用RT-DETR做实时人流统计,部署在NVIDIA A10上。客户反馈说:“GPU利用率才30%,但延迟已经飙到40ms了,加人流量就丢帧。” 我远程一看,好家伙——生产环境里每个请求单独…
Postman 环境变量实战:3种动态设置方法与CI/CD集成避坑指南 Postman 环境变量高阶实战:动态管理与 CI/CD 深度集成在接口自动化测试领域,环境变量的灵活运用往往成为区分初级与高级测试工程师的关键能力。本文将深入探讨 Postman 环境变量的三种动态设置模式,并分享 Newman 在 CI/CD 流水线中的实战避坑…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…