1. 概述
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程程序的效率。算法分析的目的在于选择合适算法和改进算法,算法分析的方法就是预估其时间复杂度和空间复杂度。
然而一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才知道。但我们都知道一个算法花费的时间与算法中语句的执行次数成正比,哪个算法中语句执行次数多,它花费时间相对就多。时间复杂度正是利用这个原理来划分等级的。
相关文章链接:
计算机复杂度:http://baike.baidu.com/view/669052.htm
时间复杂度:http://baike.baidu.com/view/104946.htm
2.时间复杂度-------计算方法
以下是网上看到的总结得比较精炼的文章:
求解算法的时间复杂度的具体步骤是:
⑴ 找出算法中的基本语句;
算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
⑵ 计算基本语句的执行次数的数量级;
只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
⑶ 用大Ο记号表示算法的时间性能。
将基本语句执行次数的数量级放入大Ο记号中。
如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。例如:
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。
常见的算法时间复杂度由小到大依次为:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是常数阶Ο(1)。对数阶Ο(log2n)、线性阶Ο(n)、线性对数阶Ο(nlog2n)、平方阶Ο(n2)和立方阶Ο(n3)称为多项式时间,而指数阶Ο(2n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者是有效算法,把这类问题称为P类问题,而把后者称为NP问题。