递归树求解递归算法的时间复杂度


递归算法时间复杂度的计算方程式一个递归方程:

  

  在引入递归树之前可以考虑一个例子:

  T(n) = 2T(n/2) + n2

  迭代2次可以得:

  T(n) = n2+ 2(2T(n/4) + (n/2)2)

  还可以继续迭代,将其完全展开可得:

  T(n) = n2+ 2((n/2)2+ 2((n/22)2+ 2((n/23)2+ 2((n/24)2+…+2((n/2i)2+ 2T(n/2i + 1)))…))))  ……(1)

  而当n/2i+1== 1时,迭代结束。

  将(1)式小括号展开,可得:

  T(n) = n2+ 2(n/2)2+ 22(n/22)2+ … + 2i(n/2i)2+ 2i+1T(n/2i+1)

  这恰好是一个树形结构,由此可引出递归树法。

  图中的(a)(b)(c)(d)分别是递归树生成的第1,2,3,n步。每一节点中都将当前的自由项n2留在其中,而将两个递归项T(n/2) + T(n/2)分别摊给了他的两个子节点,如此循环。

  图中所有节点之和为:

  [1 + 1/2 + (1/2)2+ (1/2)3+ … + (1/2)i] n2= 2n2

  可知其时间复杂度为O(n2)

  

  可以得到递归树的规则为:

  (1) 每层的节点为T(n) = kT(n / m) + f(n)中的f(n)在当前的n/m下的值;

  (2) 每个节点的分支数为k;

  (3)每层的右侧标出当前层中所有节点的和。

  再举个例子:

  T(n) = T(n/3) + T(2n/3) + n

  其递归树如下图所示:

  

  可见每层的值都为n,从根到叶节点的最长路径是:

  

  因为最后递归的停止是在(2/3)kn == 1.则

      

  于是

    

  即T(n) = O(nlogn) 

  总结,利用此方法解递归算法复杂度:

  f(n) = af(n/b) + d(n)

  1.当d(n)为常数时:

  

  2.当d(n) = cn 时:

  

  3.当d(n)为其他情况时可用递归树进行分析。

  

  由第二种情况知,若采用分治法对原算法进行改进,则着重点是采用新的计算方法缩小a值。 

原文链接http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html

优质内容筛选与推荐>>
1、从大数据到认知计算,未来需要更强的计算能力
2、掏空了的心
3、倒计时,短信发送后倒计时效果js
4、使用NATAPP(基于ngrok)搭建内外网穿透代理、便利微信调试、局域网外网代理
5、数字电路与系统-逻辑函数最后的总结


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号