字符串匹配算法有很多,我们先来介绍简单的BF算法,后面还有PK算法,BM算法,KMP算法等,我会一篇一篇和大家一块讨论。

BF算法的原理与实现

我们先来了解两个概念:主串和模式串,简单的说,如果在字符串a中查找字符串b,那么字符串a就是主串,字符串b就是模式串。我们把主串的长度记作n,模式串的长度记作m。在一般情况下,n大于或等于m,虽然这不是必须的,但如果n小于m,那么主串中肯定不存在模式串。

BF(Brute Force,暴力匹配)算法也称暴力匹配算法,从名字可以看出,这种匹配方式很“暴力”,简单直接,性能不高。

作为简单和暴力的字符串匹配算法,BF算法的思想可以用一句话概述:如果模式串长度为m,主串长度为n,那么在主串中就会有n-m+1个长度为m的子串,我们只需要暴力地对比这n-m+1个子串与模式串,就可以找到主串与模式串匹配的子串,当然,在具体处理的过程中,并不是把n-m+1个子串都事先罗列出来,而是通过下标操作,让起始下标分别为0,1,2,...,n-m的子串与模式串尝试匹配。

下面看看一个简单的代码

//返回第一个匹配起始下标的位置
int bf(char[] a,int n,char[] b,int m){for(int i = 0;i < n-m;i++){int j = 0;while(j < m){if(a[i+j] != b[j]){break;}j++;}if(j == m){return i;}}return -1;
}

BF算法的性能分析

之前我们说过,时间复杂度表示为数据规模n这一个变量的表达式,但是,在有些情况下,时间复杂度会表示为两个变量的表达式,比如说,O(nm),O(n+m)。对于字符串匹配算法,其时间复杂度表示为,需要主串数据规模n和模式串数据规模m共同参与。

从BF算法的原理和代码可以看出来,在极端情况下,如果子串为"aaaa,,,aaaa",模式串为"aaab"。我们用主串中的n-m+1个子串与模式串匹配,每个子串与模式串都需要对比m个字符,这样才能发现无法匹配,因此,最坏时间复杂度为O(nm)。

理论上的BF算法的时间复杂度很高,但是在实际开发中,却是一个比较常用的字符串匹配算法,下面来看看这三条原因。

第一:开发中的大部分情况下的模式串和主串不会很长,对于小规模的数据处理,时间复杂度的高低并不能代表代码真正的执行时间,有些情况下,时间复杂度高的算法可能会比时间复杂度底的算法运行效率更高。

第二:当每次模拟串与主串中的子串匹配时,如果遇到不能匹配的字符,就可以提前终止,不需要把m个字符全部遍历一遍。因此,算法的执行效率要比最坏情况下的效率要高。

第三:BF算法的思想简单,代码实现也简单。

现在来讨论一下为啥在大部分编程语言中,字符串的查找,替换函数都是采用简单的BF算法来实现,而不是采用时间复杂度更低的KMP或者BM算法呢?其实,尽管BF算法的时间复杂度比KMP和BM算法的时间复杂度高,但是相对来说,他们实现起来确是更加的复杂,针对小规模字符串匹配,BF算法才是首选。

