快速的字符串查找算法(Boyer-Moore)

算法之Boyer - Moore子字符串查找算法:高效匹配的秘密武器 在算法的学习之旅中,我一直坚信分享的力量。每一次深入研究一个新算法,都像是开启一场充满惊喜的冒险,而将这些宝贵的经验分享出来,能让大家一同受益。今天,我就迫不及待地想和大家聊聊子字符串查找算法中的Boyer - Moore算法,希望通过我的分享,能帮助大家更好地理解和掌握这个高效的算法,一起在算法的学习道路上大步前进。 阅读详情

来自:http://www.cnblogs.com/unruledboy/archive/2005/07/05/186506.html 

在CodeProject,Efficient Boyer-Moore Search in Unicode Strings,作者leseul 展示了Boyer-Moore算法的威力,代码这里下载:
Download source - 10.2 Kb
 Download demo project - 5.18 Kb 

我写了一个性能测试:

public static void Main()
{
 string pattern = "AbC";
 string target = "AbCaBc";
 string pressure;
 StringBuilder b = new StringBuilder();
 int count = 10000000;
 for (int i = 0; i < count; i++)
 {
  b.Append(target);
 }
 pressure = b.ToString();

 //BM without case senstive
 HiPerfTimer time = new HiPerfTimer();
 time.Start();
 CIBMSearcher BMS = new CIBMSearcher(pattern, false);
 int index = BMS.Search(pressure, 0);
 while (index >= 0)
 {
  index = BMS.Search(pressure, index + pattern.Length);
 }
 time.Stop();
 Console.WriteLine("BM without case senstive:" + time.Duration);
 GC.Collect();

 //BM with case senstive
 time = new HiPerfTimer();
 time.Start();
 BMS = new CIBMSearcher(pattern, true);
 index = BMS.Search(pressure, 0);
 while (index >= 0)
 {
  index = BMS.Search(pressure, index + pattern.Length);
 }
 time.Stop();
 Console.WriteLine("BM with    case senstive:" + time.Duration);
 GC.Collect();

 //SubString without case senstive
 time = new HiPerfTimer();
 time.Start();
 index = pressure.IndexOf(pattern);
 while (index >= 0)
 {
  index = pressure.IndexOf(pattern, index + pattern.Length);
 }
 time.Stop();
 Console.WriteLine("SS without case senstive:" + time.Duration);
 GC.Collect();

 Console.ReadLine();
}


结果如下:
BM without case senstive:1.2411443536895
BM with      case senstive:0.707685620917367
SS without  case senstive:1.77157282256596 

SS是SubString。

我的电脑是PIV 2.8G + 1GRAM 。

BM的威力可见一斑,估计我之前写的高效的忽略大小写的字符串替换(Replace)函数(多种方法比较)可以大大改善了。

高效的算法的意义就在于此啊!这个算法现暂不研究,今天太忙,得看看今晚是否有时间研究一下。

注释:代码不格式化是因为代码插入功能有错误,无法使用。

点击这里下载我的写的测试代码

Boyer-Moore字符串搜索算法

http://zh.wikipedia.org/wiki/Boyer-Moore字符串搜索算法



C#编写Boyer-Moore算法:快速查找模式串 接着,我们从模式串的最后一个字符开始匹配,一旦发现不匹配的字符,就使用right表格来确定当前需要跳过的字符数。Boyer-Moore算法是一种用于字符串查找的高效算法,其核心思想是将模式串从右向左匹配,遇到不匹配的字符时根据预处理表格来确定下一步匹配的位置。Boyer-Moore算法是一种快速查找模式串的算法,它可以在大多数情况下比传统的暴力匹配算法更快地找到所需的字符串。在构造函数中,我们遍历模式串中的每个字符,并将其在right表中的位置设置为当前下标。 阅读详情

相关推荐

C/C++ boyer moore(博伊尔-摩尔搜索)算法详解及源码

