【问题标题】:Solving the recurrence relation T(n) = 2T(n/2)+1 with recursion用递归求解递归关系 T(n) = 2T(n/2)+1
【发布时间】:2021-03-19 13:39:45
【问题描述】:

我正在寻找T(n) = 2T(n/2) + 1 的大O。我发现 Master Theorem 是 O(n),但我正在尝试通过递归解决它并陷入困境。

我的解决过程是

T(n) = 2T(n/2) + 1 <= c * n
(we know that T(n/2) <= c * n/2) 
2T(n/2) + 1 <= 2 * c * n/2 +1 <= c * n
Now I get that 1 <= 0.
I thought about saying that 
T(n/2) <= c/2 * n/2 

但是这样做是否正确?我不知道我以前是否看过它,所以我很困惑。

【问题讨论】:

    标签: recursion time-complexity big-o


    【解决方案1】:

    我不确定您所说的“用递归解决它”是什么意思。您可以做的是展开方程式。

    首先您可以将n 视为2 的幂:n = 2^k
    然后你可以将你的递归方程改写为T(2^k) = 2T(2^(k-1)) + 1

    现在很容易展开:

    T(2^k) = 2 T(2^(k-1)) + 1
           = 2 (T(2^(k-2) + 1) + 1
           = 2 (2 (T(2^(k-3) + 1) + 1) + 1
           = 2 (2 (2 (T(2^(k-4) + 1) + 1) + 1) + 1
           = ... 
    

    这会下降到k = 0 并达到基本情况T(1) = a。在大多数情况下,人们使用a = 0a = 1 进行练习,但它可以是任何东西。

    如果我们现在去掉括号,等式如下所示:

    T(n) = 2^k * a + 2^k + 2^(k-1) + 2^(k-2) + ... + 2^1 + 2^0
    

    从一开始我们就知道2^k = n 并且我们知道 2^k + ... + 2 + 1 = 2^(k+1) -1。将此视为仅由 1 组成的二进制数,例如111 = 1000 - 1.

    所以这简化为

    T(n) = 2^k * a + 2^(k+1) - 1 
         = 2^k * a + 2 * 2^k - 1 
         = n * a + 2 * n - 1 
         = n * (2 + a) - 1
    

    现在只要a 是一个常数,就可以看到T(n)O(n) 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 2013-08-08
      • 2019-04-15
      • 2017-12-22
      • 2014-11-09
      相关资源
      最近更新 更多