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

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

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

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

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

  • 相关阅读:
    tomcat 服务器的几个重要监听 方法 与 使用
    webSocket 前端 js 加入 心跳机制 的基本写法
    Palinwords (处理回文串)
    Anti-Rhyme Pairs (求最长公共前缀)
    Extend to Palindrome (顺序Hash和逆序Hash处理回文)
    Milk Patterns (hash + 二分)
    次小生成树
    Borg Maze (BFS预处理+最小生成树)
    P1126 机器人搬重物
    P1141 01迷宫 (记忆化搜索)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3078548.html
Copyright © 2011-2022 走看看