第一章
数据结构三要素
三要素:逻辑结构、存储结构、数据运算。
数据的逻辑结构分为线性结构和非线性结构。如下:
存储结构:顺序存储、链式存储、索引存储和散列存储。
-
顺序存储:逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。优点为可实现随机存取,每个元素占用最少的存储空间;缺点是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。
-
链式存储:不要求逻辑上相邻的元素在物理位置上相邻。借助指示元素存储地址的指针来表示元素之间的关系。优点是不会出现碎片现象,能充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,且只能顺序存取。
-
索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每项成为索引项,索引项的一般形式是(关键字,地址)。其优点是检索速度快;缺点是附加的索引表额外占用存储空间。另外,增加和删除数据是也要修改索引表,因而会花费较多的时间。
-
散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。其优点是检索、增加和删除节点的操作都很快;缺点是若散列函数不好,可能会出现元素存储单元的冲突,而解决冲突会增加时间和空间的开销。
算法效率度量
程序语句的频度:在算法中被重复执行的次数。
算法中所有语句的频度之和为T(n),时间复杂度可理解为最深层循环内的语句的频度,它与T(n)同数量级。
时间复杂度O(n):最好、平均、最坏时间复杂度。
平均时间复杂度:所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
一般总是考虑在最后情况下的时间复杂度,以保证算法的运行时间不会比它更长。
空间复杂度S(n):算法所耗费的存储空间。
第二章 线性表
顺序表:线性表的顺序存储,表中元素逻辑顺序和物理顺序相同。
线性表的特点:
- 元素个数有限。
- 元素具有逻辑上的顺序性,表中元素有其先后次序。
- 表中元素都是数据元素,每个元素都是单个元素。
- 表中元素的数据类型都相同,这意为着每个元素占有相同大小的存储空间。
线性表是一种逻辑结构,表示元素之间一对一的相邻关系。
顺序表、邻接表和链表是存储结构。两者不同。
单链表
单链表:线性表的链式存储。
单链表中节点类型的定义:
typedef struct LNode{
类型名(如int) data;
struct LNode *next;
}LNode,LinkList;
由于单链表的元素离散地分布在存储空间中,所以单链表是非随机存取的存储结构。
查找某个特定的节点时需要从表头开始遍历,依次查找。