Algorithm 利用递推关系分析时间复杂度

Algorithm 利用递推关系分析时间复杂度,algorithm,recursion,time-complexity,complexity-theory,recurrence,Algorithm,Recursion,Time Complexity,Complexity Theory,Recurrence,这里没有复杂性分析 我试图用下面给定的递归关系来计算递归算法的时间复杂度- T(n) = n + 4T(n/2) 我知道有三种方法可以解决这个问题,但我试图通过将树的每一级所完成的工作量相加来解决这个问题 当我画递归树时,我得到如下结构 n | n work / \ 4T(n/2) 4T(n/2)

这里没有复杂性分析

我试图用下面给定的递归关系来计算递归算法的时间复杂度-

T(n) = n + 4T(n/2)
我知道有三种方法可以解决这个问题,但我试图通过将树的每一级所完成的工作量相加来解决这个问题

当我画递归树时,我得到如下结构

                        n                          | n work
                     /     \
              4T(n/2)        4T(n/2)               | 2n work
             /     \         /        \
         4T(n/2)   4T(n/2)   4T(n/2)  4T(n/2)      | 4n work

          .          .          .       .
          .          .          .       .
     Theta(1) Theta(1) Theta(1).......Theta(1)     | ???
我一直在计算总和(n+2n+4n+8n…) 因为

  • 我想不出最后一学期是什么
  • 即使我这样做了,我意识到这是一个比率r>1的几何级数,所以我不能真正计算和
有人能帮我理解怎么做吗

编辑
注意:我从这里发现了问题——有一个解决方案,但我没有完全理解它,我的表达式似乎至少是正确的,但我无法理解最后一个术语是如何得到的

从根到叶,树的每一层都有
n
两层,因此树有
log2(n)

那么总数将是:

n + 2n + ... + 2 ^ (log2(n)) * n
= n * (1 + 2 + ... + 2 ^ log2(n))
= n * (2 ^ (log2(n) + 1) - 1)
= n * (2 * n - 1)
= 2 * n ^ 2 - n
= O(n ^ 2)

上述所有分析均假设n为2的幂,但在大多数情况下,该假设并不重要。

元素a、ar、ar^2、…、ar^n-1的几何级数求和公式如下所示:

S(n) = a((r^n)-1)/(r-1)  // in case of r>1
深度为i的节点的子问题大小为n/(2^i)。因此,当
n/(2^i)=1
时,子问题达到大小1,或者当i=log2n时,子问题达到大小1

每个级别的节点数是上面级别的4倍,因此深度i处的节点数为4^i

因为子问题的大小从根开始的每一级都减少了2倍,所以深度i处的每个节点,对于i=0,1,2,…,log2n-1,成本为c*n/(2^i)。乘以,我们看到深度i处所有节点的总成本,对于i=0,1,…,log2n-1是
4^i*c*n/(2^i)
=
(2^i)*c*n

深度log2n处的最后一级有4^(log2n)=n^(log24)=(n^2)个元素,每个元素的贡献成本为T(1),即θ(n^2)

把所有层面的成本加起来

T(n)=cn+2cn+4cn+…+cn*(2^log2n-1)+θ(n^2)

=cn*[(2^log2n)-1]/(2-1)+θ(n^2)
=cn*[(n^log22)-1]+θ(n^2)
=cn*(n-1)+θ(n^2)
=cn^2-cn+θ(n^2)
=θ(n^2)。//或O(n^2)表示上界。

因此,递归树的复杂性为θ(n^2)。你可以很好地证明它的复杂性是O(n^2)。

你也可以很好地对此有一个更严格的界,比如θ(n^2)。请检查我的答案,它总是以O(n^2)作为上限。@shekharsuman这已经是θ(n^2),但我没有注意到它。但当然,你做了一些更仔细的分析,这适用于所有情况:-)@ZiyaoWei-这就是为什么我在你的评论部分提到了这一点,以便你可以在你的答案中进行编辑,如果你愿意的话。然后我会向上投票。您好,我正在浏览这些概念,稍后我会回到这个答案,看看哪一个对我更有意义。我明白这两个答案都在谈论什么,但我还没有弄清楚细节的确切含义。。。我一定会投票接受。请放心:)1。每个问题生成4个子问题,但在递归树中,每个问题只绘制2个子问题(每个节点2个子问题)。2.一个节点应该是“未展开的”(形式为“T(…)”),在这种情况下,它没有子节点(对应于方程的LHS),或者是“展开的”(形式为“c*…”),其中它应该有4个子节点(对应于RHS)。3.此外,第三行中出现的每个“n/2”都应替换为“n/4”。很好,除了“每个级别的节点数是上面级别的2倍,因此深度i的节点数是2^i”应该是“每个级别的节点数是上面级别的4倍,因此深度i的节点数是4^i”。@j_random_hacker-谢谢,我改正了。在写答案时,这是一个打字错误。:)
 = cn*[(2^log<sub>2</sub>n)-1]/(2-1) + θ(n^2)

 = cn*[(n^log<sub>2</sub>2)-1] + θ(n^2)

 = cn*(n-1)+ θ(n^2)

 = cn^2 - cn + θ(n^2)

 = θ(n^2).    // OR    O(n^2) for an upper bound.