算法的两大性能指标:时间复杂度和空间复杂度

     算法是对特点问题求解步骤的一种描述。同时具备有5个重要特性:
① 有穷性:一个算法必须重视在执行有穷步之后结束,且每一步都可在有穷时间内完成。
② 确定性:算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只要唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
③ 可行性:一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
④ 输入:一个算法有零个或多个输入,只写输入取之于某个特定的对象的集合。
⑤ 输出:一个算法有一个或多个输出,这些输出视同输入有着某些特定关系的量。

     评价算法的两大性能指标:时间复杂度空间复杂度

时间复杂度

时间频度
     一个算法中的语句执行次数。记为T(n);
时间复杂度
     时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。为了知道变化时呈现什么规律,引入时间复杂度。
     若存在某个函数f(n),当 n –> ∞时,T(n) / f(n) 为不等于0的常数,则称f(n)是T(n)的同数量级函数。记为T(n) = O(f(n));称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
     随之n的增大,时间的增长率和f(n)的增长率成正比。f(n)越小,算法的时间复杂度越低,算法的效率越高。
最坏时间复杂度
     最坏情况下的时间复杂度称为最坏时间复杂度。最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界。
     不特别说明的情况下,讨论的时间复杂度即为最坏时间复杂度。
平均时间复杂度
     所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。

常见的时间复杂度

在这里插入图片描述
常用的时间复杂度所耗费的时间从小到大依次是:

O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

常数阶复杂度

int i;
i=n;

运行时间与n无关,是一个常数,所以复杂度是一个常数阶复杂度

线性阶复杂度

int i, j;
for(i=0; i < n; i++) {
function(i);
}
void function(int count) {
	printf(“%d”, count);
}

其t(n) = n ,所以时间复杂度为o(n)线性阶数

平方阶复杂度

inti, j, n = 100;
for( i=0; i < n; i++ )
{
	for( j=0; j < n; j++ )
    {
    	printf(“I love FishC.com\n”);
    }
}

其t(n) = n^2 ,所以时间复杂度为o(n^2)平方阶复杂度

对数阶复杂度

int i = 1, n = 100;
while( i < n )
{
  	 i = i * 2;
}

由于每次i*2之后,就举例n更近一步,假设有x个2相乘后大于或等于n,则会退出循环。
于是由2^x = n得到x = log(2)n,所以这个循环的时间复杂度为O(logn)。

nlogn阶复杂度

for(m=1; m<n; m++)
{
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}

指数阶复杂度

int i = 1, n = 100,j=0;
while( i <2^n )
{
  	 j += i ;
}

所用的时间t(n)=2^n,所以时间复杂度为 指数阶

常用排序算法的复杂度

在这里插入图片描述

空间复杂度

定义:算法的空间复杂度通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
     一个算法在计算机存储器上所占用的存储空间包括三个方面:
1、存储算法本身所占用的存储空间;
      与算法书写的长短成正比,要压缩此方面的存储空间,则必须编写出精短的算法。
2、算法的输入输出数据所占用的存储空间;
     由解决的问题决定,是通过参数表由调用函数传递而来,不随算法的不同而改变。
3、算法在运行过程中临时占用的存储空间;
      随算法的不同而不同。主要包括动态分配的空间、以及递归栈所需的空间等。
一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。

时间与空间的取舍

     在设计算法的时候当然是时间用的越少越好,空间用的越少越好,但是实际中这两个方面都是一个矛盾的存在体。所以设计算法需要针对不同的应用来设计。
     当在运行时间要求较高,且空间比较充足的情况下就可以用空间来换取时间,一般高新能的场合。
     当在一些运行时间不高的嵌入式场合,而内存特别稀缺的情况下,就可以用时间来换空间。
     总之,针对不同的情况,为了解决同一个问题也会有不同的算法,根据实际情况,选择合适的算法

猜你喜欢

转载自blog.csdn.net/weixin_43369409/article/details/93744988
今日推荐