逻辑结构:
存储结构:
数据的存储结构:
数据的运算:
数据类型是一个值的集合和定义在此几何上的一组操作的总称。
抽象数据类型(Abstract Data Type,ADT)是抽象数据组织及与之相关的操作。
抽象数据类型只关心:
程序 = 数据结构 + 算法
算法的特性:
算法必须是有穷的,而程序可以是无穷的。
“好”算法的特质:
时间开销
用
加法规则 (只保留更高阶的项):
=T_1(n)+T_2(n) =O(f(n)) + O(g(n)) =O(max(f(n),g(n)))乘法规则 :
=T_1(n) \times T_2(n) =O(f(n)) \times O(g(n)) =O(f(n) \times g(n)) \begin{aligned} T_3(n) &=n^3+n^2log_2n\\ &=O(n^3)+O(n^2log_2n)\\ &=O(n^3) \end{aligned}算法的时间复杂度( 常对幂指阶 ):
O(1) < O(log_2n) < O(n) < O(nlog_2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
查找长度为
平均情况:被查找的元素出现在任意位置的概率相同,都为
计算时间复杂度情况:
算法的性能问题只有在
空间开销(内存开销)
普通程序只需要关注存储空间大小与问题规模相关的变量:
函数递归调用带来的内存开销。(函数调用栈)
空间复杂度 = 递归调用的深度。也有的情况,每一层递归调用的空间大小不一样。
递归程序:
加法规则:
O(f(n)) + O(g(n)) =O(max(f(n),g(n)))乘法规则:
O(f(n)) \times O(g(n)) =O(f(n) \times g(n))常对幂指阶:
O(1) < O(log_2n) < O(n) < O(nlog_2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)