Boy-Moore算法的核心思想是从模式串的末尾向前匹配,并利用两个启发规则:坏字符规则和好后缀规则。好后缀规则则利用模式串的已匹配部分,找到模式串中的一个子串,与主串的后缀子串匹配。1.较快的平均时间复杂度:在一般情况下,算法的时间复杂度为O(n/m),其中n是主串的长度,m是模式串的长度。2.较低的最坏时间复杂度:在最坏情况下,算法的时间复杂度为O(n+m),这主要由于好后缀规则的应用。1.需要额外的预处理:算法需要预处理模式串,生成坏字符表和好后缀表,这增加了额外的空间和时间开销。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2274

字符串查找 - 模拟实现strstr 、BF算法 、 KMP算法

KMP算法是一种字符串匹配算法,由D.E.Knuth.J.H.Morris和V.R.Pratt提出,因此被称为克努特-莫里斯-普拉特操作(简称KMP算法)。该算法的核心是利用匹配失败后的信息,尽量减少使用子串与主串的匹配次数,即在匹配成功得串中找与字串其前段字符匹配的串,以达到快速匹配的目的;具体实现是通过一个数组:next 数组,每次匹配失败后j 回退的下标的信息在next 数组中(此next 数组中会包含字串的局部匹配信息);想要得到数组需要通过写函数计算得到;

Distinguished_z的博客 1298

KMP 快速查找算法

KMP 模式串匹配 指针 不回退 最快的字符串查找算法之一。 C++ builder6 调试通过。

字符串的查找以及查重方法总结

掌握要求: 1、字符串查找的朴素算法 2、字符串查找的KMP算法 3、哈希表 4、字典树 1、字符串的查找之朴素算法 朴素算法思想很简单,就是将待查找字符串t在被查找的字符串s中一一对比,如果遇到相同字符就将t和s同时往后挪,再依次比较;如果将t子串一直比较完了都与s中对应的连续位置元素相等的话,则就成功找到了字串的位置,但若t子串未比较完就与s中元素不相同,则将t返回到第一个元素,而s返回到刚与...

是袁同学呀 7283

naive_opt:优化的朴素字符串搜索算法

naive_opt 优化的朴素字符串搜索算法。 特征 天真的字符串搜索算法 通过1字节搜索进行了增强,例如libc ++和libstd ++ string :: find 专门研究UTF-8琴弦,这是防锈功能 支持零开销特征。 最低支持:rustc 1.41.1(f3e1a954d 2020-02-24) 兼容性 实现此板条箱可替换rust std库。 但是,方法名称不同,因此请重写代码。 这应该不太困难。 兼容性: 锈std::str 这个箱子 std::str::find() naive_opt::Search::search() std::str::rfind() naive_opt::Search::rsearch() std::str::contains() naive_opt::Search::includes() std::str::match_ind

Android Camera Sensor HDR详解

本文详细介绍了Android相机传感器(Sensor)中实现高动态范围(HDR)采集的各种技术方式。主要内容包括: Sensor HDR技术分类 帧内HDR(Single-Frame HDR):在同一帧同一像素内完成多增益采集,无运动伪影和帧率损失,包括DAG(双模拟增益)、DCG(双转换增益)等技术 帧间HDR(Multi-Frame HDR):通过多帧曝光实现,如DOL(数字重叠)、Staggered HDR等 混合HDR:结合多种技术的复合方案 详细技术原理 重点解析了DAG和DCG两种主流帧内HDR

DU_YULIN的博客 361

如何快速查找字符(很简单的写法,用find实现)

真的非常非常简单的一种查找方法(方便写)

z54088170452的博客 2619

手把手教你安装 Vivado2022.2(附安装包)

Vivado 2022.2版本与之前的版本相比,具有以下几个显著的优势:电源设计管理器(PDM):Vivado 2022.2引入了全新的电源设计管理器(PDM),这是一个下一代功耗评估平台,为Versal® 和 Kria™ SOM提供了准确一致的功耗估计能力。PDM是Versal产品家族的首选功耗评估工具,为Versal ACAP硬IP块提供增强向导,简化从XPE向PDM的迁移,帮助用户获得准确的功耗评估。

