使用递归树渐近求解T(n)= 2T(n ^(1/2))+ 1?

时间:2016-07-18 17:59:53

标签: time-complexity big-o recurrence

我需要解决复发问题

  

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

我需要找到渐近时间的复杂性。我正在使用递归树方法,但我遇到了困难。我知道答案是Θ(log n),但我不知道如何达到这个目的。你是如何解决这种复发的?

3 个答案:

答案 0 :(得分:3)

如果您看到重复T(n),其中一个术语取决于输入大小的平方根,那么定义新的重现通常很有用

  

S(k)= T(2 k

因为k中的重复发生通常比n中的相应重复更容易使用。在我们的例子中,我们有

  

S(k)= T(2 k

     

= 2T(√(2 k ))+ 1

     

= 2T(2 k / 2 )+ 1

     

= 2S(k / 2)+ 1

请注意,我们现在有一个与主定理所期望的形式相匹配的重复(并且通常比原始定义更容易使用)。我们可以通过许多不同的技术将这种重现解决为S(k)=Θ(k)。

既然我们知道S(k)=Θ(k),我们可以说T(n)?好吧,假设我们可以捏造不是2的精确幂的东西,我们可以说T(n)≈S(lg n),因为S(lg n)= T(2 lg n < / sup>)= T(n)。因此,我们得到了

  

T(n)= S(lg n)=Θ(lg n)

所以T(n)=Θ(lg n)。

这是达到这个结果的另一种方式,它不那么数学化,更直观。想象一下通过扩展原始递归T(n)形成的递归树的形状。在顶层,我们有一个大小为n的调用1个工作。在下一个级别,我们有两个大小为 2 √n的调用,共计2个工作。在下面的级别是四次调用大小 4 √n,总共4个工作。更一般地说,在k级,我们有2个 k 调用,每个调用 2 k √n工作。当n变得足够小(例如,n = 2)时,递归终止,这发生在某个级别k。那时,完成的工作总数将是

  

1 + 2 + 4 + 8 + 16 + ... + 2 k = 2(2 k ) - 1。

如果我们能解决k,我们就会知道完成了多少工作。请注意,当输入下降到2时,递归停止,这意味着我们想要的k是 2 k √n= 2的那个。求解k,我们看到该

  

2 k √n= 2

     

n = 2 2 k

     

lg lg n = k

一般来说,如果你看到一个因平方根因子而缩小的东西,你应该期望the number of iterations before the term drops to a constant is O(log log n)。因此,完成的总工作量为2(2 lg lg n )+ 1 = 2 lg n - 1 =Θ(lg n),如前所述。

答案 1 :(得分:1)

让我们进行替换enter image description here

然后

enter image description here

其中N是系列终止前的术语数。

但是N是什么?这取决于 amit 评论的答案。假设n中的T(n)允许非整数值,而T n < C的{​​{1}}终止(= 0),对于某个常量C > 1

然后我们需要

![enter image description here

因此,复杂性还取决于C

enter image description here

编辑:数据支持我的回答:

  • T针对log nC = 1.5
  • 的图表

enter image description here

  • T针对- log Cn = 2^64
  • 的图表

enter image description here

如您所见,两者都是线性的。

答案 2 :(得分:0)

使用递归树方法,可以解决以下问题: follow this link