通过替换求解递归 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? [关闭]

如何解决以下复发?

递归关系:T(n) = T(n/2) + n

使用主定理求解递归 T(n) = T(n / 2) + O(1)? [关闭]

求解递归 T(n) = T(n/2) + lg n? [关闭]