三种最基本的字符串匹配算法是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算法确实在大多数情况下都具有很好的性能体现。



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

  1. java equals 判断空_Java 判断字符串是否为空的三种方法与性能分析

    [java中判断字符串是否为数字的三种方法  1>用JAVA自带的函数 public static boolean isNumeric(String str){   for (int i = s ...

  2. OpenCv中实现了三种立体匹配算法:

    OpenCv中实现了三种立体匹配算法: BM算法 SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information GC算法 ...

  3. SATA、SAS、SSD三种硬盘存储性能数据

    文章目录 SATA.SAS.SSD三种硬盘存储性能数据 顺序读 顺序写 随机读 随机写 结论: SATA.SAS.SSD三种硬盘存储性能数据 顺序读 可以看到 在对4KB数据包进行连续读的情况下: S ...

  4. 详解C#实例化对象的三种方式及性能对比

    前言 做项目过程中有个需求要实例化两万个对象并添加到List 中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录. 首先想到的是可能实例化比较耗时,于是开始对每种实例 ...

  5. Sql Server中三种字符串合并方法的性能比较

    最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.         示例:         有表內容﹕         名称  內容        ...

  6. JS中三种字符串连接方式及其性能比较

    工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法  用连接符"+"把 ...

  7. Swift忽略大小写搜索子字符串的三种方法及性能对比

    功能需求 在Swift中,字符串比较和搜索是很常见的操作.有时我们需要以特殊条件在一个字符串中搜索子字符串:比如忽略大小写或忽略变音符号. 在本篇博文里,我们将探讨Swift里三种特殊搜索字符串的方法 ...

  8. 4种字符串匹配算法:有限自动机(中)

    接着上文(地址),我们来聊一聊自动机算法(有限自动机字符串匹配算法)和KMP算法. ====#=有限自动机算法=#===== 关于有限自动机,网上的分析的资源,大部分都很笼统,算导上的知识点,全是数学 ...

  9. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

最新文章

  1. Ubuntu18.04挂载exfat格式移动硬盘
  2. 程序运行实例数量的控制
  3. 重新学习web后端开发-001-写在前面的话
  4. SQL注入(SQL Injection)
  5. SpringBoot2.5.4发送邮件4种方式
  6. 已经没有再谈话再培养的飞秋必要了
  7. 全国计算机基础知识考试题型,盘点 | 全国计算机等级考试一般考哪些内容?
  8. git中如何提交空目录
  9. mybatis连接池
  10. SQL 分类汇总 合计行
  11. c++求平均值_2020五一建模:C题 饲料混合加工(二)
  12. JAVA|大小写英文字母表
  13. snmp++ linux 编译出错_成为linux高手的第二步
  14. UIDocumentPickerViewController docx xlsx
  15. 软件架构设计杂记: 好作品是改出来的,好的代码是不断重构打磨出来的, 心性是历经艰难困苦修炼出来的
  16. 在vue中使用marked解析markdown文件
  17. Spark应用启动报错:Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
  18. ESP32解析ble蓝牙手柄信号,直接通讯,用于控制机器人小车机械臂等
  19. 神州数码交换机CS6200命令学习(三)
  20. manjaro 安装的艰辛历程,常用软件安装以及踩坑

热门文章

  1. java request 原理_JavaWeb-seession原理
  2. 微信广告服务器地址,【微信广告服务商平台】微信广告服务商平台运营经验分享!...
  3. volley 调用php接口,使用Volley发送帖子请求并使用PHP接收
  4. leetcode 组合总和
  5. vue 登录模板_不用自己搭建后台模板,使用这个就够了
  6. python写自动答题脚本_问卷星的自动答题脚本
  7. GNN 笔记1 图的概念
  8. 数据可视化应用案例:从面积到人口,再到经济、房贷等等方面透析重庆市
  9. 玩点不一样的,如何使用MATLAB实现批量修改文件后缀名,文件名,批量复制文件
  10. MATLAB从入门到精通系列之几个实用小技巧