第一章 数据结构
数据是描述客观事物的数和字符的集合
数据项是具有独立含义的数据最小单位,也称为字段或域
数据对象是指性质相同的数据元素的集合,它是数据的一个子集
数据结构是指所有数据元素以及数据元素之间的关系,可以看作相互之间存在着某种特定关系的数据元素的集合
数据结构分为逻辑结构,存储结构,运算三部分
逻辑结构的表示有图表和二元组表示
逻辑结构类型有集合,线性结构,树形结构,图形结构
存储结构类型有顺序存储结构:存储效率高,不便于修改删除
链式存储结构:便于数据修改,方便删除增加,不能随机存取,储存空间利用率低
索引存储结构:查找效率高,但是需要建立索引表,空间开销大
哈希存储结构 : 查找速度快,有关键字即可立即计算出储存地址,但是不储存逻辑结构
算法的5个特性:有穷性,确定性,可行性,有输入,有输出
算法设计的5个目标:正确性,可使用性,可读性,健壮性,高效率和低存储量需求
算法分析的目的是分析算法的时空性能以便改进算法
俩种衡量算法时间性能的方法:事后统计法和事前估算法。
时间复杂度看最深层循环操作即可
数据结构加➕算法=程序
第二章 线性表
线性表是具有相同特性的数据元素的一个有限序列
(线性关系) 有穷性,一致性,序列性
线性表的顺序存储结构---顺序表
把线性表中的所有元素按照其逻辑顺序依次储存到从计算机存储器中指定储存位置开始的一块连续的储存空间。
借助数组类型实现顺序表,数组的基本类型就是线性表中元素的类型
线性表的链式存储结构称。为链表,采用指针来实现
分为单链表,双链表,循环链表,静态链表
单链表的建立 头插和尾插
初始化一个单链表
每次取一个数据元素,插入到表头/表尾
尾插法注意要设置一个指向表尾结点的指针
核心就是初始化操作 ,指定结点的后插操作
* 单链表结构最简单,但只能单向遍历。
* 双链表提供了双向遍历的能力,使得插入和删除操作更加灵活。
* 循环链表通过首尾相连形成环状结构,可以从任意节点开始遍历,适用于需要循环处理节点的情况。
在选择使用哪种链表时,需要根据具体的应用场景和需求来决定。例如,如果需要频繁地进行双向遍历或插入删除操作,双链表可能是一个更好的选择;而如果需要循环遍历节点,循环链表可能更为合适。
1. **单链表(Singly Linked List)**:
- **结构**:每个节点包含一个数据域和一个指向下一个节点的指针。
- **特点**:
- 只能单向遍历节点。
- 插入和删除操作比较简单,只需修改相关指针。
- 需要额外的指针空间来存储链接信息。
- **示例**:
```
[data|next] -> [data|next] -> ... -> [data|next] -> null
```
2. **双链表(Doubly Linked List)**:
- **结构**:每个节点包含一个数据域,一个指向下一个节点的指针和一个指向前一个节点的指针。
- **特点**:
- 可以双向遍历节点,前后移动更加灵活。
- 插入和删除操作依然比较直接,但需要处理两个指针。
- 由于增加了指针,额外空间需求比单链表稍高。
- **示例**:
```
null <- [prev|data|next] <-> [prev|data|next] <-> ... <-> [prev|data|next] -> null
```
3. **循环链表(Circular Linked List)**:
- **结构**:
- **单向循环链表**:类似单链表,但最后一个节点的指针指向第一个节点,形成一个环。
- **双向循环链表**:类似双链表,但最后一个节点的“下一个”指针指向第一个节点,第一个节点的“前一个”指针指向最后一个节点。
- **特点**:
- 没有明显的链表终点,可以从任意节点出发遍历所有节点。
- 适合某些需要循环访问的应用场景,如轮转调度。
- 插入和删除操作相对复杂,需要保证环的完整性。
第三章 栈和队列
栈是一种只能在一端进行出入或删除操作的线性表
栈的主要特点是“后进先出”
采用顺序存储结构的栈称为顺序栈
·栈空的条件:s->top=null
栈满的条件:s—>top==Max Size-1(data数组的最大下标)。
元素e进栈的操作:先将栈顶指针top增1,然后将元素e放在栈顶指针处
出栈的操作:先将栈顶指针top处的元素取出放在e中,然后将栈顶指针减1
采用链式存储结构的栈称为链栈,优点是不存在栈满上溢出的情况
·栈空的条件:s->next==NULL
·栈满的条件:由于只有内存溢出时才出现栈满,通常不考虑这样的情况,所以在链栈中可以看成不存在栈满
元素e进栈的操作:新建一个结点存放元素e(由p指向它),将结点p插人头结点之后
出栈的操作:取出首结点的data值并将其删除
队列简称队,它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入操作,而在表的另一端进行删除操作
队的主要特点是“先进先出”
队尾是允许插入的一端,队头/队首是允许删除的一端
顺序队列
·队空的条件:q->front==q->rear。
·队满的条件:q->rear==Max Size-1(data数组的最大下标)
元素e进队的操作:先将rear增1,然后将元素e放在data数组的rear位置
出队的操作:先将front增1,然后取出data数组中front位置的元素
环形队列/循环队列
因为队满条件设置不合理导致队满条件成立而队列中仍然有空位置的情况称为假溢出
链式队列
队空的条件:q->rear==null (q->front==null)
队满条件:不考虑
元素e进队的操作:新建一个结点存放元素e(由p指向它),将结点p插入作为尾结点。
出队的操作:取出队首结点的data值并将其删除
第四章 串
串的概念 选择7
串是由零个或多个字符组成的有限序列
第五章 递归
.递归算法的时间复杂度分析
递归算法分析不能简单地采用非递归算法分析的方法,递归算法分析属于变长时空分析,非递归算法分析属于定长时空分析
在递归算法分析中首先写出对应的递推式,然后求解递推式得出算法的执行时间或者空间。
第六章 数组和广义表
从逻辑结构上看,一维数组A是n(n>1)个相同类型的数据元素a 1、a 2、…·、an构成的有限序列,其逻辑表示如下:A=(a 1,a 2,,a)
其中,a;(1≤)表示数组A的第个元素。
一个二维数组可以看作每个数据元素都是相同类型的一维数组的一维数组。以此类推,任何多维数组都可以看作一个线性表,这时线性表中的每个数据元素也是一个线性表推广到d(d≥3)维数组
.数组除了可以初始化和销毁以外,在数组中通常只有下面两种操作
·读操作(或取操作):给定一组下标,读取相应的数组元素
·写操作(或存操作):给定一组下标,存储或者修改相应的数组元素
数组数据类型具有以下性质:
(1)数组中的数据元素数目固定,一旦定义了一个数组,其数据元素数目不再有增减的变化。
(2)数组中的数据元素具有相同的数据类型
(3)数组中的每个数据元素都和一组唯一的下标对应。
(4)数组具有随机存储特性,可随机存取数组中的任意数据元素
顺序存储结构
特殊矩阵的压缩存储
对称矩阵,上下三角矩阵,对角矩阵
压缩存储可以提高存储空间效率
特殊矩阵可以压缩存储的原因在于其元素分布具有一定的特殊规律。这些规律使得矩阵中存在大量的重复元素或零元素,从而可以通过特定的压缩策略来减少存储空间的占用。
具体来说,当特殊矩阵的数值分布具有规律时,例如在对称矩阵中,元素满足a(i,j)=a(j,i)的性质,因此可以将n*n个元素压缩到n(n+1)/2个存储空间中去。类似地,对角矩阵只有主对角线上的元素为非零值,其余元素都为零,这种矩阵的存储方式也可以进一步优化。
此外,数据库压缩的原理也涉及数据类型、数据分布和数据相关性等因素。对于特殊矩阵,由于其元素分布的特殊规律,压缩算法可以更有效地利用这些规律来减少存储空间的占用。
总的来说,特殊矩阵的压缩存储是通过利用矩阵中元素的特殊分布规律,以及采用相应的压缩策略来实现的,这有助于节省存储空间并提高数据处理的效率。
当一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t非常小时,即s<<t时,称该矩阵为稀疏矩阵
表示方法有:三元组(顺序),十字链(链式)
广义表:广义表(generalized table)是线性表的推广,是有限个元素的序列,其逻辑结构采用括号表示法表示如下GL=(a1,a2،an)
其中n表示广义表的长度,即广义表中所含元素的个数,n≥0。若n=0,称为空表。a;为
广义表的第个元素,如果a;属于原子类型(原子类型的值是不可分解的,如C/C++语言中
的整型、实型和字符型等)称为广义表GL的原子(atom);如果a,又是一个广义表,称为
广义表GL的子表(sub generalized table)。
广义表具有以下重要的特性:
(1)广义表中的数据元素是有相对次序的。
(2)广义表的长度定义为最外层包含元素的个数
(3)广义表的深度定义为所含括弧的重数,其中原子的深度为0,空表的深度为1
(4)广义表可以共享,一个广义表可以被其他广义表共享,这种共享广义表称为再入表。
(5)广义表可以是一个递归的表,一个广义表可以是自己的子表,这种广义表称为递归表。理论上讲,递归表的深度是无穷值,而长度是有限值。