时间复杂度和空间复杂度详解

来源:互联网 发布:个体户办淘宝企业店铺 编辑:程序博客网 时间:2024/05/22 01:47
算法的复杂度分为时间复杂度空间复杂度

1、时间复杂度
        表示为总的执行次数T(n)是关于问题规模n的函数,也就是T(n)随着n的变化,用一个函数表示为:
                                                                        T(n) = O(f(n))
所以我们说到算法的时间复杂度总是用大写O来表示,一般随着n的增长,T(n)也会增长。则T(n)增长最慢就是时间性能最优的算法。
用大O表示法表示时间复杂度阶次O(1)常数阶O(n)线性阶O(n^2)平方阶O(n^3)立方阶O(2^n)指数阶O(logn)对数阶O(nlogn)nlogn阶
当然还有其他一些表示法,这里只列出常见的表示方法。
下面给出大O阶的推导方法:
(1)用常数1取代运行中的所有加法常数
(2)在修改后的运行次数函数中,只保留最高阶项
(3)如果最高阶项存在,且不是1,则出去常数项,所得的结果就是大O阶

通过几个例子退出算法的时间复杂度:
代码1:
int a = 1;//执行一次int b = 2;//执行一次int c = a + b;//执行一次printf("%d",c);//执行一次
分析:每一行代码执行一次,共4次,则f(n)=4,有T(n)=O(4)。根据推导法第一步,常数项用1代替,没有最高阶保留,所以代码1的时间复杂度为O(1),为常数阶。

代码2: 
for( i=0 ; i<n ; i++)//执行n次sum = i+1;printf("%d",sum);//执行一次
分析:代码一共执行n+2次,f(n)=n+2,则T(n)=O(n+2。将常数项用1代替,保留最高阶,得到T(n)=O(n)。为线性阶。


代码3:
int i= 1;while(i<n)i = i * 2;
分析:当程序运行到i>=n时,程序退出循环,如果循环了f(n)次,则有2^f(n) = n,即f(n)=log2^n,有T(n)=O(log2^n),消除常数项,保留最高阶,得到T(n)=O(logn),为对数阶。

时间复杂度比较:

当n>=16时,时间复杂度的优劣关系如下:
O(1)  <  O(log2^n) <  O(nlog2^n) < O(n^2) < O(n^3) < O(2^n)




2、空间复杂度
    空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。
    一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地\"进行的,是节省存储的算法,有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况。

原创粉丝点击