算法效率分析基础
1. 分析框架算法的时间效率和空间效率都用输入规模的函数进行度量。我们用算法基本操作的执行次数来度量算法的时间效率;通过计算算法消耗的额外存储单元的数量来度量空间效率。(不过通常优先考虑算法的时间效率)对于输入规模的度量通常是直接用N,但如果是度量与数字特性相关的输入规模,更倾向于度量数字N的二进制表示中的比特数b = log n +1在输入规模相同的情况下,有些算法自身的效率会有显著差异,对于这样的算法,我们需要区分最差效率,最优效率和平均效率(重要,且难计算)。另外还有“摊销效率”我们可以认为:如果一个程序的算法具有对数级的基本操作次数,该程序对于任何实际规模的输入都会在几乎瞬间完成;一个需要指数级操作次数的算法只能用来解决规模非常小的问题。本框架主要关心:当算法的输入规模趋向于无限大的时候,其运行时间(或消耗的额外空间)函数的增长次数。
2. 渐进符号和基本效率类型三种渐进符号:O,omega,theta同时也可以利用极限(两个函数的比率)来比较。基本的效率类型: 1(常量),log n(对数),n(线形),n-log-n,平方,立方,指数,n! (阶乘)。
3. 非递归算法的数学分析
a. 决定用哪个(哪些)参数作为输入规模的度量。
b. 找出算法的基本操作(一般总是位于算法的最内层循环中)
c. 检查基本操作的执行次数是否只依赖输入规模,如果还依赖其他个,则最差效率,平均效率以及最优效率(如有必要)需要分别研究。
d. 建立一个算法基本操作次数的求和表达式。
e. 利用求和运算的标准公式和法则来建立一个操作次数的闭合公式,或者至少确定它的增长次数。
4. 递归算法的数学分析
a. 决定用哪个(哪些)参数作为输入规模的度量。
b. 找出算法的基本操作。
c. 检查一下,对于相同规模的不同输入,基本操作的执行次数是否不同,如果不同,则必须对最差效率,平均效率和最优效率做单独研究。
d. 对于算法基本操作的执行次数,建立一个递推关系以及相应的初始条件。
e. 解这个递推式,或者至少确定它的解的增长次数。我们应该谨慎使用递归,因为它的简洁可能会掩盖它的低效率。
5. 斐波那契数列0,1,1,2,3,5,8,13,21,34……可以用一个简单的递推式和两个初始条件来定义:当n>1时, F(n) = F(n-1) + F(n-2); F(0)=0, F(1)=1