【问题标题】:Solving recurrence T(n) = 2T(n/2) + Θ(1) by substitution通过替换求解递归 T(n) = 2T(n/2) + Θ(1)
【发布时间】:2026-01-23 20:40:01
【问题描述】:

所以我很确定它是 O(n)(但可能不是?),但是你如何通过替换来解决它?

如果假设 T(n)

【问题讨论】:

  • 告诉我们你为什么认为它是 O(n)
  • 实际上,也许它必须更大?因为如果你替换 O(n),你最终会得到 T(n)
  • 尝试解决两个稍微简单的问题:T(n) = 2 * T(n/2) 和 T(n) = T(n/2) + O(1)。这些问题中哪一个最像你的?你能把结果应用到你的问题上吗?

标签: math big-o recurrence


【解决方案1】:

首先,我想清楚地假设 Θ(1)=k,某个常数。

接下来,使用替换法,我们得到

 T(n)=2T(n/2)+Θ(1)
     =2T(n/2)+k
     =2{2T(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)

    【讨论】: