继上一篇绪论,此文开启了两种基本算法的分析举例:
上篇 非递归算法的分析
例:查找数组中最大元素。
下面给出代码:
int MaxElement(int a[], int n){
int max = a[0];
for(int i = 1; i < n; i++)
if(a[i] > max)
max = a[i];
return max;
}
容易看出,我们可以把a[i] > max视作基本操作,然后就可以开始计算最差情况,平均情况,最优情况了。
我们记C(n)为基本操作的调用次数,则可得C(n) = n - 1 = O(n).
分析非递归算法的通用方案:
1,选择表示输入规模的参数(如上的n)。
2,找出算法的基本操作(如上的a[i] > max)。
3,检查基本操作执行次数是否依赖于输入规模,再考虑是否需要考虑其他原因。
4,建立一个算法基本操作执行次数的求和公式。
5,求和,确定复杂度。
练习:
1,元素唯一性问题:验证给定数组中的元素是否全部唯一。
2,矩阵乘法问题:两个矩阵相乘。
下篇 递归算法的分析
例:计算阶乘F(n) = n!
下面给出代码:
int F(int n){
if(n == 0) return 1;
return F(n-1)*n;
}
此算法的基本操作是乘法,记执行次数为C(n).则有
C(n) = C(n-1) + 1
C(0) = 0.
可以得到C(n) = n-1 = O(n).
分析递归算法的通用方案:
1,寻找输入规模参数。
2,找基本操作。
3,检验是否仅依赖于输入规模,再考虑其他。
4,建立递推关系表达式。
5,解递推式,确定增长次数即为复杂度。
练习:
汉诺塔问题。
到这里,算法时间复杂度分析的基础就算是说完了,可我们还是希望不要去做这么烦人枯燥的分析,尤其是碰到了更加复杂的问题,这样的分析更是无比的头疼,如果不是非常严格的要求,我们完全可以利用程序设计语言的工具,如在C语言中:clock函数可以计算程序运行的时间,通过实验我们一样可以总结出复杂度。
本文继绪论后,对非递归和递归两种基本算法进行复杂度分析。非递归算法以查找数组最大元素为例,给出分析通用方案并配有练习;递归算法以计算阶乘为例,同样给出通用方案和汉诺塔问题练习。还提到可用程序设计语言工具实验总结复杂度。

被折叠的 条评论
为什么被折叠?



