【发布时间】:2011-11-08 23:05:50
【问题描述】:
是否可以解决递归关系
T(n) = √n T(√n) + n
使用主定理?它不是形式
T(n) = a ⋅ T(n / b) + f(n)
但是这个问题是在 CLRS 第 4 章的练习中给出的。
【问题讨论】:
标签: math recursion complexity-theory big-o recurrence
是否可以解决递归关系
T(n) = √n T(√n) + n
使用主定理?它不是形式
T(n) = a ⋅ T(n / b) + f(n)
但是这个问题是在 CLRS 第 4 章的练习中给出的。
【问题讨论】:
标签: math recursion complexity-theory big-o recurrence
这是主定理无法解决的。不过可以用递归树的方法解析到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 树就使用了这种递归。
有趣的是,此递归用于获得著名算法的运行时间,该算法用于确定性地解决最接近点对问题,假设计算机可以在恒定时间内取任意实数的地板。
【讨论】: