BF,KMP,BM三种字符串匹配算法性能比较

2023-11-15

三种最基本的字符串匹配算法是BF,KMP以及BM,BF算法是最简单直接的匹配算法,就是逐个比较,一旦匹配不上,就往后移动一位,继续比较,所以比较次数很都。

关于KMP和BM的详细介绍可以参考下面的两个link,是讲得比较好的。

KMP

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

BM

http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html

理论上,BM具有最好的性能,因为比较的次数最好,其次是KMP,最差的应该是BF。

今天对这三种算法做了一个简单的测试,测试程序运行在Windows 7 x64位系统上,四核CPU,32G内存,测试程序为x64。

说明,只测试在目标字符串中找不到要搜索的字符串,以便能够遍历完所有字符串。

测试1,在1亿个字符串(100M)搜索一个长度为20字节字符串,结果如下:

BF spent time is 171(ms)
KMP spent time is 422(ms)
BM spent time is 15(ms)

最快的是BM算法,花的时间也最少(15ms).

测试2, 在10亿个字符串中(1G)中搜索一个长度为20字节的字符串,结果如下:

BF spent time is 1670(ms)
KMP spent time is 4321(ms)
BM spent time is 203(ms)

结果和测试一基本一致。

通过这两次测试,很奇怪的是KMP算法居然比BF算法花的时间还多,说明KMP虽然理论上有很好的性能,但实际上很难有所作为,大多数情况下还不如BF算法。但是BM算法确实在大多数情况下都具有很好的性能体现。





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BF,KMP,BM三种字符串匹配算法性能比较 的相关文章

  • C# 中单个 & 符号的第二个含义是什么?

    我在 C 中使用了单个与号 来表示 检查second条件语句即使第一个是false 但以下似乎是不同的意思 of 总而言之 谁能解释一下如何i 1在下面的例子中有效吗 List
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 为什么 Java 11 中对于空白字符串 String.strip() 比 String.trim() 快 5 倍

    我遇到过一个有趣的场景 因为某些原因strip 针对空白字符串 仅包含空格 明显快于trim 在Java 11中 基准 public class Test public static final String TEST STRING 3 w
  • 如何在 Visual Studio 中搜索并让它忽略注释掉的内容?

    我正在 Visual Studio 2005 中重构 C 代码库 我现在已经完成了这个过程的一半 我已经注释掉了很多旧代码并替换或移动了它 现在我正在搜索 看看下一步必须更改 但搜索功能不断为我带来我不再关心的旧注释掉的内容 我还不想删除旧
  • 如何在字符串vba中包含引号

    我想存储以下文本 Test1 Monday Test Abcdef 全部在字符串中包含引号 我知道要在字符串中包含引号 我必须包含 之前 但在这里这不是一个很好的解决方案 因为我在文本中有太多这样的解决方案 知道如何一次完成这一切吗 您有两
  • 在python中删除链表中的节点

    删除链表中的节点 这个实现有什么问题 def delete self val tmp self head prev None while tmp if val tmp data self size 1 if prev None self h
  • 十六进制字符串的运行长度编码(包括换行符)

    我正在使用以下方法实现游程长度编码GZipStreamC winforms 应用程序中的类 数据以一系列由换行符分隔的字符串形式提供 如下所示 FFFFFFFF FFFFFEFF FDFFFFFF 00FFFFFF 在压缩之前 我将字符串转
  • 如何在EditText中显示格式化文本?

    现在我正在编写简单的笔记应用程序 我需要在 EditText 中显示格式化的单独选定文本 I tried EditText et EditText findViewById R id edittext String string int s
  • 删除Android所有语言中的字符串

    我有一个包含多个翻译的应用程序 我想删除一些字符串 我怎样才能重构并删除它们一次 例如在默认情况下strings xml文件并自动将删除传播到其他翻译的其他 strings xml 文件 您可以通过 Android Studio 中的 翻译
  • string.Compare 行为

    怎么会这样呢 这是从VS2008中的立即窗口获取的 string Compare 1 string Compare 0 0 1 从言论来看字符串比较 http msdn microsoft com en us library 84787k2
  • 在C#中的某个单词之后/之前过滤字符串中的值

    我有很长的字符串 它们是 IMAP 请求的响应 我想从中提取一些值 它通常的格式类似于 x someword 或 someword x 如何获取某个单词 已知 的x 它可以超过一位数字 响应的每一 行 如下所示 x someword r n
  • 使用字符串中的变量名称访问变量值,R

    Intro 一个数据集有大量的age year变量 age 1990 age 1991 etc 我有一个字符串值数组length age years 表示这些变量 使得age years 1 回报 age 1990 etc Need 我想搜
  • PLSql 返回值

    我再次使用一些 PLSql 我想知道 是否有任何方法可以像选择一样使用以下函数 而不必将其转换为函数或过程 这样我就可以从包含它的脚本中看到代码 代码如下 DECLARE outpt VARCHAR2 1000 flow rI VARCHA
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何处理最终字符串?

    制作有什么好处吗String as final或者我们可以做String as final 我的理解是 由于 String 是不可变的 因此没有必要将其设为最终的 这是正确的还是人们想要的情况String as Final Code pri
  • PHP:将多字节字符串(单词)拆分为单独的字符

    尝试使用 mb split 将这个字符串 主楼怎么走 分割成单独的字符 我需要一个数组 但没有成功 有什么建议吗 谢谢你 例如 尝试使用带有 u 选项的正则表达式 chars preg split u string 1 PREG SPLIT
  • 执行 Boyer-Moore 模式匹配时是否必须考虑编码?

    我即将实现 Boyer Moore 模式匹配算法的变体 具体来说是星期日算法 我问自己 我的字母表大小是多少 它是否取决于编码 可能的字符数 或者我可以假设我的字母表由 256 个符号组成 一个字节可以表示的符号数 在许多其他情况下 将字符
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 如何展平解析树并存储在字符串中以进行进一步的字符串操作 python nltk

    我正在尝试从树结构中获取扁平树 如下所示 我想将整个树放在一个字符串中 就像没有检测到坏树错误一样 S NP SBJ NP DT The JJ high JJ seven day PP IN of NP DT the CD 400 NNS

