求递归算法时间复杂度:递归树 原文:求递归算法时间复杂度:递归树    另外见地址2

  

另外见地址2

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

  求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

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

  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)

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

 求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

  图中的(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

  其递归树如下图所示:

  求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

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

  求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

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

  求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2    

  于是

  求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2  

  即T(n) = O(nlogn) 

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

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

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

  求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

  2.当d(n) = cn 时:

   求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

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

  

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

  • 相关阅读:
    开发者必看!探秘阿里云Hi购季开发者分会场:海量学习资源0元起!
    表格存储TableStore2.0重磅发布,提供更强大数据管理能力
    配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景
    利用栈将中缀表达式转换为后缀表达式并进行计算
    利用栈将中缀表达式转换为后缀表达式并进行计算
    Matlab学习点滴
    Matlab学习点滴
    Matlab学习点滴
    栈的基本应用_将字符串逆序输出
    栈的基本应用_将字符串逆序输出
  • 原文地址:https://www.cnblogs.com/chhuach2005/p/3627012.html
  •   

    另外见地址2

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

      求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

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

      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)

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

     求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

      图中的(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

      其递归树如下图所示:

      求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

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

      求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

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

      求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2    

      于是

      求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2  

      即T(n) = O(nlogn) 

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

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

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

      求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

      2.当d(n) = cn 时:

       求递归算法时间复杂度:递归树
原文:求递归算法时间复杂度:递归树
  
另外见地址2

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

      

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