BM算法(手算版)

BM 算法

        BM 算法是一种字符串匹配的算法。
        与 KMP 相比,BM 算法不扫描全部输入字符,平均匹配时间 c・n, 常量 c <1 (随机或真实文本), 但最坏情况是 O (n・m).
        可以将 BM 算法的最坏情况改进到 O (n):通过记录文本后缀中最长的模式后缀。

 

要使用 BM 算法,需要知道两个信息:
1. 用于坏字符规则的 bc 数组
2. 用于好后缀规则的 gs 数组

坏字符规则

坏字符规则分为两种情况:
1. 失配位置指向的文本串中对应的字符 ,不存在于模式串中。


如上图所示,在这种情况下,直接将整个模式串移动到失配位置 之后。

2. 失配位置指向的文本串中对应的字符 ,存在于模式串中,且在失配位置 的左边。

坏字符


        如上图所示,在这种情况下,将模式串中的文本串中对应的字符 放在失配位置 上。
 

需要注意两个问题:
        1. 这个 “模式串中的文本串中对应的字符 ”,是整个模式串从右往左数的第一个符合的字符。否则会造成过度左移。
        2. 模式串中最后一个字符,不能和任何的失配位置 匹配。这是因为 “失配” 的前提是有匹配,而右边第一个字符必然被匹配;否则在右边第一个字符失配,那说明所需要的字符不是这个右边的第一个字符。故最后一个字符对应的位置是从右边数第二个符合数的位置。
如字符串 “GCAGAGAG” 的坏字符表为 (从 0 开始计数,从右往左数):

charACGT
bc[char]1628

        坏字符表不是一直有效的。如果坏字符表中记载的位置,在失配位置 的右边,那么可能会造成负位移或原地不动。
        一个解决方法是,记载每次失配位置 的左边的第一个符合的字符:但这很麻烦。
        这并不是说位移就是上表的值。位移 = bc [char]- 失配位置 Z。(从右往左数,0 开始)

好后缀规则

好后缀规则分为 3 种情况:


rule3:

如图 14.1,目前匹配好的后缀 u,在模式串中存在。如果有多个,则取最靠右的且 c!=a 的那个,并将其对齐。

rule2:

如图 14.2,目前匹配的好后缀 u,在模式串中其他位置不存在。但它的后缀,和模式串的前缀相同。如果有多个满足的后缀,则取最长的那个后缀,并将其对齐。

rule1:

如图 14.?,目前匹配的好后缀 u,在模式串中其他位置不存在。且它的每一个后缀,和模式串的前缀都不相同。这种情况下,直接将整个模式串移动到当前的最右端之后。

        好后缀规则和坏字符规则是可以同时使用的,我们每次取俩者中最大的那个。
 

        如坏字符规则一样,好后缀也有自己的表,叫做 gs 数组。要想得到 gs 数组,首先要利用 suff 数组。

suff 数组:存储从字符 s [i] 向左开始计数的,和模式串最右边字符开始的匹配的字符个数。

如字符串 “GCAGAGAG” 的 suff 为 (从 0 开始计数):

GCAGAGAG
10020408

从右往左看:
从 G 开始,GAGAGACG 与 GAGAAGACG 匹配,个数是 8,故填 8。
从 A 开始,没有字符匹配 (因为右边第一个字符是 G),故填 0。
从 G 开始,GAGA (下一个是 C) 与 GAGA (下一个是 G) 匹配,个数是 4,故填 4。
从 A 开始,没有字符匹配 (因为右边第一个字符是 G),故填 0。
从 G 开始,GA (下一个是 C) 与 GA (下一个是 G) 匹配,个数是 2,故填 2。
从 A 开始,没有字符匹配 (因为右边第一个字符是 G),故填 0。
从 C 开始,没有字符匹配 (因为右边第一个字符是 G),故填 0。
从 G 开始,G (下一个是末尾) 与 G (下一个是 A) 匹配,个数是 1,故填 1。

        接下来,我们依次处理 rule1,rule2,rule3,来获得 gs 数组。
        为什么是这个顺序:因为 rule1 位移 > rule2 位移 > rule3 位移,大的值被小的值取代,才不会造成过度右移
具体的理解,可以见高效字符串匹配算法

 

施加 rule1:
所有的项均有最大位移 8 (字符串长):

GCAGAGAG
88888888