随机推荐

  • => js 中箭头函数使用总结

    箭头函数感性认识 箭头函数 是在es6 中添加的一种规范 x gt x x 相当于 function x return x x 箭头函数相当于 匿名函数 简化了函数的定义 语言的发展都是倾向于简洁 对人类友好的 减轻工作量的 就相当于我最钟
  • Zookeeper启动报错~找不到或无法加载主类

    按照之前自己写的博客安装zk 在启动的时候却发现 就是启动不了 百思不得其解 额 唯一的区别就是zk的版本不一样了 最后通过查看启动日志 一般都是在zk的log路径下 查出竟然报了如下的错误 root centos 1 logs tail
  • 博图程序需要手动同步_TIA(博图)S7-1200实战篇:模拟量标定3--SCL语言生成成FC/FB块续...

    往期相关回顾 定义各变量名称传感器量程上限 HI 下限 Lo PLC接收数字量 上限 K1 下限 K2 模拟量输入 AI 然后公式是 AI K2 K1 K2 HI Lo Lo 我们已经知道传感器标定的公式 那又如何在博图SCL语言环境编写程
  • 【精读系列】GloVe: Global Vectors for Word Representation

    本论文介绍了一种基于计数统计的词向量学习方法 GloVe 作者实验说明效果优于 Word2Vec 模型 阅读完成时间 20221109 一些预备知识或者是常用知识 GloVe 模型属于 count based method 所谓 count
  • Flink CDC(2.0) 如何加速海量数据的实时集成?

    原文 Flink CDC 如何加速海量数据的实时集成 知乎 导读 Flink CDC如何解决海量数据集成的痛点 如何加速海量数据处理 Flink CDC社区如何运营 如何参与社区贡献 今天的介绍会围绕下面四点展开 Flink CDC 技术
  • 自媒体怎么做?综合类自媒体账号怎么做好

    原创 自媒体运营中比较大众化的就是综合类 比如趣头条 搜狐号等 可以发文字内容 可以发图文内容也可以发视频 可以说是多样化的 对于创作者来说 这样的平台更加方便 但是运营其实更加难 如果只是单一类的 掌握一种运营方法还比较容易 但是这种多样
  • FATFS实现数据追加功能(原文不覆盖)

    在对FATFS的应用中我们经常需要把采集的数据存入的文件中 用作保存 也许我们的系统是一个长期的运行过程 但是我们的数据可能不是持续采集的 所以我们这样写代码 注册一个工作区域 f mount 0 fs 打开创建一个新文件 res f op
  • Chrome开启自带多线程下载

    在地址栏输入 chrome flags 然后在搜索框中输入 Parallel downloading 选择enabled 重启Chrome
  • hadoop学习笔记之分布式计算框架

    分布式计算框架 移动计算而不是移动数据 移动计算就是把你写好的计算 程序拷贝到不同的计算节点上运行 MapReduce适合做离线计算 Storm适合做流失计算 Spark适合做内存计算框架 从HDFS上存储的数据作为我们MapReduce的
  • 前端如何高效的与后端协作开发

    前端如何高效的与后端协作开发 1 前后端分离 前端与后端的分离 能使前端的开发脱离后端的开发模式 拥有更大的自由度 以此便可做前端工程化 组件化 单页面应用等 可以参考 前后端分离 web与static服务器分离 2 尽量避免后端模板渲染
  • 点云数据生成鸟瞰图笔记

    参考博客 处理点云数据 一 点云与生成鸟瞰图 灰信网 软件开发博客聚合 点云数据 点云数据一般表示为N行 至少三列的numpy数组 每行对应一个单独的点 所以使用至少3个值的空间位置点 X Y Z 来表示 如果点云数据来自于激光雷达传感器
  • jQuery dataTables 的使用

    jQuery 的插件 dataTables 是一个优秀的表格插件 提供了针对表格的排序 浏览器分页 服务器分页 筛选 格式化等功能 dataTables 的网站上也提供了大量的演示和详细的文档进行说明 为了方便学习使用 这里一步一步进行说明
  • 跨域和处理跨域

    一 跨域的概念 在讨论跨域之前 我们先来说一下什么是 同源策略 看下面这个URL地址 该URL由 协议 IP 端口等部分组成 如果他的协议 IP和端口3者都一样我们就可以称之为是同源 有一个不一样就不是同源 即 跨域 也就是跨域访问 默认这
  • SX126x-数字接口SPI和控制功能

    目录 1 前言 2 Reset 3 SPI接口 3 1 属性要求 3 2 时序参数要求 1 离开Sleep模式时的时序 4 BUSY引脚 4 1 Tsw 4 2 TswMode 5 DIO 5 1 DIO1 5 2 DIO2 5 3 DIO
  • 某校2016专硕编程题-矩阵排序

    问题 编写一个函数 功能是对矩阵进行处理 对于一个m n行的矩阵 执行函数后使其每行元素的大小按照升序排列 分析 每行元素排列就是将数组的每一行执行一次排序算法 Java实现 对矩阵的单行进行排序 随便选一种排序算法即可 选择排序 publ
  • Java中的constant是什么_如何在Java中定义常量(Constant)

    Method One interface ConstantInterface String SUNDAY SUNDAY String MONDAY MONDAY String TUESDAY TUESDAY String WEDNESDAY
  • springcloud+vue+nginx+linux项目部署

    一 项目打包 右边栏Maven Projects gt package 进行项目打包 可以把闪电标志点掉 这样会过滤掉test项 二 将jar包上传到服务端 并运行jar包 nohup java jar XXXX jar gt XXXX t
  • 全国职业技能大赛云计算--高职组赛题卷②(私有云)

    全国职业技能大赛云计算 高职组赛题卷 私有云 第一场次题目 OpenStack平台部署与运维 任务1 基础运维任务 5分 任务2 OpenStack搭建任务 15分 任务3 OpenStack云平台运维 15分 任务4 OpenStack云
  • 华为OD机试 Python 最长公共后缀

    描述 你有一堆字符串 你的任务是找出这堆字符串共同拥有的那段尾字符 如果没有共同的尾 就回答 Zero 具体规定 字符串的数量至少为2 最多为1000 每个字符串的字符都是ASCII码里的 所以范围是 1 126 示范 比如 给你 abc
  • BF,KMP,BM三种字符串匹配算法性能比较

    三种最基本的字符串匹配算法是BF KMP以及BM BF算法是最简单直接的匹配算法 就是逐个比较 一旦匹配不上 就往后移动一位 继续比较 所以比较次数很都 关于KMP和BM的详细介绍可以参考下面的两个link 是讲得比较好的 KMP http