用递归求解递归关系 T(n) = 2T(n/2)+1

时间:2021-03-19 13:39:45

标签: recursion time-complexity big-o

我正在尝试找到 T(n) = 2T(n/2) + 1 的大 O。我发现主定理是 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 

但是这样做对吗?不知道以前有没有看过所以很卡。

1 个答案:

答案 0 :(得分:0)

我不确定“用递归解决”是什么意思。你可以做的是展开等式。

首先,您可以将 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

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

相关问题