如何从 T(n) = T(n/2) + n 得到 O(n)?

How to get O(n) from T(n) = T(n/2) + n?

我知道用主定理我会得到 teta(n),但我正在尝试以其他方式解决递归问题,例如:

T(n) = T(n/2) + n
T(n) = T(n/4) + 2n
T(n) = T(n/8) + 3n
.
.
.
T(n) = T(n/2^k) + kn
k=logn -> T(1) + **nlogn**

有什么问题?

T(n)=T(n/2)+n=T(n/2^2)+n/2+n=T(n/2^3)+n/2^2+n/2+n= ... =  
=T(n/2^k)+n/2^(k-1)+n/2^(n-2)+...+n=  
=T(n/2^k)+n*(1-(1/2)^k)/(1-1/2)=  
=T(n/2^k)+2*n*(1-(1/2)^k)<=  
<=T(n/2^k)+2*n  

如果你知道 T 是一个定义为 (0,0+e) 的函数,对于一些小的 e>0,那么你可以得出 T 是 O(n) 的结论。

Foundations of Algorithms - Richard E. Neapolitan.pdf 的最后几章中,您找到了几种解决递归关系的方法。 某种方式像: 1- 递归树 2- 改变变量和微分方程

你还可以看到link

从头开始求解递归关系涉及两个步骤:

  1. 以某种方式找到答案
  2. 证明它是正确的

"Somehow find the answer part" 可能很难。通常的方法是扩展一些术语并进行推断,就像 Rodojf 在另一个答案中所做的那样,graph/table 找出并观察它,或者识别一个熟悉的模式。对于您的示例,所有这些方法都非常有效。

让我们在 table 或图形中放置几个​​点(让 C = T(1)):

 n  |  T(n)
===========
 1  |   C
 2  |   C + 2
 4  |   C + 6
 8  |   C + 14
16  |   C + 30

在我看来 T(n) = 2n - 2 + C

我们可以证明 T(2x) = 2x+1 - 2 + C 对于所有 x>= 都是正确的0 通过归纳:

  • 如果x=0,则2x+1 - 2 + C = C,所以T(2x) = 2x+1 - 2 + C, 来自table
  • 对于任何 x,T(2x) = 2x+1 - 2 + C ⇒ T(2x+1) = 2x+1 - 2 + C + 2x+1 = 2(x+1)+1 - 2 + C,通过替换

所以公式对 n=20 是正确的,这意味着它对所有 n=2x

为了涵盖 n 的所有其他值,您还应该注意在 n 和 2n 之间以及 n/2 和 n 之间总是有一些 2x,并且它们的 T(2x) 值绑定 T(n).

对于一个案例来说,这是相当多的工作...这就是为什么我们记得主定理,该定理已在 所有 与其匹配的案例中得到证明模式。