【问题标题】: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 = 0 或a = 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) 中。