【问题标题】:How to get O(n) from T(n) = T(n/2) + n?如何从 T(n) = T(n/2) + n 得到 O(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

标签: algorithm recurrence


【解决方案1】:

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

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

“以某种方式找到答案部分”可能很难。通常的方法是扩展一些术语并进行推断,就像 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

      【讨论】:

        猜你喜欢
        • 2011-08-03
        • 2021-04-24
        • 2017-10-03
        • 1970-01-01
        • 2021-02-27
        • 2021-05-05
        • 2012-06-08
        • 2019-03-23
        • 2015-08-24
        相关资源
        最近更新 更多