数据结构(邓俊辉)学习笔记】串 14——BM_GS算法:构造gs表

news2024/9/25 9:40:29

以下,就来简要地介绍 gs 表的具体构造算法。算法为了便于理解其原理,这里将整个算法划分为若干的层次,并逐层递进、逐层细化。
在这里插入图片描述

我们首先需要引入 MS 子串与 ss 表的概念。实际上,相对于模式串中的任何一个字符 P[j] ,所谓的 MS[j] ,就是某个以 P[j] 为末字符的子串。而且这个子串也同样会出现于整个模式串的尾部。

当然,如果同时存在多个这样的候选,我们会在其中选择最长的那个。概括而言,所谓的 MS[j] 就是终止于 P[j] ,同时与全串的后缀实现最长匹配的子串。当然,这个子串也有可能是空。我们来看这样一个实例:

对于P[8],也就是字符 E 而言,它所对应的 MS 子串,自右向左由 E、C、I、R 这四个字符组成,因为这个子串与整个模式串的后缀实现了最长的匹配。

相应的,在 ss 表中,j 所对应的那一项,其实也就是 MS[j] 子串的长度。

在刚才这个例子中,8号字符 E 所对应的 ss 表项,也自然就应该是子串 RICE 的长度,4。
  ~  
同理,对于字符 P[2] 而言,它所对应地MS 子串为ICE 。相应地ss表项,也就是这个串的长度,3。

在这里插入图片描述

实际上,在中转的这个 ss 表中,已经蕴含了我们最终要计算的 gs 表的所有信息。因此,快速构造 gs 表的问题,也就自然地转化为了如何快速地构造 ss 表。

那么,通过 ss 表,具体的如何构造出最终的 gs 表呢?无非两种情况:

  1. 首先, ss[j] 可能达到最大的极限,也就是 j +1。此时情况如这个图所示(上图中上面那个图),也就说 MS[j] 子串足够长,以至于它就是整个模式串的一个前缀。于是对于这个范围内的任何一个字符P[i], 一旦在扫描比对中发生失配,m-j-1 也必然是一个值得考虑的位移距离。
  2. 此外,都是一般的情况。也就是 MS[j] 子串的长度,充其量不过 j 。此时的情况可以由下面这幅图来示意。可以看到此时的 MS[j] 子串长度还没有达到极限。于是如果将来在扫描比对的过程中,在这个位置处(m - ss[j] - 1)发生首次适配,接下来一种值得考虑的位移距离自然也是 m-j-1。

通过以上的分析可以看到,构造 gs 表,关键就在于如何构造出 ss 表。当然,根据以上定义,即便采用蛮力策略也是可以构造出这个表的。

然而很遗憾,我们为此需要平方量级的时间。那么这个结果能否改进呢?当然是肯定的,采用新的算法,我们只需线性的时间就足以构造出 gs 表。

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

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

相关文章

RP2040 C SDK开发串口的使用

RP2040 C SDK开发串口的使用 📍环境搭建部署篇《RP2040 VSCode C/C开发环境快速部署》🔖RP2040 有硬件串口资源有2个。🌿参考RP2040 C SDK Hardware APIS:https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#grou…

安卓APK重签名并查看MD5值-2024最新版

重签名 命令行运行: apksigner sign --ks your_keystore.jks --out output.apk input.apk在这个命令中: –ks 或 --keystore 参数后面是你的keystore文件路径。 your_keystore.jks 是你的keystore文件。 –out 参数后面是输出的签名后的APK文件名。 out…

发布npm包到GitLab教程

之前在研究如何搭建UI组件库(内部使用),其中重要的一步就是发布npm包到GitLab。中间踩了很多坑,在这里记录一下整个流程方便大家快速上手。不足之处欢迎指出🙏 1. 获取Token 在gitlab中打开access tokens申请页面&am…

鲲鹏服务器之ARM探知

什么叫arm架构 ARM架构过去称作进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计…

CSS系列之详解overflow(四)

一、什么是溢出 CSS 的 overflow 属性用于控制元素内容溢出时的表现方式。当元素的内容超出其指定的尺寸范围时,就会出现溢出现象。比如,一个元素的高度设置是 80px,但内容高度不只是 80px,内容此时就叫做溢出了。 那需要注意的…

【QT学习】1-2 Liunx环境下QT5.12.9软件安装1——VMware17.0.0虚拟机安装

