如何从 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) = T(n/2) + T(n/4) + T(n/8) + (n)