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.