算法效率的度量
事前分析估算
-
依据统计的方法对算法效率进行估算
影响算法效率的主要因素
-
算法采用的策略和方法(算法本身)----解题步骤(m)----计算机语句(T)
-
算法执行时间=mT
-
-
问题的输入规模(n)
-
m = f(n)
-
算法执行时间 = f(n)*T
-
-
编译器所产生的代码
-
计算机执行速度
算法执行时间的问题就转换为去统计一下我们这个算法执行了多少步
例子
程序效率估算练习----二重循环估算
#include <stdio.h>
//t = (n*n+4)*T
int func(int a[], int len)
{
int i = 0;
int j = 0;
int s = 0;
//n*n
for(i=0; i<len; i++)
{
for(j=0; j<len; j++)
{
s += i*j;
}
}
return s;
}
int main()
{
int array[] = {1, 2, 3, 4, 5};
printf("%d\n", func(array, 5));
return 0;
}
-
练习中的程序关键部分的操作数量为n*n
-
三种求和算法中求和的关键部分的操作数量分别为2n,n和1
随着问题规模n的增大,它们操作数量的差异会越来越大,因此实际算法在时间效率上的差异也会变得非常明显!
判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
大O表示法
-
算法效率严重依赖于操作(Operation)数量
-
在判断时首先关注操作数量的最高次项
-
操作数量的估算可以作为时间复杂度的估算
常见时间复杂度类型
关系
例子:
在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。
算法的空间复杂度
算法的空间复杂度通过计算算法的存储空间实现
S (n)= O(f(n))
其中,n为问题规模,f(n)为在问题规模为n时所占用存储空间的函数
大O表示法同样适用于算法的空间复杂度,当算法执行时所需要的空间是常数时,空间复杂度为O(1)
空间与时间的策略
-
多数情况下,算法执行时所用的时间更令人关注
-
如果有必要,可以通过增加空间复杂度来降低时间复杂度
-
同理,也可以通过增加时间复杂度来降低空间复杂度
在实现算法时,需要分析具体问题对执行时间和空间的要求。