算法的时间复杂度

经常可以在一些书上看到这样的公式:程序=数据结构+算法所以算法 的重要性是不言而喻的.

那么什么是算法呢?

算法的基本特性有:

1.确定性-----算法中的每一条指令无二义性.

2.有穷性-----算法经过有限的计算次数后结束.

3.可行性-----算法是由一些基本可行的运算实现.

4.算法有0个或者多个输入.

5.算法有1个或者多个输出.

那么我们又依据什么规则来设计一种特定的算法呢?

1.首先设计的算法要是正确的.根据严蔚敏数据结构一书中介绍了算法的这种正确性的四个层次.

层次一:程序不含语法错误.这是最基本的,也是在初学者最容易出现错误的地方

层次二:程序对于几组输入能够得到符合规格的结果.

层次三:程序对于精心挑选,条件苛责的输入仍然能得到符合规格的结果.这是大多数程序能够达到的层次.

层次四:程序对于任何输入都能得到符合规格的结果.这样的程序可以称得上完美,但是要实现这样的程序绝非易事.

在实际工作中,层次一往往是通过编译工具进行检查修正,否则存在语法错误的程序是无法运行的.而后几个层次

往往是使用专门的测试工具进行测试.


2.其次程序是可读的,算法不仅是面向机器,更重要的是面向读者.如果实现算法的程序是晦涩难懂的,那么这样的算法

   肯定称不上好的算法.

3.还要程序是健壮的.所谓健壮是指实现算法的程序,不仅对于正确的输入能够给出正确的结果.对于不合要求的输入

  仍然能够进行错误判别.识别出究竟是哪类错误.

4.最后就是算法时间效率和空间效率.所谓时间效率是指算法执行的时间.当然越快越好.空间效率是指算法执行所占

  用的内存空间.当然是越小越好.

而对于算法最重要的就是效率了,那么效率如何度量

一种方式是将不同算法用程序实现,然后比较运行时间.这是一种最直观的比较算法效率的方法.很明显这种方式要求

我们将要比较的算法首先一一实现之后再来进行比较.不难看出这种比较方式是比较笨拙的.而且不同的硬件条件下

运行的时间也肯定是有差异的.

 

二种方式是不需要事先将算法实现来计算算法的时间效率:

这种方式需要考虑如下几个方面的因素:

1.问题的规模.比如计算100的阶乘肯定和计算1000的阶乘肯定运行时间不同.100和1000就是规模

2.书写算法的程序语言越高低,时间效率越低.反之,效率越高.

3.代码本身的质量,是否有冗余代码等等

4.计算机指令执行的快慢.


 

我们撇开语言,代码质量,硬件质量快慢这些认为可控因素不谈.

同一算法的时间效率主要取决于问题规模的大小.


对于同一问题的不同算法,在相同的问题规模下:

我们以100的累加为例.

计算100的阶乘,可以是1+2+3+4+5......100

    也可以是(1+100)+(2+99)+(3+98)+......+(50+51)即简化为101*50;

很显然第二种计算方法要便于计算,时间效率高于第一种.


接下来我们将上例用代码进行描述:

第一种方式的累加

1 int sum=0; ① 2 for(int i=1;i<=100;i++) ② 3 sum=sum+i; ③

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpgjw.html