BM模式匹配算法原理(图解)

首先,先简单说明一下有关BM算法的一些基本概念。

BM算法是一种精确字符串匹配算法(区别于模糊匹配)。

BM算法采用从右向左比较 的方法,同时应用到了两种启发式规则,即坏字符规则 和好后缀规则 ,来决定向右跳跃的距离。

BM算法的基本流程: 设文本串T,模式串为P。首先将T与P进行左对齐,然后进行从右向左比较 ,如下图所示:

若是某趟比较不匹配时,BM算法就采用两条启发式规则,即坏字符规则 和好后缀规则 ,来计算模式串向右移动的距离,直到整个匹配过程的结束。

下面,来详细介绍一下坏字符规则 和好后缀规则 。

首先,诠释一下坏字符和好后缀的概念。

请看下图:

图中,第一个不匹配的字符(红色部分)为坏字符,已匹配部分(绿色)为好后缀。

    1)坏字符规则(Bad Character):

在BM算法从右向左扫描的过程中,若发现某个字符x不匹配,则按如下两种情况讨论:

i. 如果字符x在模式P中没有出现,那么从字符x开始的m个文本显然不可能与P匹配成功,直接全部跳过该区域即可。

ii. 如果x在模式P中出现,则以该字符进行对齐。

用数学公式表示,设Skip(x)为P右移的距离,m为模式串P的长度,max(x)为字符x在P中最右位置。

例1:

下图红色部分,发生了一次不匹配。

计算移动距离Skip(c) = 5 - 3 = 2,则P向右移动2位。

移动后如下图:

2)好后缀规则(Good Suffix):

若发现某个字符不匹配的同时,已有部分字符匹配成功,则按如下两种情况讨论:

i. 如果在P中位置t处已匹配部分P'在P中的某位置t'也出现,且位置t'的前一个字符与位置t的前一个字符不相同,则将P右移使t'对应t方才的所在的位置。

ii. 如果在P中任何位置已匹配部分P'都没有再出现,则找到与P'的后缀P''相同的P的最长前缀x,向右移动P,使x对应方才P''后缀所在的位置。

用数学公式表示,设Shift(j)为P右移的距离,m为模式串P的长度,j 为当前所匹配的字符位置,s为t'与t的距离(以上情况i)或者x与P''的距离(以上情况ii)。

以上过程有点抽象,所以我们继续图解。

例2:

下图中,已匹配部分cab(绿色)在P中再没出现。

再看下图,其后缀T'(蓝色)与P中前缀P'(红色)匹配,则将P'移动到T'的位置。

移动后如下图:

自此,两个规则讲解完毕。

在BM算法匹配的过程中,取SKip(x)与Shift(j)中的较大者作为跳跃的距离。

BM算法预处理时间复杂度为O(m+s),空间复杂度为O(s),s是与P, T相关的有限字符集长度,搜索阶段时间复杂度为O(m·n)。

最好情况下的时间复杂度为O(n/m),最坏情况下时间复杂度为O(m·n)。

转载于:https://www.cnblogs.com/fuyou/p/3233291.html

BM模式匹配算法原理(图解)相关推荐

  1. 数据结构:KMP算法 串的模式匹配算法(全网最详细)

    目录 KMP模式匹配算法 简述 KMP模式匹配算法原理 如果人眼来优化的话,怎样处理         接下来我们自己来发现j的移动规律: 这一段公式证明了我们为什么可以直接将j移动到k而无须再比较前面 ...

  2. 图解字符串的朴素模式匹配算法

    复习串的朴素模式匹配算法 模式匹配 : 子串定位运算,在主串中找出子串出现的位置. 在串匹配中,将主串 S 称为目标(串),子串 T 称为模式(串).如果在主串 S 中能够找到子串 T, 则称匹配成功 ...

  3. 时空权衡在模式匹配算法中的应用(JAVA)--Horspool算法(简化版BM算法)

    模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串.假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题 ...

  4. java分层model_SpringMVC体系分层模式原理图解

    SpringMVC MVC介绍 MVC 全名是 Model View Controller,是 模型(model)-视图(view)-控制器(controller)的缩写, 是⼀种⽤于设计创建 Web ...

  5. 串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.串(String)的定义: 串(String):由零个或多个字符组成的 ...

  6. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

    参考网址:http://blog.csdn.net/luanlouis/article/details/50529868 0.前言 读完本文,你将了解到: 一.为什么说Jabalpur语言是跨平台的 ...

  7. 解析BF(普通串模式匹配算法)算法

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  8. java类索引_《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合...

    讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...

  9. java 字符串匹配_多模字符串匹配算法原理及Java实现代码

    多模字符串匹配算法在这里指的是在一个字符串中寻找多个模式字符字串的问题.一般来说,给出一个长字符串和很多短模式字符串,如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的.该算法广泛应用于 ...

最新文章

  1. 【牢骚】360,你怎么对待别人,别人就怎么对待你。
  2. Angular jasmine单元测试框架里describe的实现原理
  3. echo怎么把日志清空_电脑越来越卡到底怎么办?一分钟教你释放C盘空间,瞬间提速5倍...
  4. 配置了坐标还是找不到serv_为什么老人家总是这疼那疼,还找不到原因?是矫情还是另有原因...
  5. 三个子系统_「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)
  6. C++中没有定义类的引用。
  7. 表观遗传小白逆袭之道:从这 19 个视频开始吧!
  8. 【转】SVN中的Branches分支以及Tags标签详解与应用举例
  9. 【图像隐写】基于matlab GUI DWT+DCT+PBFO改进图像水印隐藏提取【含Matlab源码 081期】
  10. ecshop php7 mysql_ecshop如何修改并支持PHP7
  11. 安卓工作室 日志设置
  12. linux公社_如何在Linux上搭建个人流媒体服务器
  13. h5-吸顶效果的实现方法
  14. python是高级语言还是低级语言_python学习之高级语言和低级语言
  15. js鼠标点击位置 弹出层由中心向四周缓慢扩大
  16. 用我们的奋斗和梦想扬起青春的船帆
  17. cv::imread读不出图片的解决办法
  18. 最惨大学生,大学四年,啥也不会
  19. Https 忽略证书验证
  20. 存储过程——天使还是魔鬼

热门文章

  1. 动手学深度学习Pytorch Task08
  2. 用python对单一微博文档进行分词——jieba分词(加保留词和停用词)
  3. Python计算机视觉中译本实例代码/数据集
  4. 2016-2018年机器学习大赛TOP开源作品汇总
  5. oracle有几种类型表空间,oracle 数据创建时如何指定表空间类型
  6. mysql学习day04
  7. 130712周赛(CF)
  8. Java程序优化的一些最佳实践
  9. 什么是UML?分哪两类?
  10. 利用GSM模块通过GPRS在GMSK调制方式下与IP网通信