您的位置:首页 > 其它

时间复杂度和空间复杂度

2014-11-20 09:35 260 查看
    在程序设计中,算法的时间复杂性和空间复杂性,是衡量算法优劣的重要指标。而衡量这两个指标时,有三种不同的情形:最好情形、最坏情形和平均情形。

    例如,对排序算法而言,要求将一堆数按升序排列。最好情形是所有数已经有序,最坏情形是所有数按降序排列。而平均情形则是要计算出相应的数学期望,也就是要确定每一种情形出现的概率(一般情况,按等概率分布)。

    有时算法的复杂度过高,无法满足系统的实时性要求,在算法比赛中将被判为超时,是不满足要求的。这就要求我们在设计算法时,需要有效考虑算法的时间复杂性和空间复杂性,有时需要用空间来换取时间。

    以fibnacci数列为例说明这个问题。许多同学拿到这个题目,会很自然想到数列的递推公式f(n)=f(n-1)+f(n-2),相应的代码如下:

#include <stdio.h>
#include <time.h>

int f(int n)
{
if (n==0 || n==1)
return 1;
else
return f(n-1)+f(n-2);
}

int main()
{
long int begint=time(0);
long int b;
b=f(40);
printf("the result is %ld.\n",b);
printf("time=%ld",time(0)-begint);

return 0;
}


<span style="font-family:SimHei;font-size:18px;">    然而这样处理,会导致在计算数列的某一项时,出现重复计算的情况,因此通常这个程序不会满足算法的时间要求。为了提高算法的复杂度,通常采取以空间换时间的方法,牺牲计算机的存储空间,去换取时间复杂度比较低的算法。例如,对上述算法进行改进,可以得到如下的代码:</span>


#include <stdio.h>

int main()
{
long int a[100];
int i;
a[0]=a[1]=1;

for(i=2;i<100;i++)
a[i]=a[i-1]+a[i];

printf("the result is %ld.\n",a[50]);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: