【2013-11-19】【转】字符串匹配的Boyer-Moore算法
[历史归档]本文原发布于 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)

相关新闻

球谐函数实战指南:从原理到Python实现3D光照渲染

球谐函数实战指南:从原理到Python实现3D光照渲染

1. 项目概述:为什么是球谐函数?如果你正在捣鼓3D渲染、游戏开发或者计算机视觉,尤其是最近火热的3D高斯泼溅这类神经渲染技术,那你大概率已经听过“球谐函数”这个名字了。它听起来高深莫测,像是数学系的专属玩具&…

2026/7/14 18:55:55阅读更多 →
生命涌现的小龙虾技能之【Elderly Sleep Nightmare / Startle Detection | 老年人睡眠中间惊醒/梦魇行为识别】简介

生命涌现的小龙虾技能之【Elderly Sleep Nightmare / Startle Detection | 老年人睡眠中间惊醒/梦魇行为识别】简介

🌙 Elderly Sleep Nightmare / Startle Detection | 老年人睡眠中间惊醒/梦魇行为识别 智能分析中枢 图片/视频智能分析 结构化报告 历史报告云端查询 🧭 技能概览 | Overview 模块内容🏷️ 技能名称老年人睡眠中间惊醒/梦魇行为识别&…

2026/7/14 18:55:55阅读更多 →
从“农家乐”到“模块化生态农庄”:大学生创业如何用工业化思维重塑乡村文旅

从“农家乐”到“模块化生态农庄”:大学生创业如何用工业化思维重塑乡村文旅

1. 从农家乐到模块化生态农庄的转型逻辑十年前我第一次去郊区农家乐的经历至今记忆犹新:简陋的砖瓦房,几张油腻的餐桌,院子里散养着几只土鸡,菜单上除了土鸡汤就是炒鸡蛋。这种粗放式的经营模式,正是当前大多数农家乐的…

2026/7/14 18:50:54阅读更多 →
跨越语义鸿沟:企业本体语义平台的构建与落地

跨越语义鸿沟:企业本体语义平台的构建与落地

跨越语义鸿沟:企业本体语义平台的构建与落地在企业数字化进程中,多业务系统并行是普遍存在的现状。不同系统各自拥有独立的字段定义、编码规则与业务逻辑,数据分散在多套系统当中。当大模型接入企业场景时,往往因缺少对这些底层规…

2026/7/14 19:50:59阅读更多 →
企业大脑如何跨越语义鸿沟:本体语义平台的实践思路

企业大脑如何跨越语义鸿沟:本体语义平台的实践思路

企业大脑如何跨越语义鸿沟:本体语义平台的实践思路在接触一些企业智能化改造的真实场景时,技术人员常会听到类似的困扰:数据并不少,系统也上了很多,但要让 AI 真正理解业务、辅助决策,似乎总隔着一层看不见…

2026/7/14 19:50:59阅读更多 →
谁懂啊!中层述职根本不是写材料,是一年一度的自我渡劫

谁懂啊!中层述职根本不是写材料,是一年一度的自我渡劫

谁懂啊!中层述职根本不是写材料,是一年一度的自我渡劫 通知一发,全办公室集体进入精神内耗周期。手机里存满下属一堆述职 PPT,电脑摊着绩效责任书、年度目标表、评分细则,凌晨两点还在表格里抠字数,头发一把…

2026/7/14 19:50:59阅读更多 →
Geek Uninstaller:告别卸载残留,用极简工具守护Windows系统纯净

Geek Uninstaller:告别卸载残留,用极简工具守护Windows系统纯净

1. 为什么你需要Geek Uninstaller? 每次在Windows电脑上卸载软件时,你是不是总觉得事情没那么简单?明明点了卸载,可C盘空间就是不见涨,系统还越来越卡。这就像搬家时只带走了家具,却把垃圾全留在了原地——…

2026/7/14 19:50:59阅读更多 →
2026年AI编程工具大变局:代码补全已成过去式,工程生成才是Java开发者的终极答案

2026年AI编程工具大变局:代码补全已成过去式,工程生成才是Java开发者的终极答案

你可能还没意识到,AI编程工具的战场已经彻底转移了。2026年6月,Pragmatic Engineer发布了一份900多名工程师参与的调研报告,其中一个数据比任何技术指标都更具冲击力:Claude Code的使用率在8个月内从零飙到了第一。超过ChatGPT&am…

2026/7/14 19:50:59阅读更多 →
3个高效方案:轻松解决抖音无水印下载难题

3个高效方案:轻松解决抖音无水印下载难题

3个高效方案:轻松解决抖音无水印下载难题 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量…

2026/7/14 19:45:59阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/14 4:56:14阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/14 2:55:05阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/14 6:17:41阅读更多 →
【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

更多请点击: https://intelliparadigm.com 第一章:Cursor数据库安全红线概览 Cursor 作为一款基于 AI 的智能编程助手,其本地数据库(SQLite 存储)承载着用户代码片段、会话历史、自定义规则及敏感上下文信息。理解其安…

2026/7/14 0:03:18阅读更多 →
【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

更多请点击: https://codechina.net 第一章:Notion AI写作辅助的底层能力边界认知 Notion AI 并非通用大语言模型的直接封装,而是基于 Llama 系列与自研微调模型构建的轻量化推理服务,其输入上下文窗口严格限制在 8192 token&…

2026/7/14 0:03:18阅读更多 →
AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:03:18阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/14 15:07:30阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/14 4:45:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/14 2:42:17阅读更多 →