#分析算法
通常从正确性、可读性、健壮性、效率等几个方面来评价算法的性能:
- 正确性:算法的执行结果应当满足预先规定的功能和性能要求。
- 可读性:算法应当思路清晰、层次分明、简单明了、易读易懂。
- 健壮性:当输入不合法数据时,应能做适当处理,不至于引起严重后果。
效率:时间效率和空间效率。
时间复杂度
两种分析方法:
- 理论分析方法
- 实验分析方法
处理一下几种情况: 非常复杂的算法,理论分析不可行;指数时间复杂度属于N-P问题范畴的;海量数据。
非递归算法时间复杂度分析步骤
- 确定度量问题的规模 n。
- 确定基本操作。
- 明确输入数据的分布对算法时间复杂性是否有影响。分别分析最坏情况下、最好情况、平均情况下时间复杂性。
- 针对算法实现方式,统计基本操作的执行次数,利用求和关系式求出时间复杂度的函数关系。对于非递归算法,时间复杂度函数关系 T(n) 一般是一个关于 n 的多项式函数。
- 进行时间复杂的渐进分析,明确时间复杂性渐进阶的类型。
递归算法时间复杂度分析步骤
- 确定问题规模 n。
- 确定基本操作。
- 明确输入数据的分布对算法时间复杂性是否有影响。分别分析最坏情况下、最好情况、平均情况下时间复杂性。
- 针对实现方式,写出时间复杂度 T(n) 的递归关系式。
- 进行时间复杂的渐进分析,明确时间复杂性渐进阶的类型。
例如:汉诺塔问题
有A、B、C三根柱子,A柱上有 n 个大小不一的盘子,盘子有大到小从下到上放置,要求将 A 上的盘子移动到 C 上,要求一次移动一个盘子,任何时候不允许大盘子在小盘子上面。
算法设计:
public void hanoi(int n, Char A, Char B, Char C){
if(n == 1){
move(A, C);//只有一个盘子,直接移动
}
hanoi(n-1, A, C, B);//将上面的 n-1 个盘子移动到 B
move(A, C);//直接移动 A 最下面的盘子到 C
hanoi(n-1, B, A, C);//将 B 上的 n-1 个盘子移动到 C
}
时间复杂度分析:
- 问题规模 n。
- 基本操作: 移动圆盘, 即 move(A, C)。
- 递归关系式: T(1) = 1; T(n) = 2T(n-1) + 1;
- 求解递归,得到 T(n) 函数式。
求解递归关系式可以用替代法或者特征方程法,这里用替代法求解:
T(n) = 2T(n-1) + 1
= 2^2T(n-2) + 2 + 1
= ...
= 2^iT(n-i) + 2^(i-1) + ... + 2^1 + 1
2
带入 i = n - 1得 T(n) = 2^(n -1) + 2^(n-1) + … + 1 得 T(n) = 2^n - 1;即T(n) = O(2^n)。