1.绪论:
数据结构强调的是数据元素之间一定要有某种关系
数据对象强调的是数据元素之间只要有相同的性质
2.数据结构的三要素:
1.逻辑结构:
1.集合
2.线性结构(一对一)
前驱与后继的定义
3.树形结构(一对多)
4.图结构(多对多)
2.数据的运算:
定义:结合逻辑结构、实际需求来定义基本运算
3.物理结构(存储结构):
- 顺序存储:利用相邻顺序
- 链式存储:利用指针
- 索引存储:利用索引表
- 散列存储(哈希存储)
运算的定义是针对逻辑结构的,指出运算的功能。(用户)
运算的实现是针对存储结构的,指出运算的具体操作步骤。(程序员)
4.数据类型、抽象数据类型:
数据类型:数据类型是一个值的集合和定义在此集合上的一组操作的总称
1.原子类型:其值不可再分的数据类型
2.结构类型:其值可以在分解成若干成分(分量)的数据类型
抽象数据类型(ADT):是抽象数据组织及与之相关的操作,(逻辑结构+数据的运算)
2.算法及其描述:
程序 = 数据结构 + 算法
1.算法的特性:
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
2.算法设计的目标:
- 正确性
- 可使用性
- 可读性
- 健壮性
- 高效率与低存储量需求
3.算法效率的度量:
1.算法时间复杂度:
只需要保留阶数最高的一项,并且系数变为1
T1(n) = O(n)
结论1:顺序执行的代码只会影响常数项
结论2:只需挑循环中的一个基本操作分析它的执行次数与n的关系即可(只考虑循环次数)
结论3:如果有多层嵌套循环,只需关注最深层循环循环了几次
求时间复杂度的三类题型及其解法:
1.一层循环:
解题步骤:
1.列出循环次数t及每轮循环i的变化值
2.找到t与i的关系
3.确定循环停止条件
4.联立两式,解方程
2.二层循环:
1.列出外层循环中i的变化值
2.列出内层语句中的执行次数
3.求和,写结果
口诀:常对幂指阶
2.算法空间复杂度:
如果一个算法所需要的内存空间和问题规模n没有关系,即空间复杂度为常数阶,那么我们可以称这种算法原地工作
4.线性表:
1.存储结构:
- 顺序表
- 链表
2.顺序表:
1.顺序表的实现
1.静态分配:数组
2.动态分配:指针
用malloc和free函数来动态申请和释放内存空间
3.顺序表特点:
- 随机访问,即可以在O(1)时间内找到第i个元素
- 存储密度高,每个节点只存储数据元素
- 拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
- 插入删除操作不方便
2.顺序表的基本操作:
- 插入
- 删除
- 按值查找
- 按位查找
注:c语言中结构类型的比较,不能简单的使用==来比较,需要依次对比各个分量来判断两个结构体是否相等。c++中常用运算符重载来进行比较。
3.;链表:
1.单链表:
- 定义
- 插入
- 删除
- 查找