当前课程知识点:数据结构(下) > 第十一章 串(上) > (a)ADT > 11a-1: 定义+特点
同学们好 从今天开始我们进入到这门课程的第11章
我们讨论的主题是串
正如我们马上就要看到的
无论从抽象数据类型 还是从具体实现的角度来看
串 相对于此前所介绍的数据结构来说 都更为简单
因此 我们可以将更多的时间用于讨论串的相关算法
尤其是串匹配的算法
是的 算法
在接下来的最后两章中
我们将会更多地讨论 不同的数据结构在算法中的运用
在接下来的第一节 就让我们从ADT的角度 来看看串作为一类数据结构 应该提供哪些功能接口
简而言之 所谓的字符串 也就是由来自于某个字符表中的一系列字符 所构成的一个长度有限的序列
比如 这就是由8个英文字母所构成的一个字符串
一般地 串中的每个成员都称作一个字符
而字符串 就是由若干个字符由前至后所构成的一个线性序列
当然 这里并不要求所有的字符都互异
也就是说 有可能会存在雷同的字符
但无论如何 它们的确都是按照一个线性的次序 依次排列的
线性次序
我想 你很快就会想到利用此前所学过的线性序列 来直接实现串
例如 向量 或者列表
是的 的确如此
因此 从数据结构的角度来看
串的实现 对于我们来说 已不再是一件难事
然而 我们之所以还需要花费一章的时间来对它进行讨论
是因为相对于一般的线性序列而言 串结构更具有鲜明的特征
其中最为突出的一个特点是 组成字符串的字符 种类并不见得很多
但参与构成串的字符总数 也就是所谓的串长
却往往相对而言 要高出很多个数量级
以英文文章为例
一篇典型的英文文章 篇幅大致在数千个字符左右
而所有这些字符 无非都是大写 或小写的英文字母
再加上空格 以及为数不多的标点符号
我们所编写的每一段程序 比如典型的C或C++程序
也可以认为是一个字符串
尽管这类串的篇幅 通常也可长达数千乃至数万个字符
但组成它们的 无非是那95个可打印字符 以及回车、换行符
如果将氨基酸视作字符 那么蛋白质也可以视作为字符串
事实上 尽管这类字符串的长度很长
但组成它的字符 却只有为数不多的可能
类似地 如果将碱基对视作字符 那么DNA或RNA也可视作为字符串
再一次地 尽管这类字符串的长度可能很长
但是正如众所周知的 组成这种字符串的字符 种类却屈指可数
实际上 计算机中所存储的任何序列 从本质上讲都可视作是二进制序列
也就是说 组成它们的字符 非0即1
是的 所有这些例子 都告诉我们
我们这里所讨论的串 其长度的确都要远远大于字母表的长度
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试