一看就懂的字符串匹配算法 之 BF算法(暴力匹配)相关推荐

  1. 一看就懂的字符串匹配算法 之 BM算法

    先来一个导读,关于BM算法开始有了难度,大家一定要静下心,咬着呀也得给我读下去,这样你才能有收获. 我们在文本编辑器中,我们经常用到查找及替换功能.比如说,在Word文件中,通过查找及替换功能,可以把 ...

  2. 一看就懂的字符串匹配算法 之 RK算法

    RK算法是对BF算法的进一步优化,很巧妙的使用了哈希算法,让匹配的效率有了很大的提升. BF算法  这是关于BF暴力匹配算法的博客,大家可以先去看看. RK算法的原理和实现 之前在讨论BF算法的时候, ...

  3. 字符串匹配算法(BF算法KMP算法)

    字符串匹配算法 暴力匹配(BF)算法 KMP算法 next数组 求next数组的练习 next数组的优化(nextval数组) 练习 暴力匹配(BF)算法 BF算法,即暴力(Brute Force)算 ...

  4. 字符串处理 —— 单模式匹配 —— 朴素的字符串匹配算法(BF 算法)

    [算法流程] 朴素的字符串匹配算法即暴力匹配算法(BF,Brute Force),其本质是暴力枚举,主要特点有: 没有预处理阶段: 滑动窗口总是后移 1 位: 对模式中的字符的比较顺序不限定,可以从前 ...

  5. diff算法阮一峰_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法

    前言 文章的一开头,还是要强调下字符串匹配的思路 将模式串和主串进行比较 从前往后比较 从后往前比较 2. 匹配时,比较主串和模式串的下一个位置 3. 失配时, 在模式串中寻找一个合适的位置 如果找到 ...

  6. 大量的数据做字符串匹配_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法...

    前言 文章的一开头,还是要强调下字符串匹配的思路 将模式串和主串进行比较 从前往后比较 从后往前比较 2. 匹配时,比较主串和模式串的下一个位置 3. 失配时, 在模式串中寻找一个合适的位置 如果找到 ...

  7. 数据结构与算法分析(十六)--- 如何设计更高效的字符串匹配算法?(BF + RK + KMP + BMH)

    文章目录 一.Brute Force 匹配算法 二.Rabin–Karp 匹配算法 三.Knuth–Morris–Pratt 匹配算法 四.Boyer-Moore-Horspool 匹配算法 五.字符 ...

  8. 字符串匹配算法之BM算法

    BM算法,全称是Boyer-Moore算法,1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法. BM算法定义了两个规则: ...

  9. 字符串匹配算法:Horspool算法

    Horspool 字符串匹配算法对Boyer-Moore算法的简化算法. Horspool 算法是一种基于后缀匹配的方法,是一种"跳跃式"匹配算法,具有sub-linear亚线性时 ...

  10. 字符串匹配算法(KMP算法JAVA版)

    目录 暴力匹配 KMP算法 暴力匹配 暴力算法就是 普通模式的匹配算法 bf算法就是将目标的字符串 的第一个字符与模式的第一个字符进行匹配,相等的话就继续比较第二个字符是否是匹配的,依次进行下去,如果 ...

最新文章

  1. DCN-cs6200 ipv6 6to4隧道
  2. 真正的云主机到底是什么样的?
  3. 五轴加工的RTCP技术
  4. 哲学家就餐(避免死锁)(多进程版)
  5. 列标题 如何删除gridcontrol_GridControl简单属性操作
  6. Redis(三)主从复制实现高可用(redis—sentinel)
  7. 程序人生:程序员做外包“前途“,“技术“,“经验“如何决策
  8. python : class定义中的:__dict__,__setattr__,__getattribute__,__getattr__,
  9. 51单片机——多文件的建立
  10. 万字教程:Python Word 文档自动化
  11. Appium原理分析
  12. matlab编运行的程序吗,matlab2020怎么运行-matlab运行程序的方法步骤
  13. hdu 1290 (切西瓜问题)
  14. 领导合影站位图_领导主席台座次安排图解:政务礼仪
  15. 数据库并发抢红包_Redis乐观锁解决高并发抢红包的问题
  16. 目标检测 | 丰富特征导向Refinement Network用于目标检测(附github源码)
  17. linux bam文件格式,sam和bam格式文件的shell小练习-答案
  18. 现场工程师出手-PCAPHub与云SSH隧道稳妥实现异地LAN IIoT联测
  19. 7-158 判断4和7的倍数
  20. C语言、Java学习笔记(三)---几种简单的排序算法

热门文章

  1. c#明华rf读卡器_RF通用开发包 明华RF读卡器 demo for c#(RF reader demo for c#) - 下载 - 搜珍网...
  2. 【利用WPS功能破解密码】笔记
  3. 小米 samba linux,解决小米路由器升级固件后samba无法访问一例
  4. 极光im支持android手机系统,极光IM- JMessage 产品简介 - 极光文档
  5. SQL 删除重复数据,重复数据只保留ID最小的行
  6. 零基础入门Matlab(一篇两个小时就能学完的入门博客)
  7. 快手无水印解析API
  8. 萤火虫算法(Firefly Algorithm)
  9. oracle jde优势介绍,JDE 的扫盲知识介绍。。。
  10. android动画源码合集、动态主题框架、社交app源码等