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

Posted

技术标签:

【中文标题】如何从 T(n) = T(n/2) + n 得到 O(n)?【英文标题】:How to get O(n) from T(n) = T(n/2) + n? 【发布时间】:2020-05-01 04:36:33 【问题描述】:

我知道使用主定理我会得到 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/4) + 2n 行错误;您添加了n,但您应该添加n/2,因为您替换了T(n/2) = T(n/4) + n/2 如果 k 在 n 中是对数绑定的,那么想想 T 的输入参数如何绑定在 n 中 我认为这个问题更适合 cs.stackexchange 【参考方案1】:

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

    不知何故找到答案 证明它是正确的

“以某种方式找到答案部分”可能很难。通常的方法是扩展一些术语并进行推断,就像 Rodojf 在另一个答案中所做的那样,将其绘制/表格并观察它,或者识别一个熟悉的模式。所有这些方法都非常适合您的示例。

让我们在表格或图表中放置几个​​点(让 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,来自表格 对于任何 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)。

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

【讨论】:

【参考方案2】:
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)。

【讨论】:

【参考方案3】:

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

你也可以看到link

【讨论】:

以上是关于如何从 T(n) = T(n/2) + n 得到 O(n)?的主要内容,如果未能解决你的问题,请参考以下文章

递归:用树方法得到T(n / 4)+ T(n / 2)+ n ^ 2

通过替换求解递归 T(n) = 2T(n/2) + Θ(1)

求解递归:T(n)=2T(n/2)+n/logn

如何求解:T(n) = T(n/2) + T(n/4) + T(n/8) + (n)

关系的时间复杂度 T(n) = T(n-1) + T(n/2) + n

如何计算该函数的增长率:T(n)= 2T(n ^(1/2))+ 2(n ^(1/2))