关于数据结构的算法评估与分析

参考教材《数据结构C语言版》严蔚敏 著

一、算法的五大重要特性

  1.       有穷性:在有穷时间内执行完成任何合法输入;
  2.       确定性:无二义性,算法对于相同的输入只能得到相同的输出;
  3.       可行性:算法中描述的操作都可以通过已实现的基本操作有限次完成;
  4.       输入:0或多;
  5.       输出:1或多;

二、算法设计要求

  1. 正确性:4个层次:a.程序无语句错误;b.对几组输入数据满足;c.对精心挑选的、典型的、苛刻的数据满足;d.对一切满足;程序到c即可算作正确;

  2. 可读性:算法是为了给程序员看的,其次才是机器执行;

  3. 健壮性:当输入非法数据时,算法要适当给出反应或处理,而不是莫名其妙的输出结果;

  4. 效率和低存储要求

三、算法的效率度量

(1)事后统计的方法:缺点a.必须先运行依据算法编制的程序;b.依赖于计算机的硬件、软件等环境因素,易掩盖算法本身的优劣;

(2)事前分析估算:a.算法选用策略;b.问题的规模;c.程序的语言,同一算法,实现的语言级别越高,执行效率越低;

d.编译程序所产生的机器代码的质量;e.机器执行指令的速度;撇开其他因素,可以认为算法只依赖问题的规模。

四、时间复杂度

算法=控制结构+原操作;

为了便于比较同一问题的不同算法,通常选取一种对于问题的基本操作,以基本操作的重复次数作为算法的时间度量。

算法执行时间=∑ 基本操作的执行次数×每次基本操作执行时间(定值);

(1)时间复杂度            一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。 

(2)渐进时间复杂度评价算法时间性能   主要用算法时间复杂度的数量级(即算法的渐近时间复杂度)评价一个算法的时间性能。

(3)时间复杂度的求解(根据定义,可以归纳出基本的计算步骤 )

  1. 计算出基本操作的执行次数T(n)

        基本操作即算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。
  2. 计算出T(n)的数量级

        求T(n)的数量级,只要将T(n)进行如下一些操作:忽略常量、低次幂和最高次幂的系数,令f(n)=T(n)的数量级。

  3. 用大O来表示时间复杂度

        当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。

  4. 以上步骤可以简化为: 
    a. 找到执行次数最多的语句 
    b. 计算语句执行次数的数量级
    c. 用大O来表示结果 

  5. 复杂度与时间效率的关系:
    c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)

五、空间复杂度

定义:一个算法在运行过程中临时占用存储空间大小的量度;包括以下:

  1. 存储算法本身所占用的存储空间;(与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。)
  2. 算法的输入输出数据所占用的存储空间;(由要解决的问题决定 的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。)
  3. 算法在运行过程中临时占用的存储空间;(随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们 称这种算法是“就地"进行的,是节省存储的算法;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着 n的增大而增大,当n较大时,将占用较多的存储单元)

 

 

猜你喜欢

转载自blog.csdn.net/gaobosky/article/details/81217607