我正在尝试找到 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
但是这样做对吗?不知道以前有没有看过所以很卡。
答案 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 = 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
现在我们可以看到,只要 T(n)
是一个常量,O(n)
就在 a
中。