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

news2024/11/15 11:41:29

文章目录

  • 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.coloradmin.cn/o/2086355.html

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

相关文章

ES配合高德地图JS-API实现地理位置查询

目录 实现功能点 技术选型 具体实现 Vue3整合高德地图JS API-2.0 添加商户:前端 添加商户:后端/ES 查询用户当前地理坐标 获取附近(指定距离)的商户 总结/测试Demo代码地址 测试概述:用户使用高德地图组件获取商户…

GPT实现的adb shell命令实现某音自动点赞和关注

摘要:这个可能是没啥用的自动点赞和关注功能,自娱自乐为主哈 具体可行性步骤如下: 1.打开手机的开发者选项,将指针位置的设置开关打开,目的是看触屏时的坐标值 2.随便打开一个抖音,找到点赞的爱心图标的坐标轴,并记下来,待会有用 备注:尽量获取爱心尖端的坐标值,由…

erlang学习:用OTP构建系统2,警报管理

今日学习用OTP构建系统的警报管理, 首先进行配置错误记录器 [{sasl,[{sasl_error_logger, false},{error_logger_mf_dir, "/code/erlang/erlangstudy"},{error_logger_mf_maxbytes, 10485760},{error_logger_mf_maxfiles, 10}]} ].警报处理器gen_event的…

【Material-UI】Slider 组件中的 Discrete Sliders 详解

文章目录 一、Slider 组件概述1. 组件介绍2. Discrete Sliders 的特点 二、Discrete Sliders 的基本用法1. step 属性2. marks 属性3. valueLabelDisplay 属性 三、深入理解 Discrete Sliders 的配置1. 自定义刻度标记2. 限制可选值3. 设置较小的步长4. 始终显示值标签 四、应用…

Win10+GTX1050Ti安装Pytorch

目的 本文主要记录自己安装pytorch过程。 环境:win10 pycharm 显卡:GTX1050Ti 过程记录 1、确认pytorch版本 打开pytorch官网:https://pytorch.org/ 选择stable 2.3.0 版本,CUDA有11.8及12.1,我们看看GTX1050Ti支持…

发红包案例(java)

User类创建 public class User {private String name;private int money;public User(){}public User(String name,int money){this.namename;this.moneymoney;}public void show(){System.out.println("Name:"name" Money:"money);}public String getNam…

ruoyi-vue-pro(v3)

启动上的问题 这里第二部npm install会有问题 切换成http 解决SSL 证书问题导致的连接错误 npm config set registry http://registry.npm.taobao.org/

Zookeeper 官方示例2-SyncPrimitive 代码解读(二)

测试命令 java jar .\ZookeeperDemo-0.0.1-SNAPSHOT.jar bTest 192.168.206.100:2181 2 1. Barrier(阻塞原语) 1.1 概念 [!quote] A barrier is a primitive that enables a group of processes to synchronize the beginning and the end of a comput…

猫头虎 分享:Python库 NumPy 的简介、安装、用法详解入门教程

猫头虎 分享:Python库 NumPy 的简介、安装、用法详解入门教程 🐱🐯 摘要 在Python编程领域,特别是人工智能和数据科学方向,NumPy库的重要性不言而喻。 作为一个强大且广泛使用的库,NumPy为我们提供了处理…

WLAN原理实验简述——AP上线

一、需求: AP通过AC上线。 AC通过控制VLAN管理AP,创建VLAN100和放行。 AP同AC建立CAPWAP关系。 二、实验拓扑图: 三、实验步骤: LSW1: sys Enter system view, return user view with CtrlZ. [Huawei]Sysname lsw1 [lsw1]undo info enable I…

vue-ueditor-wrap设置autoHeightEnabled:true无效问题

问题描述 今天小伙伴遇到一个问题,使用vue-ueditor-wrap富文本编辑器,发现设置autoHeightEnabled为true后,对于某些文章,编辑器的高度依然没有按照实际的文章内容高度进行变化: 问题排查 通过调试代码发现是文章html…

C语言实现经典排序算法

1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记…

SAP BW/BPC:实现自动执行BPC跑包程序

作者 idan lian 如需转载备注出处 如果对你有帮助,请点赞收藏~~~ 用途:创建程序,跑BPC包,把数据从BW应用层跑到BPC,程序可放到处理链或自动作业中,实现定时跑包。 1.步骤 首先需要BPC顾问创建一个他们手动执行的包…

数据挖掘之分类算法

分类算法是数据挖掘中常用的一类算法,其主要任务是根据已知的训练数据(即带有标签的数据)构建模型,然后利用该模型对新的数据进行分类。分类算法广泛应用于金融、医疗、市场营销等领域,用于预测、决策支持等任务。以下…

并查集【算法 12】

并查集 (Union-Find) 的基础概念与实现 并查集(Union-Find)是一种用于处理不相交集合(disjoint sets)的数据结构,常用于解决连通性问题。典型的应用场景包括动态连通性问题(如网络节点连通性检测&#xff0…

数据库sqlite3

数据库 数组、链表、变量 ----->内存:程序运行结束,掉电数据丢失 文件 ----------------------->硬盘:程序运行结束,掉电数据不丢失 数据库:专业存储数据、大量数据 ----->硬盘 常用数据库: …

linux 如何查看cpu核心数量

在Linux系统中,有多种方法可以查看CPU的核心数量。 一、lscpu lscpu命令是最直接的方法之一,它可以显示CPU架构信息,包括CPU数量、每个CPU的核心数、每个核心的线程数等。要查看CPU核心数量,可以直接查看lscpu命令输出的Core(s) …

力扣面试150 删除排序链表中的重复元素 II 哑兵 双指针

Problem: 82. 删除排序链表中的重复元素 II 👨‍🏫 灵神题解 Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* List…

企业车辆|基于SprinBoot+vue的企业车辆管理系统(源码+数据库+文档)

企业车辆管理系统 基于SprinBootvue的企业车辆管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 驾驶员模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主…

悬浮翻译软件有哪些?试试这些利器

在观看外国电影或电视剧的奇幻旅程中,面对字幕如流星般划过屏幕,是否渴望能即时捕捉每一个细微的情感涟漪与幽默火花,让体验更加完整无憾? 此刻,无需再为语言障碍而烦恼!悬浮翻译器电脑版作为你贴心的跨文…