是否可能使用主定理(Master Theorem)解决递归关系式
T(n) = √n T(√n) + n
?它不是形如
T(n) = a ⋅ T(n / b) + f(n)
但这个问题在CLRS第4章的练习中给出。
是否可能使用主定理(Master Theorem)解决递归关系式
T(n) = √n T(√n) + n
?它不是形如
T(n) = a ⋅ T(n / b) + f(n)
但这个问题在CLRS第4章的练习中给出。
这个问题不能通过主定理来解决。但是,可以使用递归树方法来解决到O(n log log n)。
其背后的直觉是注意到在树的每个层级上,都需要n个单位的工作量。顶层显式地执行n个单位的工作。每个√n子问题执行√n工作,总共共同完成n个单位的工作,以此类推。那么现在的问题就是递归树有多深。好吧,这是您可以对n进行平方根多少次,直到n变得足够小(比如小于2)的次数。如果我们写成
n = 2lg n
那么在每次递归调用中,n将会被取其平方根。这相当于将上面的指数除以2,因此经过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 log log n)。
更一般地说,就像任何反复将输入大小减半的算法应该让您想到“log n”一样,任何通过反复取平方根来降低输入大小的算法都应该让您想到“log log n”。例如,van Emde Boas树使用这种递归关系。
有趣的是,这种递归关系用于获得一个著名算法的运行时间,该算法确定性地解决最近点对问题,假设计算机可以在常数时间内对任意实数取下整。