施加 rule2:
step1:从右往左扫描模式串,找到第一个下标 (下标从左往右数,从 0 开始计。略过最右边的数)+1=suff [i] 的位置。对上面的例子来说,这个位置是 “i=0”,对应的是最左边的字符 G。
step2:从左往右扫描字符串,将扫描过的位置对应的 gs 数组改为 “当前值 - suff [i]”,直到剩下 suff [i] 个字符。
step3:step 继续向左,step2 继续向右,直到扫描完成。

GCAGAGAG
77777778

施加 rule3:
从左往右扫描字符串 (略过最右边那个),将 gs [suff [i]] 改为 i (下标从右往左数,以 0 开始):

变化 1:

GCAGAGAG
77777778

变化 2:

GCAGAGAG
77777475

变化 3:

GCAGAGAG
77727473

变化 4:

GCAGAGAG
77727471

一个实例


向右位移 = max (bc [A]-Z,gs [0])=max (1-0,1)=1;
 

实例


向右位移 = max (bc [C]-Z,gs [2])=max (6-2,4)=4;
 

实例

向右位移 = max (0,gs[-1---->0] )=max(0,7)=7;


向右位移 = max (bc [C]-Z,gs [2])=max (6-2,4)=4;


向右位移 = max (bc [C]-Z,gs [1])=max (6-1,7)=7;
附:对于字符串 aaaaaa,其 gs 数组为 {6,6,6,6,6,6}—>{1,2,3,4,5,6}—–>{1,2,3,4,5,6}。

与 kmp 比较

1.KMP 算法的实际性能不好,一般实际中不用
2.BM 速度快,但最快的 BM 类算法不是完整 BM 算法而是简化的版本 (复杂度和效率的折中版本)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/450664.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机系统简介

一、计算机的软硬件概念 1.硬件&#xff1a;计算机的实体&#xff0c;如主机、外设、硬盘、显卡等。 2.软件&#xff1a;由具有各类特殊功能的信息&#xff08;程序&#xff09;组成。 系统软件&#xff1a;用来管理整个计算机系统&#xff0c;如语言处理程序、操作系统、服…

群晖前面加了雷池社区版,安装失败,然后无法识别出用户真实访问IP

有nas的相信对公网都不模式&#xff0c;在现在基础上传带宽能有100兆的时代&#xff0c;有公网代表着家里有一个小服务器&#xff0c;像百度网盘&#xff0c;优酷这种在线服务都能部署为私有化服务。但现在运营商几乎不可能提供公网ip&#xff0c;要么自己买个云服务器做内网穿…

通过github创建自己网页链接的方法

文章目录 要使用GitHub创建静态网页链接&#xff0c;可以按照以下详细步骤进行操作&#xff1a;一、准备阶段二、创建仓库并配置三、准备并上传静态网站文件四、配置GitHub Pages五、访问和更新你的静态网页 要使用GitHub创建静态网页链接&#xff0c;可以按照以下详细步骤进行…

uniapp微信小程序调用百度OCR

uniapp编写微信小程序调用百度OCR 公司有一个识别行驶证需求&#xff0c;调用百度ocr识别 使用了image-tools这个插件&#xff0c;因为百度ocr接口用图片的base64 这里只是简单演示&#xff0c;accesstoken获取接口还是要放在服务器端&#xff0c;不然就暴露了自己的百度项目k…

Xshell使用密钥远程登录Ubuntu 22.04报错:所选的用户密钥未在远程主机上注册。请再试一次

报错截图如下&#xff1a; 问题原因&#xff1a; Ubuntu 22.04 不支持 Xshell使用的私钥。 查看系统支持的私钥&#xff1a;sudo sshd -T | egrep "pubkey" ~$ sudo sshd -T | egrep "pubkey" pubkeyauthentication yes pubkeyacceptedalgorithms ssh-ed…

基于SpringBoot+Vue的旅游服务平台【提供源码+答辩PPT+参考文档+项目部署】

&#x1f4a5; ① 前言&#xff1a;这两年毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的JavaWeb项目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff01; ❗② 如何解决这类问题&#xff1f; 让我们能够顺利通过毕业&#xff0c;我也一直在不断思考、…

ROS 的 urdf 中 link 和 joint 的子标签中 origin 的含义

主要参考文章——主要文章&#xff0c;官方关于urdf的介绍和官方文档的翻译解析 link标签里面的origin含义 link标签里面有三个主要的子标签&#xff0c;分别是visual——连杆的外观和坐标系&#xff0c;collisoin——连杆的碰撞属性和inertial——连杆的惯性设置 首先&…

