时间复杂度和空间复杂度

来源:互联网 发布:360手机 usb共享网络 编辑:程序博客网 时间:2024/04/26 23:56

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

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

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

    以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;  }




0 0
原创粉丝点击