通过替换求解递归 T(n) = 2T(n/2) + Θ(1)
Posted
技术标签:
【中文标题】通过替换求解递归 T(n) = 2T(n/2) + Θ(1)【英文标题】:Solving recurrence T(n) = 2T(n/2) + Θ(1) by substitution 【发布时间】:2014-11-09 14:19:18 【问题描述】:所以我很确定它是 O(n)(但可能不是?),但是你如何通过替换来解决它?
如果假设 T(n)
【问题讨论】:
告诉我们你为什么认为它是 O(n) 实际上,也许它必须更大?因为如果你替换 O(n),你最终会得到 T(n) 尝试解决两个稍微简单的问题:T(n) = 2 * T(n/2) 和 T(n) = T(n/2) + O(1)。这些问题中哪一个最像你的?你能把结果应用到你的问题上吗? 【参考方案1】:首先,我想清楚地假设 Θ(1)=k,某个常数。
接下来,使用替换法,我们得到
T(n)=2T(n/2)+Θ(1)
=2T(n/2)+k
=22T(n/4)+k)+k
=4T(n/4)+3k
=...
=n.T(1)+(n-1)k
=n.k+(n-1)k
=2nk-k
=O(n).
如果你假设它是T(n) <= c * n
,你应该从 T(1) 开始并假设 T(n) 是正确的,然后继续使用 T(n+1) 来证明它是正确的T(n) 的假设。
顺便说一句,你的假设是正确的!
【讨论】:
第5行之后,泛化应该是2^m T(n/2^m) + (2^m - 1)k
。现在要生成T(1)
,我们让2^m = n
得到第6 行。【参考方案2】:
为简单起见,我们假设 O(1) 项隐藏了一些常数 c,所以递归是真的
T(n) = 2T(n/2) + c
为了简单起见,我们还假设 T(1) = c。
您正在冒险(正确)猜测
T(n)
对于一些常数 a 和 b。让我们尝试归纳地证明这一点。
对于 n = 1,我们需要 a 和 b 满足
c
对于归纳步骤,我们想要
T(n)
代入我们的猜测得到
T(n)
= an + 2b + c
请注意,如果 2b + c = b,则该表达式的左侧将是 an + b,即我们需要的上限。因此我们需要选择 a 和 b 使得
c
2b + c = c
在这里可行的一个可能选择是 a = 2c 和 b = -c,给出 T(n)
希望这会有所帮助!
【讨论】:
【参考方案3】:Master's theorem 非常适合这个问题:
比较给定的方程
T(n) = 2T(n/2) + c
用公式
T(n) = aT(n / b) + (nk logp n) 其中 a >= 1, b > 1, k >= 0 且 p 是实数
我们可以说它满足条件 a > bk 因为 a = 2, b = 2 和 k = 0 所以,T(n) = θ(nlog b a) = θ(n)
【讨论】:
以上是关于通过替换求解递归 T(n) = 2T(n/2) + Θ(1)的主要内容,如果未能解决你的问题,请参考以下文章
求解 T(n) = 2T(n/2) + log n [关闭]
如何求解递归 T(n) = 2T(n^(1/2)) + log n? [关闭]