我不理解这个算法的时间复杂性

时间:2016-04-03 19:23:43

标签: algorithm performance time-complexity

在一次练习中,我发现它的复杂度为:T(n)= c + 2T(n-1)

可以给出 T(n)=c⋅2n,其复杂度为O(2 ^ n)。

有人理解了吗?

2 个答案:

答案 0 :(得分:3)

对于某个常量T(n) = c+2*T(n-1),我们有一个递归关系c>0。我们还需要边界条件,否则重现不是well-defined。我们假设T(1) = c

计算前几个值T(2)=c+2cT(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 ,这种只解决子问题的方法有一个流行且可怕的名称动态编程