1.4算法与算法分析
- 前言
- 算法与算法设计
- 算法效率度量
- 算法空间需求
前言
什么是算法?算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
算法与算法设计
(1)算法的重要特性:
①有穷性:一个算法对于合法的输入值,必须总是在执行有穷步之后结束,且每一步都要在有穷时间内完成。
②确定性:算法中的每一条指令必须有确定的含义,读者理解时不会产生二义性。并且,在任何情况下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
③可行性:算法是可行的,即算法中的操作是可以通过已经实现的基本运算执行有限次数完成。
④输入:一个算法有零个或多个输入
⑤输出:一个算法有一个或多个输出
(2)算法设计的要求:
①正确性:算法应当满足具体问题的要求。
②可读性:算法应当便于其他读者的理解和要求。
③健壮性:当输入非法时,算法也能做出反应,不会输出莫名其妙的结果。
即算法能对各种输入(包括非法输入)做出合适的反应。
④效率与低存储量要求:设计算法时尽可能的选用效率高,使用空间小的算法。
算法效率度量
算法执行时间需通过使用该算法编制的计算机程序消耗的时间来度量。度量时常有两种方法,事后统计和事前估计。
事后统计的方法常由于软件硬件等原因而干扰对算法本身的评判,故常用事前估计的方法。
引入名词
(1)问题规模:n为描述问题规模的自变量,常用整数表示,如计算斐波那契数列的第n项,其问题规模就为n。
(2)频度:语句的频度是指,一个语句在程序完全运行后,执行的总次数。
(3)时间复杂度:
一般来说,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作:
T(n) = O( f(n) )
T '(n) = f '(n) (n→+∞)
T(n) ~ c*f(n) c∈N+ (n→+∞) 即T(n)和f(n)同阶。
它表示随着问题规模 n 的增大,算法执行时间的增长率和f(n)相同。
T(n)称作算法的渐进时间复杂度,简称时间复杂度(time complexity)。
T(n)是一个以问题规模n为自变量,增长率与基本操作重复执行次数f(n)相同的函数,且在n趋近无穷大时,和f(n)为同阶无穷大。
作为惯例,常将时间复杂度O(1) , O(n) , O(n2)称为,常量阶,线性阶,平方阶。
从图中可见,我们应该尽量选择幂次阶的算法,避免选择指数阶的算法。
注意:算法复杂度中的f(n)只是代表增长率,类似于导数,并不是指数阶的算法复杂度一定大于幂次阶,还要看算法规模n的大小。
算法的存储空间需求
类似于算法的时间复杂度,将空间复杂度(space complexity)作为算法所需存储空的量度,记作
S(n) = O( f(n) )
其中n为问题规模大小。
一个程序除了需要存储空间来寄存本身所用的指令、常数、变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。
若所需的空间只取决于问题本身,而与算法无关,则仅需分析除输入和程序之外的额外空间,否则,应该同时考虑输入本身所需的空间。
若额外空间相对输入数据量为常数,则称此算法为原地工作算法。