您的位置:首页 > 理论基础 > 数据结构算法

算法时间复杂度分析

2017-11-17 15:12 351 查看

参考博客

算法——算法时间复杂度的计算和大O阶的推导

算法(一)时间复杂度

常用算法时间复杂度的计算方法

算法的时间复杂度和空间复杂度-总结

内容

时间复杂度

时间复杂度的表示方法

时间复杂度的计算方法

时间复杂度

时间复杂度是指程序运行从开始到结束所需要的时间。时间复杂度的计算一般比较麻烦,故在数据结构的研究中很少提及时间复杂度。为了便于比较同一个问题的不同算法,通常做法是,从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数做为算法的时间量度。基本操作应是其重复执行次数和算法时间成正比的原操作,多数情况下它是最深层循环内的语句中的操作。算法的执行次数还要随输入集有关,此时要考虑所有可能输入数据的期望值,此时的算法时间复杂度叫平均时间复杂度。有事平均时间复杂度难以确定,此时分析最坏情况下算法的一个上界,此时称为最坏时间复杂度。

时间复杂度的计算方法

第一步:用常数1取代运行时间中的所有加法常数。

第二步:在修改后的运行次数函数中,只保留最高阶项。

第三步:如果最高阶项存在且不是1,则去除与这个项相乘的常数。

for(i=2;i<=n;++i)

   for(j=2;j<=i-1;++j)

   {

    ++x;

    a[i,j]=x;

   }

   其中++x语句频度为:1+2+3+…+n-2=(n-1)(n-2)/2=(n2-3n+2)/2故算法的时间复杂度可表示为:T(n)=O(n2)

   

int i=1;

while(i<\n)

i*=2;

每次执行i都乘以2,设执行次数为x,那么2x≥n,我们只取等于的情况,得到x=log2n。所以这个循环的复杂度为O(logn),底数大小其实在n很大的时候是无足轻重的,所以不做考虑。

时间复杂度的表示方法

设解决一个问题的规模为n,基本操作被重复执行次数是n的一个函数f(n),则时间复杂度可记作: T(n)=O(f(n))

它表示随着问题规模n的增长,算法执行时的增长率和f(n)的增长率相同。其中T(n)叫算法的渐进时间复杂度,简称时间复杂度。算法的时间复杂度考虑的只是对于问题规模n的增长率,则在难以精确计算的情况下,只需考虑它关于n的增长率或阶即可。

如果把T(n)当做一棵树,那么O(f(n))所表达的就是树干,只关心其中的主干,其他的细枝末节全都抛弃不管。

常数阶

main()

{

int sum=0,n=100;

sum=(1+n)*n/2;

printf(“%d”,sum);

}


算法的时间复杂度为O(1)。 这个算法的运行次数函数是f(n)=3。根据我们推导的方法,第一步就是把常数项3改为1。在保留最高阶项时发现,它根本没有最高阶项,所以这个算法的时间复杂度为O(1)。

线性阶

要确定某个算法的阶次,需要确定某个特定语句或某个语句集运行的次数。因此,要分析算法的复杂度,关键就是要分析循环结构的运行情况。

int i; for(i=0;i
{

/时间复杂度为O(1)的程序步骤序列/

}

对数阶

int count=1;

while(count
{ count=count*2; /时间复杂度为O(1)的程序步骤序列/}

由于每次count乘以2之后,就距离n更近了一点。也就是说,有多少个2相乘后大于n,则会退出循环。由2x=n得到x=log2n。所以这个循环的时间复杂度为O(log2n)。

平方阶

inti,j;

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

{ /*时间复杂度为O(1)的程序步骤序列*/

}

}


循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数。间复杂度为O(n2)。

复杂度比较

Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)



常用算法的市价复杂度和空间复杂度



 Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是Ο(1)。其中Ο(log2n)、Ο(n)、 Ο(nlog2n)、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者(即多项式时间复杂度的算法)是有效算法,把这类问题称为P(Polynomial,多项式)类问题,而把后者(即指数时间复杂度的算法)称为NP(Non-Deterministic Polynomial, 非确定多项式)问题。

一般来说多项式级的复杂度是可以接受的,很多问题都有多项式级的解——也就是说,这样的问题,对于一个规模是n的输入,在n^k的时间内得到结果,称为P问题。有些问题要复杂些,没有多项式时间的解,但是可以在多项式时间里验证某个猜测是不是正确。比如问4294967297是不是质数?如果要直接入手的话,那么要把小于4294967297的平方根的所有素数都拿出来,看看能不能整除。 大数分解、Hamilton回路之类的问题,都是可以多项式时间内验证一个“解”是否正确,这类问题叫做NP问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 数据结构