任何人都可以帮我找到以下递归函数的时间复杂度吗?我递归地写了T(n^(1/2)), T(n^(1/4)),... T(1)
,但是到达任何递归的运行时的一般方法是什么?
T(n) = n^(1/2) (T(n^(1/2)) + n
答案 0 :(得分:0)
这里的其他答案给出了一个很好的代数直觉和解决这个问题的方法。这是另一种在递归树方面看到这种情况的方法。
当你有一个递归关系时,绘制递归树的图片以查看它的外观通常很有用。这里,递归树看起来像这样:
+-------+
| n |
+-------+
/ / | \ \
+-------+ +-------+ +-------+ +-------+
|n^(1/2)| |n^(1/2)| |n^(1/2)| ... |n^(1/2)|
+-------+ +-------+ +-------+ +-------+
... ... | ...
/ / | \ \
+-------+ +-------+ +-------+ +-------+
|n^(1/4)| |n^(1/4)| |n^(1/4)| ... |n^(1/4)|
+-------+ +-------+ +-------+ +-------+
让我们考虑一下这棵树。顶级包含一个O(n)工作的调用。在下一级,有√n递归调用,每个调用都是√n工作。这总共是O(n)总工作量。在低于该水平的水平下,每个√n递归调用将使 4 √n递归调用大小 4 √n的问题。如果我们将它们组合在一起,我们得到√n组的 4 √n回复调用,每个工作 4 √n。那些√n组的递归调用每个都在工作 - 另一个O(n)总工作。
更一般地说,当你走下递归树时,你会发现每个级别都有O(n)工作。这意味着递归调用完成的总工作量将等于树中层数的O(n)倍。现在我们只需要解决这个问题。
事实证明the number of times you can take the square root of a number before it drops down to a constant is O(log log n)。 (链接的答案背后有数学计算)。这意味着我们期望完成的总工作量为O(n log log n) - 树中有O(log log n)层,每个层都有O(n)工作。
其他答案所包含的数学形式正式化了这种推理,但我认为以这种方式看待事情可能会有所帮助,以便您可以看到答案的来源。