数据结构(邓俊辉)学习笔记】串 01——ADT

news2024/9/20 20:27:19

1. 定义 + 特点

我们讨论的主题是串,无论从抽象数据类型,还是从具体实现的角度来看,串,相当于此前所介绍的数据结构来说都更为简单。因此,会将更多的时间用于讨论串的相关算法,尤其是串匹配的算法。

在接下来的最后两章中,我们将会更多地讨论,不同的数据结构在算法中的应用。在接下来的第一节,就让我们从 ADT 的角度来看看串作为一类数据结构应该提供哪些功能接口。
在这里插入图片描述
简而言之,所谓的字符串,也就是由来自于某个字符表中的一系列字符所构成了一个长度有限的序列。 比如这就是由8个英文字母所构成的一个字符串(Tsinghua)。一般地,串中的每个成员都称作一个字符,而字符串就是由若干的字符由前至后所构成的一个线性序列。

当然这里并不要求所有的字符都互异,也就是说有可能会存在雷同的字符,但无论如何,它们的确都是按照一个线性的次序依次排列的。线性次序,我想你很快就会想到。利用此前所学过的线性序列来直接实现串,例如向量或者列表。

是的,的确如此,因此从数据结构的角度来看,串的实现对于我们来说已不再是一件难事。然而,我们之所以还需要花费一章的时间来对它进行讨论,是因为相对于一般的线性序列而言,串结构更具有鲜明的特征。

其中最为突出的一个特点是,组成字符串的字符种类并不见得很多,但参与构成串的字符总数,也就是所谓的串长,却往往相对而言要高出很多个数量级。

以英文文章为例,一篇典型的英文文章,篇幅大致在数千个字符左右,而所有这些字符无非都是大写或小写的英文字母,再加上空格以及为数不多的标点符号。
  ~  
我们所编写的每一段程序,比如典型的 c 或 C++程序,也可以认为是一个字符串,尽管这类串的篇幅通常也可长达数千乃至数万的字符,那组成它们的无非是95个可打印字符以及回车换行符。
  ~  
如果将氨基酸视作字符,那么蛋白质也可以视作为字符串。

事实上,尽管这类字符串的长度很长,但组成它的字符却只有为数不多的可能。

类似地,如果将碱基对视作字符,那么 DNA 或 RNA 也可视作为字符串。

再一次的,尽管这类字符串的长度可能很长,但是正如众所周知的,组成这种字符串的字符种类却屈指可数。

  ~  
实际上,计算机中所存储的任何序列从本质上讲都可视作为是二进制序列,也就是说组成他们的字符非0即1。

是的,所有这些例子都告诉我们,这里所讨论的串,其长度的确都要远远大于字母表的长度。

2. 术语

为了便于接下来的讨论,我们首先来统一关于串的一些术语和记法。
在这里插入图片描述
一般地,如果一个名为 S 的字符串,由 n 个字符构成,将所有的字符从前至后编号为 0 至 n-1,并按照我们的惯例,记作 S[0,n)。而串中秩为 k 的字符,也相应地记作 S[k]。

于是我们就可以定义,什么叫做两个字符串相等,有两个条件:

  1. 首先是它们的长度相等。
  2. 其次,所有的字符也必须逐对地相等,也就是说二者必须一模一样。

接下来一个重要概念是子串 sub-string。对于任何一个字符串 S 而言,由 i 和 k 所指定的那个子串,也就是从秩为 i 的那个字符开始,连续的 k 个字符。

以上图为例,如果整体为字符串 S,那么这里所指的子串,也就是其中的这样一段[i,i+k),可以看到,其中字符的秩介于 i 与 i + k 之间。

接下来,所谓的前缀 perfix 是子串的一个特例。具体来说,所谓长度为 k 的前缀,也就是起始于首字符的前 k 个字符。

对称地,我们也可定义所谓的后缀 surffix。具体地,所谓长度为 k 的后缀,也就是终止于末元素的最靠后的 k 个字符。

不能验证,所谓起始于 i 长度为 k 的子串,也就是在长度为 i + k 的前缀中,长度为 k 的后缀。当然,这些定义中所涉及的所有参数都是合法的,为了节省时间,我们将不再每次都专门地对此作说明。

当然,有一种边界情况在此需要专门说明,也就是说,串长 n 有可能是0,此时我们也称之为空串。

