概述
- 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列
- 解决同一个问题可以有多个算法
- 特点:
有穷性:
算法在执行有限的步骤之后,自动结束,而不会出现无限循环确定性:
算法在一定条件下,只有一条执行路径,相同的输入只能有相同的结果可行性:
算法可以转换为程序上机运行,并得到正确的结果输入输出:
输入 ≥ 0 \geq0 ≥0、输出 ≥ 1 \geq1 ≥1
- 设计要求:
正确性:
(1)算法程序没有语法错误
(2)算法程序对合法输入
能够产生满足要求的输出
(3)算法程序对非法输入
能够得出满足规格说明的结果可读性:
便于阅读,理解和交流健壮性:
对非法输入能做出处理而不是产生异常高效性:
算法程序具有尽量低的时间和空间复杂度正确性
→ \to →健壮性
→ \to →可读性
→ \to →高效性
时间复杂度
- 渐进分析:
- 判断算法的时间效率, T ( n ) T(n) T(n)的
常数项
和次要项
可以忽略不计,应关注主项(最高阶)
- 渐进增长:
- 给定两个函数 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n),若存在一个整数 N N N,使得对于所有的 n > N n>N n>N,总有 f ( n ) ≥ g ( n ) f(n) \geq g(n) f(n)≥g(n), f ( n ) f(n) f(n)的增长渐进快于 g ( n ) g(n) g(n)
- 常见时间复杂度:
常数阶:
O ( 1 ) O(1) O(1),即与问题大小无关,执行时间恒定线性阶:
O ( n ) O(n) O(n),如循环结构
对数阶:
O ( l o g n ) O(log^n) O(logn)平方阶:
O ( m × n ) O(m\times n) O(m×n)- O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) O(1)<O(log^n)<O(n)<O(nlog^n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
- 运算法则:
1. 加法规则:
f 1 ( n ) + f 2 ( n ) = O ( m a x ( f 1 ( n ) , f 2 ( n ) ) ) f_1(n)+f_2(n) = O(max(f_1(n), f_2(n))) f1(n)+f2(n)=O(max(f1(n),f2(n)))
2. 乘法规则:
f 1 ( n ) × f 2 ( n ) = O ( f 1 ( n ) × f 2 ( n ) ) f_1(n)\times f_2(n) = O(f_1(n)\times f_2(n)) f1(n)×f2(n)=O(f1(n)×f2(n))
- 算法的时间复杂度分为
平均时间复杂度
和最坏时间复杂度
- 一般情况下,时间复杂度是指
最坏时间复杂度
平均时间复杂度
是最有意义的,表示期望的运行时间
空间复杂度
- 空间复杂度表示算法实现所需要的的存储空间
空间复杂度:
S ( n ) = O [ f ( n ) ] , n 为 问 题 规 模 S(n) = O[f(n)],n为问题规模 S(n)=O[f(n)],n为问题规模
时空权衡
- 算法的
时间复杂度
和空间复杂度
往往相互矛盾- 增大空间开销可能改善算法的时间开销
- 节约空间往往需要增加运算时间