【问题标题】:Recursion tree and substitution method递归树和替换方法
【发布时间】:2011-08-11 05:14:49
【问题描述】:

我有这个练习:

“使用递归树确定递归 T(n)=T(n/2)+n^2 的良好渐近上界。使用替换方法来验证您的答案”

我已经做了这个递归树

我假设 k -> 无穷大(在我的书中,当 T 中的输入为 1 时,他们经常停止重复,但当我没有其他信息时,我认为情况并非如此)。

我的结论是:

当我使用替换方法时,我假设 T(n)=O(n^2)

然后完成以下步骤:

当 n>0 和 c>0 时,我看到以下对于 c 的某些选择是正确的

因此T(n)

我的问题是:“这是正确的做法吗?”

【问题讨论】:

    标签: algorithm recursion performance


    【解决方案1】:

    首先,正如菲利普所说,您的递归树是错误的。它最终并没有影响复杂性,但是你弄错了常量。

    T(n) becomes
    n^2 + T(n/2) becomes
    n^2 + n^2/4 + T(n/4) becomes
    ...
    n^2(1 + 1/4 + 1/16 + ...)
    

    停在一个与停在无穷大主要是品味问题,选择更方便的东西。在这种情况下,我会和你一样使用无穷和,因为这样我们就可以使用几何级数公式来很好地猜测T(n) <= (4/3)n^2


    唯一让我有点困扰的是你的证明最终倾向于非正式的。在非正式的证明中很容易迷失方向,所以如果我必须给你的作业评分,我会更愿意使用传统的归纳证明,如下所示:

    要证明的陈述

    We wish to prove that T(n) <= (4/3)*n^2, for n >= 1
    

    cn0 的具体值使证明更可信,所以如果可以的话,把它们放进去。通常,您需要运行一次证明才能实际找到值,然后返回并将它们放入,就好像您一开始就已经知道它们一样:) 在这种情况下,我希望我的 4/3 猜测来自递归树结果是正确的。

    归纳证明:

    基本情况(n = 1):

    T(1) = 1 
    

    (你没有明确 T(1) 的值,但我想这应该在原始练习中)

    T(1)  = 1
         <= 4/3
          = (4/3)*1^2
    T(1) <= (4/3)*1^2
    

    如我们所愿。

    归纳案例(n > 1):

    (这里我们假设所有 n' T(n') <= 4/3*(n')^2)

    我们知道

    T(n) = n^2 + T(n/2)
    

    通过归纳假设:

    T(n) <= n^2 + (4/3)(n/2)^2
    

    做一些代数:

    T(n) <= n^2 + (4/3)(n/2)^2
          = n^2 + (1/3)n^2
          = (4/3)n^2
    T(n) <= (4/3)*n^2
    

    如我们所愿。


    可能看起来很无聊,但现在我可以确定我得到了正确的答案!

    【讨论】:

      【解决方案2】:

      你的递归树是错误的。它应该是这样的:

      n^2
      |
      (n/2)^2
      |
      (n/4)^2
      |
      ...
      |
      (n/2^k)^2

      一旦 T 达到 1,您就可以安全地停止,因为您通常计算离散的“步数”,而没有“0.34 步数”这样的东西。

      由于您在每次迭代中都将n 除以2,因此k 在这里等于log2(n)

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 2015-03-02
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-28
        相关资源
        最近更新 更多