本章的预备知识(读者自己补充的):
(1) 谓词(在本章中,“谓词pred”(即predicate)首次出现在“3.3 链接表 - 3.3.2 单链表 - 扫描、定位和遍历 - 按元素定位”中。)
解释:
离散数学都会讲的一个词语,简单来说就是代入某个论域内的变量就可以产生真或假结果的表达式。比如 x=y+3就是一个谓词,代入(4,1)就是True,代入(0,0)就是False。
参考文献:
我的理解:
判定某个表达式为True还是False。
金山词霸的释义:
vt.断言,断定; 宣布,宣讲; 使基于;
vi.断言,断定;
n.谓语; 述语;
adj.谓语的; 述语的;
(2)结点(在本章中,“结点”首次出现在“3.3 链接表 - 3.3.2 单链表 - 【P79 - P80】”中,我认为是重点,至少在本章是单链表的基础,理解它很重要!!!这里篇幅有限,建议去阅读原文。)
解释:
单链表(单向链接表)的结点是一个二元组,其表元素域elem保存着作为表元素的数据项(或者数据项的关联信息),链接域next里保存同一个表里的下一个结点的标识(这里我存在一点疑问,“标识”是不是指“链接”、“内存地址”)。
(3)表头变量、表头指针、head(在本章中,“表头变量、表头指针”首次出现在“3.3 链接表 - 3.3.2 单链表 - P80 【也就是说。。。】”中,据我的阅读,至少本章用的是head来代表表头变量。)
我的理解:
表头变量是一个变量,这个变量保存着这个表的首结点的引用(或称为链接)。
(4)rear
金山词霸释义:
n 后部;后面;后尾
第3章 线性表
3.1 线性表的概念和表抽象数据类型
3.1.1 表的概念和性质
3.1.2 表抽象数据类型
(读者笔记:这一节讲了线性表的实现者和使用者需要从各自角度需要考虑的问题、使用者角度考虑一个线性表数据结构应该提供哪些操作。请到书上仔细阅读!)
线性表的操作
表抽象数据类型
(读者笔记:这一小节我就不截图了,书上仔细看,也值得仔细看。)
3.1.3 线性表的实现:基本考虑
(读者笔记:这一小节提到了线性表的两种基本实现模型,详情看书上,值得仔细阅读!!)
3.2 顺序表的实现
3.2.1 基本实现方式
(读者笔记:本小结涉及了“引用”、“链接”、“间接访问”、“索引”、“存储区”等概念,建议仔细阅读,我就不详细截图了。)
3.2.2 顺序表基本操作的实现
创建和访问操作
(读者笔记:这一小节内容有点多,我就不截图了。详细看书上吧。)
创建空表:
简单判断操作:
访问给定下表i的元素:
遍历操作:
查找给定元素d的(第一次出现的)位置:
查找给定元素d在位置k之后的第一次出现的位置:
最后几个操作都需要检查表元素的内容,属于基于内容的检索。数据存储和检索是一切计算和信息处理的基础。
总结一下:不修改表结构的操作只有两种模式,或者是直接访问,或者是基于一个整型变量,按下标循环并检查和处理。
变动操作:加入元素
尾端加入新的数据项:
新数据存入元素存储区的第i个单元:
变动操作:删除元素
尾端删除元素:
删除位置i的数据:
基于条件的删除:
顺序表及其操作的性质
各种访问操作,如果其执行中不需要扫描表内容的全部或一部分,其时间复杂度都是O(1),需要扫描表内容操作时间复杂度都是O(n)。
表的顺序实现(顺序表)的总结:
3.2.3 顺序表的结构
两种基本实现方式
(读者笔记:这一小节仅截图“分离式结构”,详细见书上。)
替换元素存储区
分离式实现的最大优点是带来了一种新的可能:可以在标识不变的情况下,为表对象换一块元素存储区。也就是说,表还是原来的表,其内容可以不变,但是容量改变了。
如果采用分离式技术实现,可以在不改变对象的情况下换一块*更大的元素存储区*,使加入元素操作可以正常完成。操作过程如下:
1)另外申请一块更大的元素存储区。
2)把表中已有的元素复制到新存储区。
3)用新的元素存储区替换原来的元素存储区(改变表对象的元素区链接)。(这里参见图3.6b,读者补充,)
4)实际加入新元素。
后端插入和存储区扩充
(读者补充:这一小节我没有仔细读,感觉不是很重要,但建议下次仔细阅读。)