【AIGC】AI如何匹配RAG知识库: Embedding实践,语义搜索

引言 RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式&#xff0c;我们除了使用之外可以尝试了解其是如何实现的。在实现RAG的过程中Embedding是非常重要的手段。本文将带你简单地了解AI工具都是如何通过Embedding去完成语义分析匹配的。 Embedding技术简…

低空经济发展迅猛,无人机设计制造技术详解

低空经济的迅猛发展&#xff0c;为无人机设计制造技术带来了新的机遇和挑战。无人机作为低空经济中的重要组成部分&#xff0c;其设计制造技术直接关系到无人机的性能、安全性和应用场景的拓展。以下是对无人机设计制造技术的详细解析&#xff1a; 一、无人机设计技术 1. 气动…

【HTML + CSS 魔法秀】打造惊艳 3D 旋转卡片

HTML结构 box 类是整个组件的容器。item-wrap 类是每个旋转卡片的包装器&#xff0c;每个都有一个内联样式–i&#xff0c;用于控制动画的延迟。item类是实际的卡片内容&#xff0c;包含一个图片。 <template><div class"box"><div class"item…

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU&#xff1a; STM32L010F4 &#xff0c;上次测试的 VL53L0X 需要移植到这个芯片上&#xff0c;网上一搜 STM32L010F4&#xff0c;都是介绍资料&#xff0c;没有最小系统&#xff0c;使用说明等。…

计算生物学与生物信息学漫谈-1-测序一路走来

最近工作中&#xff0c;反思自己计算生物学基础非常薄弱&#xff0c;然而作为一门非常新兴的交叉学科&#xff0c;涉及计算机、物理、生物、数学等多多学科&#xff0c;国内并没有这样完善的教程&#xff0c;因此想要自己做一个教程&#xff0c;使用费曼学习法学习&#xff0c;…

探讨淘宝商品 API 接口:运用及收益

在当今电子商务蓬勃发展的时代&#xff0c;淘宝作为全球领先的电商平台&#xff0c;拥有海量的商品资源和庞大的用户群体。而淘宝商品 API 接口的出现&#xff0c;为开发者和企业提供了一种强大的工具&#xff0c;能够实现对淘宝商品数据的高效获取和利用。本文将深入探讨淘宝商…

C语言 | Leetcode C语言题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> constructRectangle(int area) {int w sqrt(1.0 * area);while (area % w) {--w;}return {area / w, w};} };

2024年PDF转JPG新趋势,4款常用编辑工具梳理,不容错过

嘿&#xff0c;大家好&#xff0c;我是你们的老朋友&#xff0c;今天咱们聊个超实用的技巧——把PDF文件变成JPG图片&#xff0c;这样分享起来就方便多了。不管是工作汇报、学习资料还是生活照片&#xff0c;这招都能让你事半功倍。 1. 福昕PDF编辑器 闪现 ✚ https://editor…

排序---java---黑马

排序算法 名称平均时间复杂度最好情况最坏情况空间复杂度稳定性冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) Y Y Y选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) N N …

【JavaScript】网页交互的灵魂舞者

我的主页&#xff1a;2的n次方_ 1. JavaScript 的三种引入方式 引⼊⽅式 语法描述 ⽰例 ⾏内样式 直接嵌⼊到 html 元素内部 <input type"button" value"点我⼀下" οnclick"alert(haha)"> 内部样式 定义<script>标签&a…

PDF 软件如何帮助您编辑、转换和保护文件

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案&#xff0c;还是尝试组织和编辑主文档&#xff0c;PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时&#xff0c;请考虑这些因素。 1. 确定您的…

蒙特卡洛法面波频散曲线反演(matlab)

面波频散曲线反演是一种地震波形反演方法&#xff0c;用于估计地下结构的物理参数。其原理基于面波频散现象&#xff0c;即地震波在地下传播时会由于地下结构的变化而导致波速的变化&#xff0c;从而在地震记录中形成不同频率的相位延迟。具体而言&#xff0c;面波频散曲线反演…

Jmeter接口测试企业级项目实战day3

1.了解Jmeter的内部细节&#xff0c;排查错误的原因 取样器&#xff1a;发送请求&#xff0c;接受响应 -> 查看结果树请求和响应&#xff08;头和正文&#xff09; 断言&#xff1a;验证响应 ->查看结果树&#xff08;采样结果&#xff09; 提取…