dpwkj的博客 2万+

字符串【查找】方法

x.split()--------使用某个字符将字符串分割成多个元素「默认使用空格分割,且默认整个字符串按从左向右的顺序都参与分割,也可以根据情况选定分割区域」x.removesuffix()--------将字符串中的某些后缀去掉。x.removeprefix()-------将字符串中的某些前缀去掉。x.replace()---------将制定的字符替换为目标字符。x.rsplit()--------字符串从右向左按条件分割。x.count()--------统计某个字符出现的次数。

qq_42954795的博客 6334

电脑版微信多开,最详细教程没有之一

首先桌面任意的位置右键新建文本文档输入如下代码: TASKKILL /F/IM WECHAT.EXE start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" ...

大超子 4390

因果表示学习 (Causal Representation Learning, CRL)

传统的机器学习,尤其是深度学习,非常擅长学习数据中的相关性 (Correlation)。但它常常会走“捷径”,学到一些虚假的、不稳定的“表面联系”。一个AI模型在学习识别“牛”时,如果训练数据里所有的牛都在绿色的草地上,模型很可能会学到一个错误的规则:“牛 = 四条腿的生物 + 绿色背景”。你给它一张牛在海滩上的照片,它就可能不认识了。因果表示学习的目标,就是让模型超越这种表面相关性,去学习数据背后。

Xuxiansir的博客 1181

一种快速的字符串匹配算法