请注意,空串与由空格组成的串并不是一回事。空转有别于其他各种串的特征,就是它的长度为0。

为了简化后续的讨论,不妨再次统一约定,空串是任何串的子串,也是任何串的前缀与后缀。同时,作为另外一种边界的情况,我们也统一约定,任何串也是它自身的子串,以及前缀和后缀。反过来,长度严格小于原串的子串、前缀与后缀也称作真子串、真前缀与真后缀。

3. ADT

从抽象数据类型的角度,串应该提供哪些功能接口呢?
在这里插入图片描述

  1. 首先,应该能够随时获取它的长度,也就是当前串中所包含的字符总数。
  2. 另外,对于任意给定的秩,也需要能够直接返回对应的那个字符。也就是说,只要 i 小于串长 n,那么就应该返回其中秩为 i 的那个字符。
  3. 以下 sub-string、prefix 和 surffix 这三个接口的功能、语义与我们刚才的定义完全吻合。也就是分别取出串中对应的子串、前缀以及后缀。
  4. 此外,还需要有一个串接的功能。也就是将某个指定的串 T 作为后缀,与当前的字符串 S 连接起来。
  5. 再接下来是判等接口,它的功能正对应于我们刚才所介绍的相等。对于任意指定的字符串T,这个接口可以判断 T 是否与当前的字符串 S 彼此相等。

作为判等接口的一般化推广,索引接口 indexOf 具有更强的功能。具体来说,对于任意指定的一个长度为 m 的字符串P,这个接口可以告诉我们,在当前的字符串 S 中是否存在某个子串与 P 完全相等。实际上,本章接下来的绝大部分篇幅,都将用于讨论如何高效地实现这个接口。

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

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

相关文章

探寻孩子不会说话与自闭症的关联及成因

在孩子的成长过程中,语言的发展是一个至关重要的阶段。然而,有些孩子却迟迟不会说话,这让家长们忧心忡忡。而当孩子不会说话的同时还伴有一些异常行为时,自闭症的担忧便会涌上心头。那么,孩子不会说话且患有自闭症究竟…

最近再写一个仿微信的项目遇到的一些bug(一)

目录: bug (一)Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty报错解决方法 bug (二)Cannot invoke “javax.script.ScriptEngine.eval(String)“ because “engine“ is null报错原…

likeshop采集商品图片无法保存解决方案

封面图 一个修复单,客户的likeshop采集tb商品后,保存到商品库的时候 主图无法显示 报错: "/www/wwwroot/test.0ev.cn/server/public/uploads/l7pu2aqt/admin/images/d61d40dab9e6245f90b62ede72b51639.jpg" string(6226) "…

除毛大作战,选择你的清理工具——希喂、美的宠物空气净化器PK

随着气温的升高,又到了宠物的换毛季。猫咪在家里疯狂掉毛,而铲屎官也陷入清理难题。幸好,有宠物空气净化器可以帮助铲屎官减轻打扫负担。那么宠物空气净化器又该如何挑选呢?哪款宠物空气净化器效果更佳?我也很想知道答…

【JVM】剖析字符串与数组的底层实现(一)

剖析字符串与数组的底层实现 字符数组的存储方式 JVM有三种模型: 1.Oop模型:Java对象对应的C对象2.Klass模型:Java类在JVM对应的C对象3.handle模型 字符串常量池 即String Pool,但是JVM中对应的类是StringTable,底层实现是一个hashtable,如代码所示 …

老师怎样分班更便捷?

随着新学期的钟声敲响,老师们又迎来了一年中最繁忙的时刻。开学之初,除了要处理日常的教学事务,老师们还肩负着一项重要任务——给新生进行分班。 其实老师们完全可以不必那么劳累。在这个科技日新月异的时代,有许多工具可以帮助老…

计算机毕业设计选题推荐-高中素质评价档案系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

SOMEIP_ETS_061: Sending_two_SOMEIP_Messages_in_a_row

测试目的: 验证设备(DUT)能够处理在单个UDP数据包中发送的多个SOME/IP消息,并对所有这些SOME/IP消息给出正确的响应。 描述 本测试用例旨在检查DUT在接收到一个包含多个SOME/IP消息的UDP数据包时,是否能够对所有包含…