注意:如果电脑已经安装低版本的VMware,千万不要卸载,直接覆盖安装,更新到新的安装版本 1.点击.exe文件,右键以管理员身份运行,点击下一步,下一步 2.选择软件安装位置后,点击下一步。…

Datawhale X 李宏毅苹果书 AI夏令营(深度学习进阶)task3

批量归一化 其实归一化简单一点理解就类似于我们学过的数学中的每个数值减去平均值除以标准差。 神经网络中的批量归一化(Batch Normalization,BN)就是其中一个“把山铲平”的想法。不要小看优化这个问题,有时候就算误差表面是凸…

面试基本内容

1.类加载器 类加载器加载过程: 加载:(将字节码文件加载到运行时数据区的方法区中/元空间) 链接:(验证:检查字节码文件是否合法—>准备:静态类变量赋值为默认值,不会实例变量分配初始化—>解析:将常量池引用,转化…

Java | Leetcode Java题解之第382题链表随机节点

题目: 题解: class Solution {ListNode head;Random random;public Solution(ListNode head) {this.head head;random new Random();}public int getRandom() {int i 1, ans 0;for (ListNode node head; node ! null; node node.next) {if (rando…

14.神经网络的基本骨架 - nn.Module 的使用

神经网络的基本骨架 - nn.Module 的使用 Pytorch官网左侧:Python API(相当于package,提供了一些不同的工具) 关于神经网络的工具主要在torch.nn里 网站地址:torch.nn — PyTorch 1.8.1 documentation Containers C…

【Linux】CodeServer:云IDE部署

Code-server 是一个开源项目,它允许你在任何地方通过浏览器访问 Visual Studio Code(VS Code)编辑器。这意味着你可以在远程服务器或云端运行 VS Code,并通过浏览器进行编码、调试和开发,而不需要在本地安装 VS Code。…

EtherCAT 转 ModbusTCP 网关

设备简介 本产品是 EtherCAT 和 Modbus TCP 网关,使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站,接 TwinCAT 、 CodeSYS 、 PLC等;在 ModbusTCP 侧做为 ModbusTCP 主站( Client )或从站…

<数据集>无人机识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:9229张 标注数量(xml文件个数):9229 标注数量(txt文件个数):9229 标注类别数:1 标注类别名称:[UAV] 使用标注工具:labelImg 标注规则:对类别…

我如何解决 java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter

优质博文:IT-BLOG-CN 问题 我如何解决java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter 2024-08-25T02:31:25.46202:00 ERROR 21868 --- [fintonic-oauth] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet…

springAI框架学习总结

springAI 1.springAI基本介绍 springAI是一个AI工程应用框架,其目标是将 Spring 生态系统设计原则(例如可移植性和模块化设计)应用于 AI 领域,并推广使用 POJO 作为 AI 领域应用程序的构建块。 2.特性 灵活的AIP支持chat,text…

Matlab R2022b使用Camera Calibrator工具箱张正友标定法进行相机标定附带标定前后对比代码

打开Camera Calibrator 在这添加你拍摄的图片 根据你每个方块的实际边长填写,我是15mm。 通俗一点,要k3就选3 Coefficients,否则为0;要p1、p2就选Tangential Distortion。然后进行计算。 可以点击右侧误差高的选中图像进行移…

【计算机网络】计算机网络的分层结构

为什么要分层?为什么要制定协议? 计算机网络功能复杂→采用分层结构,将诸多功能合理地划分在不同层次→对等层之间制定协议,以实现功能。

探索Scratch编程:重温《西游记-大战蜘蛛精》

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 在编程教育的浪潮中,Scratch以其简单易用的特点,成为了孩子们学习编程的热门选择。今天,我们很高兴向大家介绍一款精彩的Scratch教学案例作品——《西游记-大战蜘蛛精》。这不仅…

【JAVA入门】Day27 - 集合体系结构综述

【JAVA入门】Day27 - 集合体系结构综述 文章目录 【JAVA入门】Day27 - 集合体系结构综述一、单列集合体系结构1.1 Collection 集合的基本方法1.2 Collection 集合的遍历方式1.2.1 迭代器遍历1.2.2 增强 for 遍历1.2.3 利用 Lambda 表达式进行遍历 1.3 List 集合的基本方法1.4 L…

pyhton __init__.py

文章目录 包和模块__init__.py概述导入包和使用模块控制导入行为 包和模块 在这样一个工程中,pkg是包(package),module1.py和module2.py是模块(module),在模块中还有定义的方法、变量等,可以统称为功能。 import可以导入包&…