数据结构(邓俊辉)学习笔记】串 16——Karp-Rabin算法:串即是数

文章目录

  • 1. 化串为数
  • 2. 凡物皆数
  • 3. 亦是数

1. 化串为数

在这里插入图片描述

接下来的这节,我们再来讨论一种十分另类的串匹配算法,也就是所谓的 Karp-Rabin 算法。回顾此前所介绍的几种串匹配算法,我们所面临的难题是一样的。也就是说在这里,我们每次比较的对象不再是单个字符,而是由一系列的字符所构成的串或者子串。因此,如果局部子串的长度为 m,那么对于所有的 n 个潜在的对齐位置,我们在最坏情况下都可能需要执行 m 次比对,因此在 最坏情况下,我们往往必须付出如此之高的代价。

那么,能否从中自然地剔除掉这个因子 m 呢?我们马上就会看到一种别致的方法,也就是将每一个串视作为一个数。正确切地讲,应该是整数。不难理解,果真若能实现这种转换,那么任何两个串之间的比较,都相当于整数之间的比较,从而我们只需花费常数的时间,也就是说与字符串的长度无关。那么这些美好的设想能够实现吗?答案是能够。

实际上,不少前贤先哲都已经指出,包括串在内的万事万物,其实本质上讲都是数,或者确切地讲是整数。没错,整数。它们才是自然的本源。

2. 凡物皆数

在这里插入图片描述

是的,凡物皆数。关于自然的本源,这是很多人所秉持的一种信念,在我看来,其中最坚定的信奉者,同时也是最高明的实践者,莫过于哥德尔。比如,为了证明伟大的不完备定理,他发明了一种简洁而强大的编号方式,来对逻辑系统中几乎所有的组成部分统一以自然数来做标识,这种编号是基于素数序列来完成的。

我们知道,素数虽然是无限的,但同时也是可数的。因此,我们可以用 p(k) 来指代第 k 个素数,比如前几个都众所周知,首先是2,第二个是3,第三个是5,第四个为7以及第五个是11,诸如此类。

那么哥德尔敏锐地发现,任何一个有限维度的自然数向量,按照某种法则都会唯一的对应于某个自然数

比如,我们考察这样一个有整数构成的 8 维向量,它的各个分量依次为3 1 4 1 5 9 2 6。我们现在来找出它所对应的那个自然数。既然是 8 维,所以我们首先要搬出前 8 个素数,也就是 2 3 5 7 11 13 17 19,这 8 个素数将分别与向量的 8 个分量一 一配对。
~  
第 1 个分量为3,所以我们相应地将它转换为第一个素数,2 的 3+1 也就是4次方;第 2 个分量为 1,所以我们也将它转化为第二个素数 3的 1+1,也就是2次方;第 3 个分量是4,所以我们也将它转化为第三个素数 5 的 4 + 1,也就是5次方;以下依次类推。我可以得到第 4 个素数的 1+1 次方,第 5 个素数的 5+1 次方,第 6 个素数的9+1次方,第 7 个素数的 2+1 次方,以及最后第 8 个素数的 6+1 次方。

显然,这 8 个因子的乘积依然应该是一个自然数。也就是说,如此我们的确可以将任何一个向量转化为一个自然数。而这种转换方法还具有一个更为精妙、更为神奇的特征,根据如此得出的一个自然数,我们还可以反过来忠实地还原此前的向量

我想,点破了这层窗户纸之后,你应该能够独立地看出这种还原的方法,对吧?

3. 亦是数

在这里插入图片描述

既然万事万物的本源都对应于自然数,那么串也自然应该对应于数。接下来我们就来看看这句话如何兑现。

首先来考虑一种我们最为熟悉的串,也就是由十进制数字所构成的串。比如,由阿拉伯数字所构成的这样一个串。如果我要说这个串是一个自然数,我想你不会有任何异议的,没错,这就是我们最常用的技术方法,那么一般的串呢?

应该还记得我们的约定,组成字符串的每一个字符都来自于事先约定的某个字母表,而在这里,字母表的规模又是至关重要的。如果将它记作 d,那么字母表中的所有字符也就可以按照任何一种次序,与0到 d -1 之间的整数一 一对应了。于是,基于这个字母表所建立起来的任何一个字符串都可以视作为一个 d 进制的自然数。

不妨考察,以26个大写英文字母所构成的字符集,于是,由大写字母所构成的任何一个英文单词也必然对应于某个 26 进制的自然数。
~  
比如在单词 cat 中,c 对应的编号为2,a 对应于0,而 t 对应于19。如果你关心这个数字的具体数值,不妨借用一下我们在第4章所给出的进制转换算法。

不过这个方法还存在一点小小的瑕疵,好在修补这个瑕疵并不困难,这个任务不妨由你独立地来完成(上图已经给出方法)。

既然每一个串都可以对应于一个自然数,那么接下来很自然的一个模式串在某个主串中能够出现,仅当这个子串在数值上与模式串相当。

请注意,经过这样的视角转换,我们已经在无形中将串与串的比对,转化为了整数与整数的比对, 也就是说,串与串之间的比对将有望在常数的时间内完成。

果真如此,以上也就自然给出了一个串匹配的算法。的确如此,我们已经朝着这个方向迈出了最重要的一步,尽管我们还需要做更多细致的工作。

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

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

相关文章

Windows 10/11降级漏洞的工具包现已发布 仅供安全测试

早前有研究人员在分析 Windows 10/11 更新机制时发现微软虽然已经考虑到潜在的安全问题增加了各种限制,但还是存在失误因此存在弱点,研究人员则通过该弱点成功降级了系统。通过该漏洞不仅可以成功降级系统,同时系统还会认为自己已经完成更新并…