如何使用MQTT订阅摄像机/NVR/DVR的AI报警

H5S内置MQTT服务,并把设备报警默认推送到MQTT服务器上,进入 设置-》协议-》MQTT配置MQTT服务参数,配置后需要重启生效。 MQTT开启后,就可以使用第三方MQTT客户端订阅事件,以下以MQTTX( https://mqttx.app/ )为例。 链…

深入解析css-学习小结

绪论 盒模型 层叠 优先级 继承 层叠 层叠指规则冲突时,如何选择规则。规则冲突解决顺序: 样式表来源 用户代理样式 用户代理样式:浏览器默认样式 作者样式表:你自己写的css样式 作者样式表会覆盖用户代理样式,因…

宅家必备神器!远程控制软件,让你随时随地掌控一切

在数字化时代,远程控制软件已经成为我们日常生活和工作中不可或缺的工具。今天,我将分享五款我使用过的远程控制软件的使用感受,希望大家能够选择到一款适合自己的远控工具: 一、向日葵远程控制 直通车(粘贴到浏览器…

基于xr-frame实现微信小程序的图片扫描识别AR功能(含源码)

前言 xr-frame是一套小程序官方提供的XR/3D应用解决方案,基于混合方案实现,性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。xr-frame在基础库v2.32.0开始基本稳定,发布为正式版,但仍有一些功能还在开发&#…

NWM口罩佩戴检测算法,浅析口罩佩戴检测从源码到实际应用的全面指南

一、背景 随着新冠疫情的全球蔓延,佩戴口罩成为了预防病毒传播的重要措施。然而,随着疫情的持续,社会上仍存在不少未佩戴口罩的行为,这给公共健康带来了巨大的风险。在这样的背景下,基于计算机视觉的口罩检测算法应运…

ML307R_APP_DEMO_SDK TCP/UDP使用介绍

ML307R_APP_DEMO_SDK是在ML307R_OpenCPU_Standard_SDK标准代码基础上,新增了面向用户APP层的demo示例,与标准代码中examples的示例代码不同,app_demo实现了联网自动化,数据透传,各功能可独立自动运行,并对用…

【TB作品】TM1637芯片数码管,PIC16单片机驱动显示,Proteus仿真

文章目录 效果模块芯片介绍code 效果 只能是共阳数码管: 模块 芯片介绍 TM1637芯片是一种常用于LED数码管显示控制的驱动芯片,下面是各引脚的详细说明: DIO (Data Input/Output) - 管脚号: 17 功能: 串行数据输入/输出,DIO引脚…

JVM经典的垃圾收集器

经典垃圾收集器 目录 Serial收集器ParNew收集器Parallel Scavenge收集器 Serial Old收集器Parallel Old收集器CMS 收集器Garbage First收集器 以上是经典收集器的关系图 Serial收集器 Serial收集器是一个单线程工作的收集器,但它的“单线程”的意义并不仅仅是说…

『功能项目』禁止射线穿透行为【06】

我们打开上一篇04禁止射线穿透行为项目, 本章要做的事情是在Unity编辑器中添加 新输入系统 实现主角在场景中鼠标右键可以使主角 转向。 本次项目需要让Unity引擎重新启动所以先保存当前项目 再次打开项目后, 修改为Both 点击Apply前注意要先保存项目&a…

数据结构——树的三种表示方法

目录 引言 树 1.树的定义 2.树的基本概念 3.树的表示方式 (1)双亲表示法 (2)孩子表示法 (3)左孩子右兄弟表示法 (4)树的应用 结束语 引言 在学习完栈和队列的之后后,我们接下来学习新的数据结构——树。 树 1.树的定义 树是一种非线性数据结构&#x…

JavaScript 数据结构 ==== 二叉树

目录 二叉树 结构 二叉树和二叉搜索树介绍 1.创建树 2.插入一个键 3.树的遍历 中序排序 先序遍历 后序遍历 4.搜索树中的值 5.删除节点 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtre…

Docker Desktop镜像路径修改一直报错

一 点击Apply & Restart报错 [Window Title] Docker Desktop[Main Instruction] Error migrating WSL disk[Content] An error occurred while migrating the Docker Desktop WSL data disk to its new location:moving disk file: rename C:\Users\Lenovo\AppData\Local\D…