zoukankan      html  css  js  c++  java
  • 递归算法的时间复杂度分析

    转自地址 http://blog.csdn.net/metasearch/article/details/4428865

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

        (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)
               =  cn- 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 ,第二类与第三类之间也存在这种情况,此时公式法不适用

  • 相关阅读:
    Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
    mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
    mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)
    mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)
    Linux编程 21 shell编程(环境变量,用户变量,命令替换)
    Linux编程 20 shell编程(shell脚本创建,echo显示信息)
    mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)
    Linux编程 19 编辑器(vim 用法)
    (网页)angularjs中的interval定时执行功能(转)
    (网页)在SQL Server中为什么不建议使用Not In子查询(转)
  • 原文地址:https://www.cnblogs.com/dongxiao-yang/p/4151730.html
Copyright © 2011-2022 走看看