在一次练习中,我发现它的复杂度为:T(n)= c + 2T(n-1)
可以给出 T(n)=c⋅2n,其复杂度为O(2 ^ n)。
有人理解了吗?
答案 0 :(得分:3)
对于某个常量T(n) = c+2*T(n-1)
,我们有一个递归关系c>0
。我们还需要边界条件,否则重现不是well-defined。我们假设T(1) = c
。
计算前几个值T(2)=c+2c
,T(3)=c+2c+4c
,我们很想推测T(n) = c * (2^n-1)
。
让我们通过n
的归纳来证明这一点。对于基本情况,当n=0
时,我们有T(1)=c*(2^1-1)=c*1=c
即可。
现在假设所有T(k) = c*(2^k-1)
都为k<=n
。对于归纳步骤,我们计算T(n+1) = c+2*T(n) = c + 2*(c * (2^n-1)) = c + c * 2^{n+1} - 2*c = c * 2^{n+1}-c = c*(2^{n+1}-1)
。这证明了这一说法。
渐渐地我们有T(n) = O(2^n)
。
答案 1 :(得分:3)
@ blazs的答案似乎是正确的。如果这有助于您理解,那就太棒了。以下是像我这样的视觉学习者的答案......
您提供的重复是:T(n) = c + 2T(n−1)
因此,在重复树的每个节点上,您都会执行常量工作c
。鉴于您在每个节点上所做的工作是不变的,如果您可以找到树中节点总数的上限,您就会发现复杂性!
根据您的递归,您有效地将大小 n 的问题解决为两个大小 n - 1 的问题。因此,在每个级别,树实际上都会增长到前一级别的最大值的两倍。它是一个完整的二叉树,深度为 n 。 2 完整二叉树中的节点总数由简单公式(2 n - 1 - 1)给出。
将它乘以2,得出节点数与2 n - 2成比例。因此,重复表示的复杂度为= O(2 ñ) 强>
一些有用的要点:
1。在递归树的方法中,算法的复杂性等于在树的每个级别完成的工作的总和。
2。高度为simple formula about the number of nodes in a complete binary tree 。
3。 Math StackExchange上给出了summation of powers of two in binary的漂亮解释。
4。通过解决两个大小为n-1的问题,你可以看到如何解决大小为n的问题。而且因为你多次解决每个子问题,你最终会出现指数复杂性。如果你只解决一次n-1大小的问题,然后将其缓存以备将来查找,会发生什么?从O(2 n )到O(n),你可以大大降低这个问题的复杂性!这种缓存称为 Memoization ,这种只解决子问题的方法有一个流行且可怕的名称动态编程。