算法时间复杂度分析方法

算法时间效率分析方法主要由非递归分析法和递归式分析法两种。如下分别说明:算法

1、分析非递归算法时间效率的通用方案函数

  1. 肯定算法中做为输入规模的参数;
  2. 找出算法的基本操做(一般位于算法的最内层循环中的操做);
  3. 检查对于相同规模的不一样输入实例,基本操做的执行次数是否可能不一样,若是有,则需对最差效率、平均效率以及最优效率分别进行讨论;
  4. 创建算法基本操做的执行频度的计算表达式;
  5. 利用计算表达式的计算法则肯定问题求解时间与问题规模的增加关系。

2、分析递归算法时间效率的通用方案spa

  1. 肯定算法中做为输入规模的参数;
  2. 找出算法的基本操做;
  3. 检查对于相同规模的不一样输入实例,基本操做的执行次数是否可能不一样,若是有,则需对最差效率、平均效率以及最优效率分别进行讨论;
  4. 针对算法基本操做的执行次数,创建与输入规模有关的递推关系式及其初始条件;
  5. 求解递推式以肯定问题求解时间与问题规模的增加关系。

3、包含递归调用算法的时间复杂度分析技术总结blog

  当一个算法中包含递归调用时,其时间复杂度分析会转化成为一个递归方程所对应的递推关系式求解。因为递归方程的多样性,包含递归调用的算法时间复杂度分析方法多种多样。如下介绍两种常见形式:递归

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;其对应差分方程以下

 

则原方程的解等于齐次差分方程的通解+非齐次差分方程特解,最后由初始条件肯定通解的系数便可。

相关文章
相关标签/搜索