Java面试题·区别题·JavaSE部分

系列文章目录 总章 Java区别题 文章目录 系列文章目录前言private/默认/protected/public权限修饰符的区别&和&&区别和联系,I和II区别和联系if和switch的不同之处和equals的区别和联系数组做形参和可变参数做形参联系和区别接口和抽象类的异同之处面向…

嵌入式day36

数据库 专业存储数据、大量数据 数组、链表、变量---->内存:程序运行结束、掉电数据丢失 文件---->硬盘:程序运行结束、掉电数据不丢失 数据库---->硬盘 数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查…

Linux入门攻坚——30、sudo、vsftpd

su:Switch User,即切换用户 su [-l user] -c ‘COMMAND’ 如:su -l root -c ‘COMMAND’ 如果没有指定-l user,则默认是root sudo:可以让某个用户不需要拥有管理员的密码,而可以执行管理员的权限。 需…

基于RS232的VGA显示

前言 基于ROM的VGA显示缺点:需要将图片转化为mif文件,使用的RAM是FPGA内部RAM模拟出来的,占用资源大切换显示图片需要重新转化,对ROM进行写入,使用极不方便,因此这里采用RS232进行VGA显示。 正文 一、基于…

代码随想录Day 28|题目:122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一:122.买卖股票的最佳时机 II贪心算法:动态规划 题目二:55.跳跃游戏解题思路: 题目三: 45.跳跃游戏 II解题思路方法一方法二 题…

鸿蒙开发入门day15-焦点事件

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 焦点事件 基础概念与规范 基础概念 走焦规范 走焦算法 获焦/失…

【逐行注释】MATLAB下的UKF(无迹卡尔曼滤波),带丰富的中文注释,可直接复制到MATLAB上运行,无需下载

文章目录 程序组成部分完整代码运行结果主要模块解读:运动模型绘图部分误差统计特性输出程序组成部分 由模型初始化、运动模型、UKF主体部分、绘图代码和输出部分组成: 完整代码 将下列代码复制粘贴到MATLAB里面,即可运行: % 三维状态量的UKF例程 % 作者联系方式:微信…

安全面试常见问题任意文件下载

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 1.1 任意文件下…

培训第三十九天(了解docker-compose,docker-compose编排容器,配置harbor服务)

一、回顾 1、拉取私有仓库镜像 # 配置dockerdocker pull 10.0.0.10:5000/centosnginx:v0 2、容器网络类型 brideg(net) default# docker启动之后会生成新的虚拟网卡,网卡的名称docker0# 网段默认是172.17.0.1# 所有的容器都桥接docker0,通过桥接共享网…

LRN正则化是什么?

LRN正则化,全称为Local Response Normalization(局部响应归一化),是一种在深度学习,特别是在卷积神经网络(CNN)中常用的正则化技术。该技术旨在通过模拟生物视觉系统中的侧抑制现象,…

OpenLayers3, 设置地图背景

文章目录 一、前言二、代码实现三、总结 一、前言 本文基于OpenLayers3&#xff0c;实现地图加入背景图的功能。 二、代码实现 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head><meta http-equiv"Content-Type"…

QT学习ubuntu qt + desktop

环境搭建 ubuntu 安装QT 遇到kit 选择不了 通过sudo apt-get install qt5-default去安装SDK的时候报错&#xff1a; Package qt5-default is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is …

Linux——nginx 负载均衡

常规的web服务器一般提供对于静态资源的访问&#xff0c;比如说&#xff1a;图片、web样式 网站提供的大部分交互功能都需要web编程语言的支持&#xff0c;而web服务对于程序的调用&#xff0c;不管编译型语言还是解释型语言&#xff0c;web服务同将对于应用程序的调用递交给通…

在蓝桥云课ROS中快速搭建Arduino开发环境

普通方式 一步步慢悠悠的搭建和讲解需要5-6分钟&#xff1a; 如何在蓝桥云课ROS中搭建Arduino开发环境 视频时间&#xff1a;6分40秒 高效方式 如何高效率在蓝桥云课ROS中搭建Arduino开发环境 视频时间&#xff1a;1分45秒 配置和上传程序到开发板 上传程序又称为下载程序h…

html+css+js网页设计 婚庆网站8个页面

htmlcssjs网页设计 婚庆网站8个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff…

C#骑砍逻辑类Mod制作详细解说

前言&#xff1a; 最近在研究骑砍的mod&#xff0c;主要是想修改其中的逻辑部分&#xff0c;因此有了这篇帖子。 一&#xff0c;文件夹与XML配置 在Modules创建一个新文件夹&#xff0c;文件夹名称随意&#xff0c;不影响实际的读取。 文件夹下面的位置需要固定&#xff0c;因…

闲置物品|基于SprinBoot+vue的校园闲置物品交易平台(源码+数据库+文档)

校园闲置物品交易平台 目录 基于SprinBootvue的校园闲置物品交易平台 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2管理员模块实现 5.3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

项目:基于TCP的文件传输系统

项目介绍: 模拟FTP原理&#xff1a;客户端连接服务器后&#xff0c;向服务器发送一个文件。文件名可以通过参数指定&#xff0c;服务器端接收客户端传来的文件&#xff08;文件名随意&#xff09;&#xff0c;如果文件不存在自动创建文件&#xff0c;如果文件存在&#xff0c;…

matlab 相位解缠

目录 一、功能概述1、相位解缠2、主要函数二、代码实现1、螺旋线的正确相位角2、使用不同阈值平移相位角3、将相移应用于矩阵三、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、功能概述 1、相位解缠 对…