算法-分析

继上一篇绪论,此文开启了两种基本算法的分析举例:

上篇 非递归算法的分析

例:查找数组中最大元素。

下面给出代码:

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函数可以计算程序运行的时间,通过实验我们一样可以总结出复杂度。

你可能感兴趣的:(算法-分析)