数据结构的基本知识
数据结构关注的是数据元素之间的关系 和对这些数据元素的操作,不关心具体的数据项内容
基本概念
数据对象:具有相同性质的数据元素的集合,是数据的一个子集
数据结构:相互之间存在一种或多种特定关系的数据元素的集合
数据结构的三要素:
- 逻辑结构: 集合结构 线性结构:一对一 树形结构:一对多 图状结构:多对多
- 数据的运算:针对于某种逻辑结构,结合实际需求,定义基本运算
- 物理结构(存储结构):表示数据元素的逻辑结构
- 用线性结构来演示:
- 顺序存储:逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现
- 链式存储:逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系
- 索引存储:建立附加的索引表,索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)
- 散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希存储
算法:
程序 = 数据结构 + 算法
特性:
- 有穷性:算法必须是有穷的,程序可以是无穷的
- 确定性:运算过后的结果必须唯一
- 可行性:算法中描述的操作都可以通过已经实现的基本运算执行有效次来实现
- 输入:有零个或多个输入
- 输出:一个或多个输出
算法的度量:
- 时间复杂度:
void love(int n){
for(int i = 0;i<n;i++){
printf('love you %d\n',i);
}
}
常对幂指阶
结论:
- 顺序执行的代码只会影响常数项,可以忽略
- 只需挑循环中的一个基本操作分析它的执行次数与n的关系即可
- 如果有多层嵌套循环,只需关注最深层循环循环了几次
- 空间复杂度
无论问题规模怎么变,算法运行所需的内存空间都是固定的常量, 算法的空间复杂度为: S(n) = O(1)
S为Space
算法原地工作——算法所需内存空间为常量
函数递归带来的开销:
第一种:
第二种:
- S(n) = O(n方):
结论: