求解递归关系 T(n) = √n T(√n) + n [关闭]

Posted

技术标签:

【中文标题】求解递归关系 T(n) = √n T(√n) + n [关闭]【英文标题】:Solving the recurrence relation T(n) = √n T(√n) + n [closed] 【发布时间】:2011-11-08 23:05:50 【问题描述】:

是否可以解决递归关系

T(n) = √n T(√n) + n

使用主定理?它不是形式

T(n) = a ⋅ T(n / b) + f(n)

但是这个问题是在 CLRS 第 4 章的练习中给出的。

【问题讨论】:

类似问题:math.stackexchange.com/questions/689887/… 【参考方案1】:

这是主定理无法解决的。不过可以用递归树的方法解析到O(n log log n)来解决。

这背后的直觉是注意到在树的每一层,你都在做 n 工作。顶层没有明确地工作。 √n 个子问题中的每一个确实 √n 个工作,总共有 n 个工作,等等。所以现在的问题是递归树有多深。嗯,这是在 n 变得足够小(例如,小于 2)之前你可以取 n 的平方根的次数。如果我们写

n = 2lg n

然后在每次递归调用时,n 都会取其平方根。这相当于将上面的指数减半,所以经过 k 次迭代我们就有了

n1/(2k) = 2lg n/(2k)

我们想在小于 2 时停止,给出

2lg n/(2k) = 2

lg n/(2k) = 1

lg n = 2k

lg lg n = k

所以在平方根的 lg lg n 次迭代之后,递归停止。而且,由于在每个级别递归都 O(n) 工作,总运行时间是 O(n lg lg n)。

更一般地说,正如任何反复将其输入大小减半的算法都应该让您想到“log n”一样,任何通过取平方根反复减少其输入大小的算法都应该让您想到“log log n. ”。例如,van Emde Boas 树就使用了这种递归。

有趣的是,此递归用于获得著名算法的运行时间,该算法用于确定性地解决最接近点对问题,假设计算机可以在恒定时间内取任意实数的地板。

【讨论】:

谢谢!!我确实尝试通过递归树来解决它,但完全错过了每一级成本将是常数 = n 的点! :) 其实,如果你改写 n = 2^(2^k),你也许可以使用主定理。在这种情况下,T(n) = √n T(√n) + n 变为: T(2^(2^k)) = 2^(2^k-1) T(2^(2^k-1 )) + 2^(2^k)。但是,“a”和“b”在这里不是恒定的。我想应该有办法,但现在想不到。 感谢您的精彩解释。在推导 log log n 时,我认为从 n^(1/(2^k)) = 2 开始,然后将两边都提高到 (2^k),从而得到 n = 2^(2^k ),然后变成 log log n = k 如上所述。 你所说的都是针对 T(sqrt n) 但有一个 (sqrt n) 与 T(sqrt n) 相乘。不考虑吗? T(n) = 4*T(sqrt(n)) + n 我们也可以使用上述程序来解决这个问题吗?问题链接***.com/questions/13458399/…

以上是关于求解递归关系 T(n) = √n T(√n) + n [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

递归关系:求解 T(n-1) 的大 O

求解递归关系T(n)= T(n-1)+ n

求解递归 T(n) = T(n/2) + lg n? [关闭]

使用主定理求解递归 T(n) = T(n / 2) + O(1)? [关闭]

如何求解:T(n) = T(n/2) + T(n/4) + T(n/8) + (n)

求解递归:T(n)=2T(n/2)+n/logn