递归算法的时间复杂度分析

原创 2009年08月09日 21:32:00

在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:

    (1)代入法(Substitution Method)
   
    代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。
   
    (2)迭代法(Iteration Method)
   
    迭代法的基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。
   
    (3)套用公式法(Master Method)
   
    这个方法针对形如“T(n) = aT(n/b) + f(n)”的递归方程。这种递归方程是分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子问题,递归地求解这a个子 问题,然后通过对这a个子间题的解的综合,得到原问题的解。
   
    (4)差分方程法(Difference Formula Method)

    可以将某些递归方程看成差分方程,通过解差分方程的方法来解递归方程,然后对解作出渐近阶估计。
   
    下面就以上方法给出一些例子说明。
       
    一、代入法
   
    大整数乘法计算时间的递归方程为:T(n) = 4T(n/2) + O(n),其中T(1) = O(1),我们猜测一个解T(n) = O(n2 ),根据符号O的定义,对n>n0,有T(n) < cn2 - eO(2n)(注意,这里减去O(2n),因其是低阶项,不会影响到n足够大时的渐近性),把这个解代入递归方程,得到:
   
    T(n) =  4T(n/2) + O(n)
           ≤ 4c(n/2)2 - eO(2n/2)) + O(n)
           =  cn2 - eO(n) + O(n)
           ≤ cn2
    
    其中,c为正常数,e取1,上式符合 T(n)≤cn2 的定义,则可认为O(n2 )是T(n)的一个解,再用数学归纳法加以证明。
   
    二、迭代法

    某算法的计算时间为:T(n) = 3T(n/4) + O(n),其中T(1) = O(1),迭代两次可将右端展开为:
   
    T(n) = 3T(n/4) + O(n)
         = O(n) + 3( O(n/4) + 3T(n/42 ) )
         = O(n) + 3( O(n/4) + 3( O(n/42 ) + 3T(n/43 ) ) )
        
    从上式可以看出,这是一个递归方程,我们可以写出迭代i次后的方程:
   
    T(n) = O(n) + 3( O(n/4) + 3( O(n/42 ) + ... + 3( n/4i + 3T(n/4i+1 ) ) ) )
   
    当n/4i+1 =1时,T(n/4i+1 )=1,则
   
    T(n) = n + (3/4) + (32 /42 )n + ... + (3i /4i )n + (3i+1 )T(1)
         < 4n + 3i+1
        
    而由n/4i+1 =1可知,i<log4 n,从而
   
    3i+1 ≤ 3log4 n+1 = 3log3 n*log4 3 +1 = 3nlog4 3
   
    代入得:
   
    T(n) < 4n + 3nlog4 3,即T(n) = O(n)。
   
    三、套用公式法
   
    这个方法为估计形如:

  T(n) = aT(n/b) + f(n)

  其中,a≥1和b≥1,均为常数,f(n)是一个确定的正函数。在f(n)的三类情况下,我们有T(n)的渐近估计式:

    1.若对于某常数ε>0,有f(n) = O(nlogb a-ε ),则T(n) = O(nlogb a )
   
    2.若f(n) = O(nlogb a ),则T(n) = O(nlogb a *logn)
   
    3.若f(n) = O(nlogb a+ε ),且对于某常数c>1和所有充分大的正整数n,有af(n/b)≤cf(n),则T(n)=O(f(n))。
   
    设T(n) = 4T(n/2) + n,则a = 4,b = 2,f(n) = n,计算得出nlogb a = nlog2 4 = n2 ,而f(n) = n = O(n2-ε ),此时ε= 1,根据第1种情况,我们得到T(n) = O(n2 )。
    
    这里涉及的三类情况,都是拿f(n)与nlogb a 作比较,而递归方程解的渐近阶由这两个函数中的较大者决定。在第一类情况下,函数nlogb a 较大,则T(n)=O(nlogb a );在第三类情况下,函数f(n)较大,则T(n)=O(f (n));在第二类情况下,两个函数一样大,则T(n)=O(nlogb a *logn),即以n的对数作为因子乘上f(n)与T(n)的同阶。
    
    但上述三类情况并没有覆盖所有可能的f(n)。在第一类情况和第二类情况之间有一个间隙:f(n)小于但不是多项式地小于nlogb a ,第二类与第三类之间也存在这种情况,此时公式法不适用。

递归函数时间复杂度分析

递归函数时间复杂度分析-----------------------(1) 递归执行过程
  • budapest
  • budapest
  • 2011年04月27日 21:41
  • 45836

算法导论------递归算法的时间复杂度求解

1.算法设计与分析概述  在总结递归算法的时间复杂度分析之前,应该明确几组概念。   算法仅仅是求解问题的解决方案,这个解决方案本身并不是问题的答案,而是能获得答案的指令序列。只有通过执行算法才可以...
  • so_geili
  • so_geili
  • 2016年12月04日 19:31
  • 9891

递归算法的时间复杂度分析

递归算法的时间复杂度分析 在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而...
  • d2457638978
  • d2457638978
  • 2015年07月19日 21:57
  • 4233

手把手教你:分析递归算法的时间复杂度

原作者地址:http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html  递归算法时间复杂度的计算方程式一个递归方程: ...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2014年09月25日 00:39
  • 1195

递归算法的时间复杂度终结篇

原文 在算法的分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化成为一个递归方程的求解。而对递归方程的求解,方法多种多样,不一而足。本文主要介绍目前主流的方法:代入法,迭代法,公式...
  • zyf_2014
  • zyf_2014
  • 2016年09月29日 21:15
  • 678

时间复杂度&空间复杂度分析

时间复杂度:   一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),进而分析f(n)随n的变化情况并确定T(n)的数量级。这里用"O"来表示数量级,给出算法的时间复杂度。    ...
  • LF_2016
  • LF_2016
  • 2016年09月06日 20:25
  • 9451

递归与循环相比时间优势的真正来源

以前在上课中有个老师曾提到过,有过一个公司的笔试题中要求大家把一个1~n的累加用递归的方式写出代码。当时老师只是简单的说了递归很多时候都比循环写起来更简单,而且递归也比循环更考验思维。    然后,...
  • ccutyear
  • ccutyear
  • 2016年10月14日 21:25
  • 721

递归程序的时间复杂度计算

递归程序的时间复杂度计算
  • LOVE_CODE_LOVE_LIFE
  • LOVE_CODE_LOVE_LIFE
  • 2016年11月12日 19:19
  • 824

递归算法复杂度的求法

算法导论公开课第二课里给出了三种方法,求解T(n) = aT(n/b) + f(n) 第一种是观察a和b的数量关系,猜测最后的结果。例如T(n) = 4T(n/2),那么T(n)最后很可能是Θ(n^2...
  • Sad_Sugar
  • Sad_Sugar
  • 2015年10月23日 22:47
  • 689

递归的运行时间,及Fibonacci的递归算法复杂度

问了个面过boss面的版友,没回我,我还是挺想知道我做的对不对的。 最后一道题,是不是a=0,就是a-1?a1-a2我loop(a2) a1=0; a2=0;但是我没加判断。可能 就不对了。其他题我感...
  • u013176681
  • u013176681
  • 2014年09月17日 22:30
  • 1241
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递归算法的时间复杂度分析
举报原因:
原因补充:

(最多只允许输入30个字)