/* 快速字符串查找函数:目前比较流行的字符串有KMP与BM算法,实际上KMP算法在使用的时候比strchr快不了多少,而BM算法也大约只有KMP算法的3~5倍。这里介绍一个快速字符串查找函数。举一个例子:"Hello, world"中查找"word"子串,可以先把两个字符串按照首字节对好:Hello, worldworld我们可以看出刚开始是不能匹配的,这样需要将子串往后移,至于每次

qinzx2004的专栏 2695

热更新方案 HybridCLR 学习教程 |(一)原理及准备工作

前面文章介绍了热更新相关的知识,包括使用xLua实现热更新实战等 那本文就来介绍一下 热更新方案 HybridCLR(代号wolong,原huatuo)和基本使用方法。 若是想了解更多关于HybridCLR的东西也可以去 官网 详细查阅。

努力前行,总会成为自己心中的那道光 2万+

(二)Boyer-Moore字符串查找算法

这是一种类似于KMP但是更高效一点、也更简单一些的字符串查找算法,大体的思路是从右往左扫描,例如在txt = ABCBCDCDE中查找模式串pat = BCD,ABCBCDCDE BCD从右往左,第一个比较的字符是 C 和 D ,不匹配,C 在 BCD 里出现的所有位置中最靠右是 1,那么 BCD 右移 1 位,比较 B 和 D ,ABCBCDCDE BCD不匹配,B 在 BCD里出现的所有位置中

小魏同学的随想随写 531

物理AI重构自动驾驶供应链 | 传统Tier1盈利模式崩塌,纯算法/软硬一体双路线落地对比,助力智驾软件商业化与全场景模型迭代

2026年是自动驾驶物理AI规模化落地元年,行业彻底告别传统感知-预测-规划-控制的模块化分层开发范式,迈入以世界模型、物理规则推演、端到端动作生成为核心的全新技术阶段。不同于传统AI仅完成图像识别、目标检测的浅层感知任务,物理AI能够深度理解道路交通中的动力学约束、路面摩擦、车辆博弈、行人运动规律等真实物理逻辑,实现对复杂路况的时序推演与自主决策,从底层重构自动驾驶技术架构。技术迭代同步引发产业链颠覆性变革,沿用数十年的传统自动驾驶Tier1商业模式全面崩塌。

getusushu的博客 289

RK3568适配MIPI屏幕触摸,触摸延时很大

我用的是系统,接了一个,设备树已经正确配置,evtest测试坐标值和触摸位置都是准确的。但是出现了一个:我在屏幕上点一下,要等大约 2 秒才能在evtest里看到坐标事件打印。这种现象在 Goodix 系列触摸驱动里比较少见,一般意味着。

小灰灰的博客 1363

Boyer-Moore算法

一.概述         在当前用于查找子字符串的算法中,BM(Boyer-Moore)算法是当前有效且应用比较广的一中算法,各种文本编辑器的“查找”功能(Ctrl+F),大多采用Boyer-Moore算法。比我们在学习的KMP算法快3~5倍。         Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Str

appleprince88的专栏 1万+

【软考中级】多媒体应用设计师复习笔记第十章【free】

第10章法律法规与标准规范 行业标准 缩写的大写拼音 地方标准 DB加生代码 企业标准Q加斜线企业代号国际标准是国际标准化组织ISO和国际电工委员会IEC制定的标准 国家标准是由国务院标准化行政主管部门制定,全国范围内使用 ?强制性国家标准的代号为GB,推荐性国家标准的代号为GB/T。 ?软件开发规范GB8566-88属于强制性国家标准 在这里插入图片描述 行业标准代号由大写汉语拼音字母组成,加上斜线和T,组成推荐性行业标准,如XX/T。已经发布的行业代号有QJ(航天),SJ(电子

weixin_47120900的博客 641

Boyer-Moore 字符串匹配算法

字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]; 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]; T 和 P 中的元素都属于有限的字母表Σ 表; 如果 0≤s≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为...

aijianxie8808的博客 199

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

workbench字符匹配错误_Boyer–Moore字符串搜索算法

本文只是随手记录。在网上翻东西的时候就经常会看到一些没听过或者听过但没去了解的事情。有些时候刚好有心情了,就去了解。了解完又容易忘记。就像之前弄的全连通子图,过了一段时间了,不仅算法名字忘了,连到底是怎么做的我都想不起来了(逃。所以这次还是干脆写下来好了。Boyer-Moore是一个字符串算法,这个算法追求的就是,每次匹配了一般发现失败了,要往前移动尽可能多的距离,少算一点是一点。为了实现这个目标...

weixin_39530149的博客 202

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

高效字符串匹配之Boyer-Moore & Rabin-Karp

1,Boyer-Moore算法 Boyer-Moore算法是将字符串匹配的过程逆转,是从右到左匹配的。S串为待匹配串,T串为模式串。T沿着S不断向右移动,针对每次的位置,先判断T[m-1]是否匹配上,接着判断T[m-2], T[m-3]... T[0]。如果匹配不上,则向右移动T一个skip距离。这个skip不一定是1。 2,Rabin-Karp算法

二十三小时 840

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Boyer-Moore算法详解(二)

字符串匹配的Boyer-Moore算法 作者: 阮一峰 日期: 2013年5月 3日 转自:http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html 上一篇文章,我介绍了KMP算法。 但是,它并不是效率最高的算法,实际采用并不多

dashan120的专栏 556

提取Python stringlib中的"BMHBNFS"字符串查找算法

Python中的stringlib字符串查找算法是Boyer-Moore,Horspool, Sunday, Bloom Filter几种算法的合成体, 大概的原理如下: def find(s, p): # find first occurrence of p in s n = len(s) m = len(p) skip = delta1(p)[p[m-1]...

baiguomeng 305

grep 大文件会内存溢出吗_程序员面试冷知识:为什么grep查找效率这么快

更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)GNU的grep程序作者认为是有两个因素:fast search和fast input。https://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html快速查找/fast searchgrep是基于Boyer-Moore算法,该算法首先查找目标字符串...

weixin_32048835的博客 1899
上一篇: Lucene.Net 2.3.1开发介绍——附录一、如何下载Lucene.Net的各种版本
下一篇: Detect a written text's language
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值