涉及平方根的递归函数的运行时?

时间:2017-11-02 07:26:09

标签: recursion time-complexity big-o

任何人都可以帮我找到以下递归函数的时间复杂度吗?我递归地写了T(n^(1/2)), T(n^(1/4)),... T(1),但是到达任何递归的运行时的一般方法是什么?

T(n) = n^(1/2) (T(n^(1/2)) + n

1 个答案:

答案 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)工作。

其他答案所包含的数学形式正式化了这种推理,但我认为以这种方式看待事情可能会有所帮助,以便您可以看到答案的来源。