【问题标题】:Recurrence Relation T(n) = T(3/4 * n) + O(1)递归关系 T(n) = T(3/4 * n) + O(1)
【发布时间】:2010-12-05 18:23:22
【问题描述】:

我正在计算递归关系

T(n) = T(3/4 * n) + O(1)

它是O(log(n)),但我事先被告知解决方案是O(n)。我找不到哪里出错了——这看起来就像二分搜索的递归关系。有什么建议吗?

【问题讨论】:

  • 或者可能,我预先给出的答案是错误的,只是想找出哪个。

标签: recursion complexity-theory recurrence


【解决方案1】:

T(n) = T(3/4 * n) + O(1) ......(1) 在上面的等式中。 T(3/4 * n) 是未知项,如果你问这个递归的解决方案,那么我想说我们可以解决这个方程。使用替代方法。 在此我们必须从主方程中找出 T(3n/4) 的值。并在等式中替换。递归地。因为这种递归取决于递归。 n=3n/4 T(3n/4)=T((3/4)^2 * n)+ c .............(2) 符号 O 由常数 c 代替。 现在替换 (1) 中的 T(3n/4) T(n)= T((3/4)^2 * n) +2c ....................(3) 现在将 n=((3/4)^2 * n) 放入 (1) T((3/4)^2 * n)=T((3/4)^3 * n)+c 代替 T(n)= T((3/4)^3 * n)+3c ....................(4)

在第 k 步 eq 之后。将会 T(n)=T((3/4)^k * n)+kc ......(5) 在这一步 n 将是 2 或 1(输入大小) (3/4)^k * n= 1 n=(4/3)^k 通过在两边取日志。 对数(n)=k*对数(4/3) k=log(n) ...... 在等式中放置值。 (5) T(n)=T(1)+log(n) * c ...................(6) T(n)= O(log n)

【讨论】:

    【解决方案2】:

    尝试将T(n) = c*nT(n) = c * log n 代入方程并求解。这两个方程之一将是可解的。

    您还可以通过评估不同 n 值的函数来检查您的答案。

    -- Define T in your preferred language
    t n | n <= 1 = 1 | otherwise = t (3/4 * n) + 1
    
    -- If it's O(log n), then T(n)/log(n) should be asymptotically constant
    -- If it's O(n), then T(n)/n should be asymptotically constant
    check1 n = t n / log n
    check2 n = t n / n
    
    print [check1 1e10, check1 1e11, check1 1e12, check1 1e13]
    print [check2 1e10, check2 1e11, check2 1e12, check2 1e13]
    

    其中一个将收敛到一个小的正数,另一个将趋于零或无穷大。

    【讨论】:

      【解决方案3】:

      给出的答案没有显示解决这种重复的正确方法。你的情况很容易用Masters theorem 解决,在你的情况下a=1b=4/3。这意味着c = logb(a) = 0

      因为您的f(n) 是一个常数,所以您属于第二种情况,其中k=0。所以解决方案是,其中c = 0k = 0。这意味着:


      O(log(n)) 是正确答案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-15
        • 2017-12-22
        • 1970-01-01
        • 2014-05-02
        • 1970-01-01
        • 2015-08-29
        • 2021-06-01
        • 2012-06-08
        相关资源
        最近更新 更多