【转载】https://www.cnblogs.com/zknublx/p/5885840.htmlhtml
常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)java
(5)下面分别对几个常见的时间复杂度进行示例说明:程序员
(1)、O(1)算法
Temp=i; i=j; j=temp; 数组
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记做T(n)=O(1)。注意:若是算法的执行时间不随着问题规模n的增长而增加,即便算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。函数
(2)、O(n2)spa
2.1. 交换i和j的内容.net
解:由于Θ(2n2+n+1)=n2(Θ即:去低阶项,去掉常数项,去掉高阶项的常参获得),因此T(n)= =O(n2);指针
2.2. htm
解: 语句1的频度是n-1
语句2的频度是(n-1)*(2n+1)=2n2-n-1
f(n)=2n2-n-1+(n-1)=2n2-2;
又Θ(2n2-2)=n2
该程序的时间复杂度T(n)=O(n2).
通常状况下,对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加一、终值判别、控制转移等成分,当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。
(3)、O(n)
解: 语句1的频度:2,
语句2的频度: n,
语句3的频度: n-1,
语句4的频度:n-1,
语句5的频度:n-1,
T(n)=2+n+3(n-1)=4n-1=O(n).
(4)、O(log2n)
解: 语句1的频度是1,
设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n
取最大值f(n)=log2n,
T(n)=O(log2n )
(5)、O(n3)
解:当i=m, j=k的时候,内层循环的次数为k当i=m时, j 能够取 0,1,...,m-1 , 因此这里最内循环共进行了0+1+...+m-1=(m-1)m/2次因此,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6因此时间复杂度为O(n3).
(5)经常使用的算法的时间复杂度和空间复杂度
一个经验规则:其中c是一个常量,若是一个算法的复杂度为c 、 log2n 、n 、 n*log2n ,那么这个算法时间效率比较高 ,若是是2n ,3n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。
算法时间复杂度分析是一个很重要的问题,任何一个程序员都应该熟练掌握其概念和基本方法,并且要善于从数学层面上探寻其本质,才能准确理解其内涵。
二、算法的空间复杂度
相似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也经常简称为空间复杂度。
空间复杂度(Space Complexity)是对一个算法在运行过程当中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法自己所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程当中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是经过参数表由调用函数传递而来的,它不随本算法的不一样而改变。存储算法自己所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程当中临时占用的存储空间随算法的不一样而异,有的算法只须要占用少许的临时工做单元,并且不随问题规模的大小而改变,咱们称这种算法是“就地\"进行的,是节省存储的算法,如这一节介绍过的几个算法都是如此;有的算法须要占用的临时工做单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如将在第九章介绍的快速排序和归并排序算法就属于这种状况。
如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只须要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只须要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。