(a)ADT

官官方信息技术老师·16 页·深入(追求细节与边界)·0 次浏览·38 天前
数据结构ADT串

串(String)

看完你能准确说出串的术语体系,并用 ADT 三要素完整描述它

按 空格/→ 演示下一步

问一句
1 / 16 页

全部页面点击任意一页,跳回舞台从这页播放

数据结构ADT串

串(String)

看完你能准确说出串的术语体系,并用 ADT 三要素完整描述它

1第 1 页 · 串(String)

串的定义

前一页我们认识了串:一串排成队的字符。那它在数据结构里到底是什么身份?答案有点意外——它就是线性表,只是每个位置上坐的必须是字符,而且队伍可以为空。

内容受限
线性表元素任意,串的元素只能是字符
仍是一对一
逻辑结构不变:除首尾外每个字符有唯一前驱后继
空串合法
n 可为零,长度为 0 的串记作 "",不是空格串
货车专列对应 →串

普通列车车厢可装万物对应线性表,货车专列只运煤对应串只存字符

2第 2 页 · 串的定义

串 vs 其他线性表

串也是线性表,但操作对象从单个元素变成了整个串——这是初学者最常混淆的点。

普通线性表
  • 操作对象:单个元素
  • 查找按值或按位,元素独立
  • 插入删除以元素为单位
串
  • 操作对象:整个串或子串
  • 查找是子串定位(模式匹配)
  • 插入删除以子串为单位
正确的理解是:串是受限的线性表,元素强制为字符,操作粒度整体化为子串,所以定位算法(KMP)成为核心问题。
3第 3 页 · 串 vs 其他线性表

空串与空白串

上一页说串是字符组成的线性表,那最简单的串长什么样?想象你写了一条消息却一个字都没打,发送出去——对方收到的是空串,还是空白串?两者看似一样,其实完全不同。

空串
长度为 0,一个字符都没有,记作 ∅ 或 ""
空白串
只含空格等空白字符,长度等于空格个数,如 " " 长度为 3
为何要区分
两者都不含有效内容,但长度不同,算法判断时极易出错
空信封对应 →空白串

空串是空信封,空白串是信封里装了几张白纸

4第 4 页 · 空串与空白串

自测:定义辨析

点击作答

下列关于串的说法,正确的是?

5第 5 页 · 自测:定义辨析

子串与主串

上一页我们认识了空串这个特殊成员。现在看更一般的情况:从一本书里截取一段话,这段话和整本书是什么关系?串的世界里,这就是子串与主串。

子串
串中任意连续字符组成的新串,含空串与串自身
主串
包含该子串的串,是相对概念
位置约定
子串在主串中的位置 = 其首个字符在主串中的位序
书里截取一段话对应 →子串与主串

截出的那段话对应子串,整本书对应主串

6第 6 页 · 子串与主串

字符与子串的位置

上一页我们认识了子串与主串。那子串在主串里“待在第几位”?生活中找人先问门牌号,串里定位也要靠序号——但同一个字符,位置未必只有一个。

位置的定义
子串第一个字符在主串中的序号,即首字符位置
位置可不同
同一字符在主串中多次出现时,各处位置不同
起始约定
常见约定从 1 开始计数,也有实现从 0 开始
门牌号对应 →字符位置

门的入口门牌对应子串首字符的序号

7第 7 页 · 字符与子串的位置

串相等与空串是子串

「相等」看整体,「子串」看局部——两套规则容易搅在一起。

串相等
  • 两串长度必须相等
  • 对应位置字符逐一相同
  • 看的是整体,一个字符都不能差
空串是子串
  • 长度允许远小于主串
  • 字符无需对应比较
  • 看的是局部,包含即成立
正确的理解是:相等是「完全一致」的强条件,子串只要求「被包含」,所以空串是任何串的子串,却不与任何非空串相等。
8第 8 页 · 串相等与空串是子串

术语关系一图看全

以主串 DATASTRUCT 为例,沿箭头看:主串如何截取出子串,子串的两个位置量分别是什么。

图解渲染中…
d1:按字符计位:S在第5个位置,即子串在主串中的起始位e1:子串自身含4个字符,与它在主串中的位置是两个独立概念
9第 9 页 · 术语关系一图看全

自测:术语应用

点击作答

已知主串 S="abcdef",子串 T="cd",T 在 S 中的位置是?

10第 10 页 · 自测:术语应用

ADT 是什么

前面我们定义了串、空串、子串这些术语,但你有没有想过:说清一个数据结构,到底要说清哪几件事?数学家常问的是「它是什么」和「它能干什么」,这正是 ADT 的出发点。

数据对象
定义元素集合及性质,如串的对象是字符组成的有限序列
数据关系
元素间的结构约束,如串中字符呈线性排列、有序
基本操作
只声明功能不写实现,如 StrAssign、StrCompare、Concat
家电遥控器对应 →ADT 操作声明

遥控器上只有按键说明对应操作只管「能做什么」,不关心内部电路即实现

11第 11 页 · ADT 是什么

串的 ADT:数据对象与关系

上页说了 ADT 是「数据对象+关系+操作」的三件套。那把模板套到串上:串里装的是什么?它们之间按什么规则排队?先把前两件填上,操作留到下页。

数据对象
D = 所有字符集 Σ 上的有限字符序列,元素同属一个字符集
数据关系
R = {<aᵢ, aᵢ₊₁>},相邻字符的线性序,与线性表同构
与线性表差异
元素限定为字符,且操作以「串的整体」为对象,而非单个元素
操作留白
ADT 定义含操作集:串赋值、求长、比较、连接、求子串等,下页展开
火车编组对应 →串的 ADT

车厢对应字符,挂接顺序对应线性序,整列车对应操作对象

12第 12 页 · 串的 ADT:数据对象与关系

串的基本操作

串的 ADT 操作逐个过一遍,按“不改动→产生新串”的脉络看。

1
赋值与复制
StrAssign 置新值,StrCopy 复制已有串,是使用串的前提。
2
判空与求长
StrEmpty 判断是否为空串,StrLength 返回字符个数。
3
清空与销毁
ClearString 置为空串,DestroyString 释放存储;后者常被忽略。
4
连接与求子串
Concat 拼接两串产生新串,SubString 取主串一段,均不改原串。
5
定位
Index 返回子串在主串中首次出现的位置,不存在返回 0。
13第 13 页 · 串的基本操作

ADT 三要素结构图

从根节点 ADT 出发,两分钟看清三要素各自装什么、串里对应什么。

图解渲染中…
数据对象:本页聚焦 ADT 通用骨架,不展开定义细节数据关系:元素间逻辑约束,即对象内部的规则基本操作:在对象与关系之上定义的动作集
14第 14 页 · ADT 三要素结构图

本组图解收束

  • ✓串=受限线性表,元素只能是字符
  • ✓空串与空白串是两个概念,别混
  • ✓空串是任何串的子串,位置约定是边界
  • ✓ADT 三要素:对象、关系、操作
延伸主题:串的存储表示:定长、堆分配、块链串的模式匹配:BF 与 KMP从 ADT 看其他线性结构
15第 15 页 · 本组图解收束

课后思考

三个问题,先自己想,再对照参考答案。

1回顾:串的 ADT 三要素里,为什么数据关系只写“前后序”,却不限定字符内容?

参考答案ADT 只刻画逻辑结构,不管存储与取值细节。字符内容属于数据对象的取值范围,关系层面串就是受限的线性序列,这正是 ADT 抽象性的体现。

2应用:用 ADT 的思路审视你最近写的代码,哪个操作接口其实设计得“名实不符”?

参考答案对比接口名、参数与实际行为是否一致,比如叫 get 却修改了内部状态。ADT 要求操作语义明确可预期,名实不符的接口正是抽象泄漏的信号。

3边界:如果把“求子串位置”换成“求任意元素位置”,ADT 定义还成立吗?会失去什么?

参考答案定义仍成立,操作照样由数据对象和关系推出,但会丢失“字符序”这一约束带来的特性,如连续性、匹配算法的适用前提。抽象换来通用,也丢掉了特化优势。

16第 16 页 · 课后思考