【问题标题】:Solving a recurrence T(n) = 2T(n/2) + sqrt(n) [closed]求解递归 T(n) = 2T(n/2) + sqrt(n) [关闭]
【发布时间】:2013-04-28 04:20:19
【问题描述】:

需要一点帮助!到目前为止,这是我使用向后替换的:

T(n) = 2T(n/2) + sqrt(n), where T(1) = 1, and n = 2^k
T(n) = 2[2T(n/4) + sqrt(n/2)] + sqrt(n) = 2^2T(n/4) + 2sqrt(n/2) + sqrt(n)
T(n) = 2^2[2T(n/8) + sqrt(n/4)] + 2sqrt(n/2) + sqrt(n)
     = 2^3T(n/8) + 2^2sqrt(n/4) + 2sqrt(n/2) + sqrt(n)

一般

T(n) = 2^kT(1) + 2^(k-1) x sqrt(2^1) + 2^(k-2) x sqrt(2^2) + ... + 2^1 x sqrt(2^(k-1)) + sqrt(2^k)

到目前为止是正确的吗?如果是的话,我不知道如何简化它并将其简化为一个通用公式。

我猜是这样的?结合术语

= 1 + 2^(k-(1/2)) + 2^(k-(2/2)) + 2^(k-(3/2)) + ... + 2^((k-1)/2) + 2^(k/2)

这就是我卡住的地方。也许是一种分解 2^k 的方法? 任何帮助都会很棒,谢谢!

【问题讨论】:

  • 如果您正在寻找大 O 解决方案,Master Theorem 可以做到这一点。
  • n 替换为2^k,在每次迭代中,您首先得到2^(k-1),然后是2^(k-2),最后是2^0。你有k 电话,klog2(n)...因此T(n) 的复杂性是O(log(n))

标签: algorithm discrete-mathematics


【解决方案1】:

你已经成功了一半。 表达式可以简化为:

【讨论】:

  • 啊哈哈,所以 n + n/sqrt(2) + n/sqrt(4) + .. + 1 = sqrt(n)*(sqrt(2n)-1)*(sqrt( 2)+1)?你知道是否有一个通用的求和公式来生成它吗?
  • @user1201359 求几何级数之和
  • 好的,我试着算出通式,谢谢!
【解决方案2】:

如果您只想要一个大 O 解决方案,那么 Master Theorem 就可以了。

如果您想要一个精确的方程式,recursion tree 很好。像这样:

右侧是每个级别的成本,很容易找到成本的一般形式,即sqrt((2^h) * n)。然后,总结一下你可以得到 T(n) 的成本。

  1. 根据Master Theorem,是case 1,所以O(n)
  2. 根据递归树,确切的形式应该是sqrt(n)*(sqrt(2n)-1)*(sqrt(2)+1),对应于大O符号。

编辑:

递归树只是所谓的backward substitution 的可视化形式。如果你总结右手边,即cost,你可以得到T(n)的广义形式。所有这些方法都可以在introduction to algorithm中找到

【讨论】:

  • 不是O(log(n))吗?
  • 我确实需要一个精确的公式,但老师希望它可以像上面那样使用反向替换来计算。我认为我走在正确的轨道上,我只需要弄清楚如何分解和简化它。
  • @ring0 为什么是 O(log(n))?根据Master Theorem,这满足情况1,所以应该是O(n)。
  • @user1201359 替换只是递归树的另一个版本,基本上它们具有相同的想法。递归树只是一种可视化的表示。您实际上可以从递归树中获得替换形式。
  • @user1201359 抱歉,缺少一个因素。查看更新。
猜你喜欢
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2012-10-17
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多