【问题标题】:Solving the recurrence T(n) = 2T(sqrt(n))求解递归 T(n) = 2T(sqrt(n))
【发布时间】:2013-08-08 12:45:27
【问题描述】:

我想解决以下递归关系:

T(n) = 2T(√n);

我猜是T(n) = O(log log n),但我不确定如何证明这一点。我将如何证明这种重复解决了O(log log n)

【问题讨论】:

  • @AaronMcDaid 这将是“应用于数字 n 的一个参数的函数 T”。没有特殊的“T 表示法”。
  • @n.m.,我不记得曾经参加过这个帖子。你为什么在这个问题中给我发消息?你打错字了?
  • @AaronMcDaid 您或与您的用户名相似的人提出了一个问题,询问“T(n) 表示法”。它现在被删除了。可能有错字(我确实是手动输入了昵称),但不太可能,而且一开始有多少类似的用户名?
  • @AaronMcDaid 它现在在 Google 缓存中 webcache.googleusercontent.com/search?q=cache:http://… 但我不知道多久。
  • @AaronMcDaid 哇,显然该线程已有两年历史了。刚刚有人复活了。如果您当时删除了评论,您可能会忘记它;但那我今天怎么能看到呢?这是矩阵中的故障...

标签: algorithm math big-o recurrence


【解决方案1】:

一个想法是通过引入一个新变量 k 来简化递归,使得 2k = n。然后,递归关系解决了

T(2k) = 2T(2k/2)

如果你让 S(k) = T(2k),你得到递归

S(k) = 2S(k / 2)

注意这等价于

S(k) = 2S(k / 2) + O(1)

因为 0 = O(1)。因此,根据主定理,我们得到 S(k) = Θ(k),因为我们有 a = 2、b = 2、d = 0 和 logb a > d。

由于 S(k) = Θ(k) 和 S(k) = T(2k) = T(n),我们得到 T(n) = Θ(k)。由于我们选择了 2k = n,这意味着 k = log n,所以 T(n) = Θ(log n)。这意味着您对 O(log log n) 的初始猜测是不正确的,并且运行时只是对数,而不是双对数。但是,如果只进行一次递归调用,那么运行时将是 O(log log n) 是对的。

希望这会有所帮助!

【讨论】:

  • 为什么 S(k) = T(2^k)?域不重合,不应该是S(k') = T(2^k)吗?
  • 您能详细说明一下您对域名不一致的含义吗?我不明白你在问什么。
  • 我的意思是你怎么能用 S(k) 代替 T(2^k)?如果我们将它们视为 k 和 2^k 的函数,则 T 的域是 1,2,4,8,... 而 S 是 1,2,3,4,...
  • @Ritwik 你说的完全正确,一般来说,你不能进行这样的替换。您遇到的大多数重复都有一个很好的属性,即它们是单调递增的。如果递归是单调递增的,并且您可以在各个不错的点(2 的幂、3 的幂等)为其值提供一个界限,那么您可以渐近地限制整个递归。这就是我们在这里所做的。这是一个常见的技巧,你通常不会看到任何人写出“它是单调的”作为理由,但值得看看为什么这是真的。
  • @dev 我们想要选择一个满足 S(x) = T(2^(k/2)) 的 x。由于 S(x) = T(2^x),这意味着我们要选择 S(k / 2) = T(2^(k/2))。如果我们选择 S(sqrt k),我们会得到 T(2^(sqrt k)),这与我们需要的不匹配。
【解决方案2】:

您可以通过展开递归轻松解决此问题:

现在循环将在T(1) = a 时结束,您可以找到合适的a。当a = 01 没有意义但是当a=2 你会得到:

k 代入第一个等式的最新部分,您将得到O(log(n)) 的复杂度。

在此处查看其他类似的递归:

【讨论】:

  • 感谢您如此清晰的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2012-10-17
相关资源
最近更新 更多