一、绪论
数据结构
基本概念
- 数据
- 数据元素、数据项
- 数据对象、数据结构
三要素
-
逻辑结构
-
集合结构
-
线性结构
- 一对一
-
树形结构
- 一对多
-
图状结构
- 多对多
-
-
数据的运算
- 结合逻辑结构、实际需求来定义基本运算
-
物理结构(存储结构)
- 顺序存储
- 链式存储
- 索引存储
- 散列存储
算法的基本概念
什么是算法
- 对特定问题求解步骤的一种描述,是指令的有限序列,其中的每条指令表示一个或多个操作。
算法的五个特性
-
有穷性
-
必须在执行有穷步之后结束,且每一步都可在有穷时间内完成
- 注:算法是有穷的,程序可以是无穷的。
-
-
确定性
- 算法中每条指令必须含有确切的含义,对于相同的输入只能得出相同的输出。
-
可行性
- 算法描述的操作都可以通过已经实现的基本运算执行有限次来实现。
-
输入
- 有零个或多个输入,输入取自某个特点定的对象的集合。
-
输出
- 有一个或多个输出,输出是与输入有某种特定关系的量。
“好”算法的特性
-
1)正确性
- 算法应能正确地解决求解问题。
-
2)可读性
-
算法应具有良好的可读性,以帮助人们理解。
- 注释
-
-
3)健壮性
- 输入非法数据时,算法能适当地作出反应或进行处理,而不会产生莫名其妙的输出结果。
-
4)高效率与低存储量需求
-
时间复杂度低
-
如何计算
- 1)找到一个基本操作(最深层循环)
- 2)分析该基本操作的执行次数x与问题规模n的关系 x=f(n)
- 3)x的数量级O(x)就是算法的世界复杂度
-
常用技巧
-
常对幂指阶
- O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
-
加法规则:O(f(n))+O(g(n))=O(max(f(n),g(n)))
-
乘法规则:O(f(n)) x O(g(n)) = O(f(n)xg(n))
-
三个结论
- 结论1:顺序执行的代码只会影响常数项,可以忽略。
- 结论2:只需挑循环中的一个基本操作分析它的执行次数与n的关系即可。
- 结论3:如果有多层嵌套循环,只需关注最深层循环循环了几次。
-
-
三种复杂度
- 最坏时间复杂度:考虑输出数据“最坏”的情况
- 平均时间复杂度:考虑所有输入数据都等概率出现的情况
- 最好时间复杂度:考虑输入数据“最好”的情况
-
-
空间复杂度低
-
如何计算
-
普通程序
- 1)找到所占空间大小与问题规模相关的变量
- 2)分析所占空间x 与 问题规模 n 的关系 x=f(n)
- 3)x的数量级O(x)就是算法空间复杂度S(n)
-
递归程序
- 1)找到递归调用的深度x 与 问题规模 n 的关系 x=f(n)
- 2)x的数量级O(x)就是算法空间复杂度S(n)
- 注:有的算法各层函数所需存储空间不同,分析方法略有区别
-
-
常用技巧
-
常对幂指阶
- O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
-
加法规则:O(f(n))+O(g(n))=O(max(f(n),g(n)))
-
乘法规则:O(f(n)) x O(g(n)) = O(f(n)xg(n))
-
-
-