数据结构(邓俊辉)学习笔记】串 10——BM_BC算法:坏字符

文章目录

  • 1.坏字符
  • 2. 特殊情况

1.坏字符

在这里插入图片描述

实际上,刚才的实例中我们所展示的那样一个计算过程,就是所谓 BM 算法所采用的策略之一,而这一策略,将我们刚才所说的教训称作坏字符。

在这里,不妨改为基于蛮力算法的第二个版本来进行改造。也就是说模式算中当前参与比对的如果是字符 P[j],那么文本串中对应的就是 T[i + j], 这幅图画出的就是这样一个一般性的场景。

请注意,当前这趟扫描如果的确已经抵达 P[j] 或 T[i + j],则说明在这对字符的右侧,有一段足够长的匹配部分。而相对于模式串而言,这个匹配部分是一个后缀。既然这两个字符失配,不妨就分别将它们记作 X 和 Y。

延续我们在刚才的分析中所采用的逻辑,如果我们将这次失配当做一次教训,那么其原因就可以解释为:在 Y 这个位置,我本来期望是一个 X,然而这个字符Y的出现,却使得我们在此局部获得一次完整匹配的希望成了泡影,因此 BM 算法也将这个字符 Y 称作坏字符。

正是因为这个坏字符的出现,当前这个对齐位置,也就自然地可以被排除掉了。那么,更重要的是,这次教训能够为我们带来什么启示呢?具体的能为我们后续的比对提供什么有益的借鉴呢?

将刚才我们所举的实例推越广之,如果我们还希望能够在这个字符 X 附近,实现一次完整的匹配,那么作为一项必要条件,与这个字符 X 对准的也应该至少是一个 X。是的,由刚才所举的实例推而广之,我们也同样可以得出此时的处置方法。

具体来说,就是试图从模式上中去找出这样的一个字符 X,并且通过相应的移动,使得这个 X 能与文本串中的那个 X 彼此对齐。而一旦完成了这样的对齐,我们又可以继而从最右端开始,启动下一轮的扫描比对。

那么对应于每一个这样的场景,相应的位移量又应该是多少呢?

稍加观察我们不难发现,这个位移量仅取决于刚才失配的位置 j 以及对应的字符 X 在模式传中的位置。而与文本串以及当前的对齐位置没有任何关系。这就意味着我们可以与 KMP 算法一样通过预处理事先计算出每种情况下对应的位移量。

也就是说,我们可以将每一个这样的字符所对应的位移量制成一个表,也就是所谓的 bc 表。通过再进一步观察,我们不能发现,这个表只需记录每一个字符 X 在模式串中所对应的秩,在图中也就对应于这段距离(bc[‘X’])。

我们知道,这段前缀的长度恰好就应该是 j,而对应的位移量也自然就应该是这两段前缀的长度之差。

2. 特殊情况

当然,实际情况要更为复杂一些。不妨来看看还有哪些特殊情况需要考虑并且处置。

在这里插入图片描述

  1. 首先需要考虑的一种情况就是,在模式串中有可能同时存在多个 X,那在这种情况下,我们究竟应该用哪个 X 来替换哪个坏字符 Y 呢?与 KMP 算法一样,当同时存在多个候选时,我们并不倾向于向数学上那样,逐一地去尝试它们,而应该在安全的前提下,选择其一,从而使得我们不必回溯。

也就是说,如果有多个候选,那么我们倾向于选择其中对应的位移量尽可能小的那个。按照刚才的分析,任何一个字符所对应的位移量都与这个字符在模式串中的秩呈反比。因此,为了使得位移量尽可能的小,所对应字符的秩就应该尽可能地大。换而言之,当有多个候选时,我们应该首先选用其中的最靠后者,或者等价的,在相对于这个字符 X 的那个后缀中,必须不包含任何 X。

在这里插入图片描述

  1. 那么与此相反的另一种极端情况就是,在模式串中,可能没有任何这样的 X 可供选择。

    回忆一下,在我们此前所举的那个实例中,的确就有这种情况。比如其中文本串中的那个"道"字,在模式串中根本就没有出现过。你应该还记得我们当时的处置方法,没错,我们只需将模式串完整的移过这个对齐的位置。那么在相应的算法描述以及代码实现的过程中,我们又应该如何统一地来处置这种情况呢?没错,哨兵。

    与 KMP 算法一样,我们可以为每一个模式串在最左侧增设一个假想的通配哨兵。于是所谓的将整个模式串移过这个位置,也就等效于用这个通配的哨兵与刚才失配的字符对齐。既然是通配字符,那么此前适配的这个字符在此后就可以被忽略掉。

实际上,除了以上所介绍的两种,还有一种更为特殊的情况需要处理,你能看出来吗?是的,在这种情况下,模式串中的确至少存在一个候选的字符 X。然而,其中最靠右的那个,位置又过于靠右。也就说,它所对应的那个 bc 表项,或者说他的秩太大了,高过了 j,以至于通过二者之差所计算出来的位移量,既然是一个负数。显然,这样的回溯是没有道理的,也是不必要的。

因为作为这个算法的一条不变性,相对于任何时候的当前对齐位置,此前的所有对齐位置,都已经被淘汰掉了,因此根本没有必要再回过头去重新考虑。既然以前的所有对齐位置都已被淘汰掉,而当前的这个对齐位置也刚刚被否定掉了。所以再直接而简洁不过的处置方法就是,将整个模式串向后移动一个字符,并进而考察下一个对齐位置。

在这里插入图片描述

至此,我们已经兼顾到了可能发生的所有情况,包括特殊情况。我知道 KMP 算法的整个策略,完全是融入并体现于其中的 next 表。而这里的 BM 算法也类似,其策略也将最终融入并体现于 bc 表,以及稍后要介绍的 gs 表。

那么首先一个问题就是 bc 表又当如何构造出来呢?相应的我们又需要花费多长时间呢?

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

设置电子签名

设置点赞签名代码 export class Signature {width: number 300height: number 300canvas!: HTMLCanvasElementctx!: CanvasRenderingContext2Dprivate drawing: boolean falsepreTask: string[] []nextTask: string[] []private allTask: { x: number; y: number; color: …

Leetcode - 周赛413

目录 一,3274. 检查棋盘方格颜色是否相同 二,3275. 第 K 近障碍物查询 三,3276. 选择矩阵中单元格的最大得分 四,3277. 查询子数组最大异或值 一,3274. 检查棋盘方格颜色是否相同 本题就是找规律,假设白…

EPLAN中如何将图纸导出为PDF文件并设置页边距?

EPLAN中如何将图纸导出为PDF文件并设置页边距? 如下图所示,在项目中选中需要导出的图纸页, 如下图所示,点击上方页-----导出------PDF, 如下图所示,在弹出的窗口中设置导出文件的名称、输出目录、输出颜色,这里建议勾选“使用打印边距”, 如下图所示,继续点击下方的设…

论文速读|重新审视奖励设计与评估:用于强健人型机器人站立与行走控制的方法

论文地址:https://arxiv.org/pdf/2404.19173 这篇论文为类人机器人站立和行走(SaW)控制器的持续可衡量改进奠定了基础。通过引入一套定量实际基准测试方法,作者展示了现有控制器的优缺点,并通过基准测试指导新控制器的…

论文速读|自然语言的最优控制合成:机遇与挑战

项目地址:Optimal Control Synthesis from Natural Language: Opportunities and Challenges 介绍了一种从自然语言自动生成最优控制器的框架,该框架主要包括以下几个步骤:首先,通过人类用户提供的初始文本和系统描述,…

源代码如何防泄露?做好这十条轻松应对

源代码防泄露是一个多方面的安全问题,涉及到技术、管理和物理等多个层面。以下是一些有效的策略和方法,结合深信达的SDC防泄密软件,来实现源代码的防泄露: 1. **访问控制**:实施基于角色的访问控制(RBAC&am…

JUC-无锁之CAS

问题提出 (应用之互斥) package cn.itcast; import java.util.ArrayList; import java.util.List; interface Account {// 获取余额Integer getBalance();// 取款void withdraw(Integer amount);/*** 方法内会启动 1000 个线程,每个线程做 -10 元 的操作* 如果初始…

深度学习系列73:使用rapidStructure进行版面分析

1. 概述 项目地址https://github.com/RapidAI/RapidStructure?tabreadme-ov-file 2. 文档方向分类示例 安装$ pip install rapid-orientation import cv2 from rapid_orientation import RapidOrientation orientation_engine RapidOrientation() img cv2.imread(test_im…

C++笔记---string类(简单地使用)

1. string类介绍 string类是C标准库中给出的一种类类型,其目的是为了代替C语言中的字符串。 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是…

【时时三省】(C语言基础)指针进阶 例题

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 字符数组例题: arr后面放了六个字符 所以这个数组的元素个数就是6 第一个arr 因为他计算的是一整个数组的大小 就是打印6 第二个arr0 arr没有单独放在它的内部 所以它计算的就是…

深智城基于超融合数据库MatrixOne的一站式交通大数据平台改造

在智慧交通应用中,数据处理需求极为复杂,涉及人、车辆、道路和环境等多个方面,产生了大量异构数据。交通管理人员需要对这些数据进行实时分析和决策,以应对各种交通事件。然而,在实际生产中会发现数据处理缺陷、管理复…

智慧平台赋能政务管理,声通科技助力政务管理智能化

在智能时代的大潮中,政务管理也在不断寻求创新与突破,在这方面,涌现出了很多优秀的公司。比如声通科技的子公司西安金讯数智信息技术有限公司,就在AI政务热线领域有很多创新成果,为政务管理的智能化升级提供了新思路。…

windows安装php7.4

windows安装php7.4 1.通过官网下载所需的php版本 首先从PHP官网(https://www.php.net/downloads.php)或者Windows下的PHP官网(http://windows.php.net/download/)下载Windows版本的PHP安装包。下载后解压到一个路径下。 2.配…

爆改YOLOv8|利用yolov10的PSA注意力机制改进yolov8-高效涨点

1,本文介绍 PSA是一种改进的自注意力机制,旨在提升模型的效率和准确性。传统的自注意力机制需要计算所有位置对之间的注意力,这会导致计算复杂度高和训练时间长。PSA通过引入极化因子来减少需要计算的注意力对的数量,从而降低计算…

视频汇聚平台LntonAIServer视频质量诊断功能--偏色检测与噪声检测

随着视频监控技术的不断进步,视频质量成为了决定监控系统性能的关键因素之一。LntonAIServer新增的视频质量诊断功能,特别是偏色检测和噪声检测,进一步强化了视频监控系统的可靠性和实用性。下面我们将详细介绍这两项功能的技术细节、应用场景…

window系统开机执行bat脚本

1,win R 打开运行对话框,然后如下图所示输入 第二,打开启动文件夹后,将想要执行的bat脚本,创建快捷方式,放在这里,重启电脑时就会执行这个程序

【Canvas与纹饰】环形小蜜蜂纹饰

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形小蜜蜂纹饰</title><style type"text/css"&g…

《OpenCV计算机视觉》—— 模板匹配

文章目录 一、模板匹配简单介绍二、三个主要函数的介绍1.执行模板匹配函数-cv2.matchTemplate()2.查找最佳匹配函数-cv2.minMaxLoc()3.在原图上绘制匹配区域函数-cv2.rectangle() 三、代码实现 一、模板匹配简单介绍 在Python中&#xff0c;模板匹配是一种在图像中查找与给定模…

【Next】4. 全局通用布局快速搭建

笔记来源&#xff1a;编程导航 基础布局 Next.js 支持全局根布局&#xff08;每个页面都会生效&#xff09;以及嵌套布局&#xff08;可以只对部分页面生效&#xff09;&#xff0c;详情可 参考文档。 在 src 下新建 layouts 目录&#xff0c;用于存放项目中的各种布局。在该目…

无法访问Github?Steam++来帮你

前言 有许多小伙伴发现在国内访问Github真的真的很难&#xff0c;毕竟Github的DNS很容易就被***。 昨天还看到有小伙伴在群上聊天问&#xff1a;如何访问Github&#xff0c;实际上你只需要安装个加速器&#xff0c;或者使用国内的镜像站就可以轻松访问。 当然&#xff0c;如…