求递归算法时间复杂度:递归树

求递归算法时间复杂度:递归树递归算法时间复杂度的计算方程式一个递归方程 在引入递归树之前可以考虑一个例子 T n 2T n 2 n2 迭代 2 次可以得 T n n2 nbsp 2 2T n 4 n 2 nbsp 2 还可以继续迭代 将其完全展开可得 T n n2 nbsp 2 n 2 nbsp 2 nbsp 2 n 22 2 nbsp 2 n 23

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

  求递归算法时间复杂度:递归树

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

  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值。  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218831.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:22
下一篇 2026年3月17日 下午11:23


相关推荐

  • fisher最优分割法_a0裁切三次

    fisher最优分割法_a0裁切三次给定一个无向图 G=(V,E),每个顶点都有一个标号,它是一个 [0,231−1] 内的整数。不同的顶点可能会有相同的标号。对每条边 (u,v),我们定义其费用 cost(u,v) 为 u 的标号与 v 的标号的异或值。现在我们知道一些顶点的标号。你需要确定余下顶点的标号使得所有边的费用和尽可能小。输入格式第一行有两个整数 N,M,N 是图的点数,M 是图的边数。接下来有 M 行,每行有两个整数 u,v,代表一条连接 u,v 的边。接下来有一个整数 K,代表已知标号的顶点个数。接下来的 K

    2022年8月11日
    4
  • 【结合实例】信息增益的计算

    【结合实例】信息增益的计算参考文章 https www cnblogs com qcloud1001 p 6735352 html 信息增益原理介绍介绍信息增益之前 首先需要介绍一下熵的概念 这是一个物理学概念 表示 一个系统的混乱程度 系统的不确定性越高 熵就越大 假设集合中的变量 X x1 x2 xn 它对应在集合的概率分别是 P p1 p2 pn 那么这个集合的熵表示为

    2026年3月19日
    2
  • java调用python脚本 并发_Java调用Python脚本

    java调用python脚本 并发_Java调用Python脚本今天遇到 Java 调用一个 Python 脚本的问题 纠结了大半天 遇到各种问题 网上搜索的大部分都是用 jython 但是我想要调用的 python 脚本里有 importurllib 这个 urllib 也不是什么第三方扩展库 在 python 的安装 path 下的 Lib 下就有 在 python 命令行下肯定是能找到的 但是用 jython 的话 sys 的 path 里面就太少了 示例代码 Java 代码 importorg

    2026年3月19日
    2
  • C#之线程ParameterizedThreadStart[通俗易懂]

    C#之线程ParameterizedThreadStart[通俗易懂]ParameterizedThreadStartclassProgram{staticvoidMain(string[]args){Workwork=newWork();//两种实例化委托的方法;//ParameterizedThreadStartParameterizedThreadStartDelegate=newParam…

    2022年7月15日
    15
  • Ventoy 制作U盘启动盘 使用教程

    Ventoy 制作U盘启动盘 使用教程Ventoy 制作 U 盘启动盘

    2026年3月20日
    2
  • py2exe用法_py import

    py2exe用法_py import使用pyinstaller,真是受够了,各种bug,各种莫名其妙的情况,也是够了使用py2exe,学习的时候麻烦,但是打包时候真的太方便了安装py2exe,网址http://www.py2exe.org/选择对应的版本下载;撰写setup.py文件`#–coding:utf-8–importpy2exefromdistutils.coreimportsetupsetu

    2025年10月21日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号