算法时间效率分析方法主要由非递归分析法和递归式分析法两种。以下分别说明:
一、分析非递归算法时间效率的通用方案
- 确定算法中作为输入规模的参数;
- 找出算法的基本操作(通常位于算法的最内层循环中的操作);
- 检查对于相同规模的不同输入实例,基本操作的执行次数是否可能不同,如果有,则需对最差效率、平均效率以及最优效率分别进行讨论;
- 建立算法基本操作的执行频度的计算表达式;
- 利用计算表达式的计算法则确定问题求解时间与问题规模的增长关系。
二、分析递归算法时间效率的通用方案
- 确定算法中作为输入规模的参数;
- 找出算法的基本操作;
- 检查对于相同规模的不同输入实例,基本操作的执行次数是否可能不同,如果有,则需对最差效率、平均效率以及最优效率分别进行讨论;
- 针对算法基本操作的执行次数,建立与输入规模有关的递推关系式及其初始条件;
- 求解递推式以确定问题求解时间与问题规模的增长关系。
三、包含递归调用算法的时间复杂度分析技术总结
当一个算法中包含递归调用时,其时间复杂度分析会转化成为一个递归方程所对应的递推关系式求解。由于递归方程的多样性,包含递归调用的算法时间复杂度分析方法多种多样。以下介绍两种常见形式:
1.形如:
的递推式时间复杂度分析方法。其中,a>=1; b>1; f(n)是不参与递归部分的时间复杂度。
这种递归方程通常是分治算法策略时间复杂性所满足的递推关系,即一个规模为n的问题被分成规模均为n/b的a个子问题,递归地求解这a个子问题,然后通过对这a个子问题的解的综合,得到原问题的解。
1) 代入法
【分析思路】:首先要对问题的时间复杂度做出预测,然后将预测带入原来的递归方程,如果没有出现矛盾,则是可能的解,最后用数学归纳法证明。
【举 例】有如下的递归问题:T(n)=4T(n/2)+O(n),首先预测时间复杂度为O(n2),不妨设T(n)=kn2(其中k为常数),将该结果带入方程中可得:方程左边=kn2,方程右边=4k(n/2)2+O(n)=kn2+O(n),由于n2的阶高于n的阶,因而左右两边是相等的,接下来用数学归纳法进行验证即可。
2) 迭代法
【分析思路】:迭代的展开递归关系式右边,直到没有可以迭代的项为止,这时通过对关系式右边的和进行估算来估计方程的解。
【举 例】一个简单的例子:T(n)=2T(n/2)+n2,迭代过程如下:
容易知道,直到时,递归过程结束,这时计算如下:
上面的计算中,直接使用无穷等比数列的公式,不用考虑项数i的约束,可确定该算法的时间复杂度为O(n2)。
【思 考】 尝试分析递推式T(n)=2T(n/2)+n的时间复杂度。
2. 递推式是一个无穷序列幂级数的递归算法时间复杂度分析方法
形如:
T(n)=c1T(n-1)+c2T(n-2)+c3T(n-3)+...+ckT(n-k)+f(n)。其中c1,c2,...ck为常数且不等于0.
1) 母函数法(原理参见文献:陈朝斌,石建梅.运用母函数求解递推数列通项公式[J]数学教学通讯)
【分析思路】选择斐波那契数列的递归算法时间复杂度作为例子进行讨论。
对于斐波那契数列递归公式:T(n)=T(n-1)+T(n-2)。
假设F(n)为第n项的运算量。则容易得到:F(n)=F(n-1)+F(n-2),其中F(1)=F(2)=1.
构造如下的母函数:G(x)=F(1)x+F(2)x2+F(3)x3+......,推导如下:
根据上式,不难推导出下式:
G(x)-F(1)x-F(2)x2=x(G(x)-F(1)x)+x2G(x)
2)差分方程法
【分析思路】可通过差分方程的求解方法来解递归方程,然后对解进行渐近阶估计。(了解:差分方程的求解原理)
对于形如:T(n)=c1T(n-1)+c2T(n-2)+c3T(n-3)+...+ckT(n-k)+f(n)的递归方程,其中c1,c2,...ck为常数且不等于0;其对应差分方程如下
则原方程的解等于齐次差分方程的通解+非齐次差分方程特解,最后由初始条件确定通解的系数即可。