解决复发T(n)= T(n / 2)+ lg n?

时间:2013-02-04 02:53:50

标签: algorithm math big-o recurrence master-theorem

我在如何解决递归关系方面遇到了一些问题。

  

T(n)= T(n / 2)+ log2(n),T(1)= 1,其中n是2的幂

这是一个家庭作业问题,所以不要只给我答案。我只是想知道如何解决问题。

在课堂上我们过了the Master theorem。但我认为这不是解决这种特殊关系的最佳方式。

我真的不知道如何解决这个问题......我应该去吗

T(n) = T(n/2) + log_base2(n)
T(n/2) = [T(n/4)+log_base2(n/2)]
  T(n) = [T(n/4)+log_base2(n/2)] + log_base2(n) 

只是继续努力让我能看到的东西成为一个基本的等式?

4 个答案:

答案 0 :(得分:4)

这种复发解决了Θ((log n) 2 。这有两种方法可以看到这一点。

一些替换

如果你知道n是2的完美幂(即n = 2 k ),你可以将重现重写为

  

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

让我们定义一个新的重现S(k)= T(2 k )。然后我们得到了

  

S(k)= S(k-1)+ k

如果我们扩大这种复发,我们就会得到

  

S(k)= S(k-1)+ k

     

= S(k-2)+(k-1)+ k

     

= S(k-3)+(k-2)+(k-1)+ k

     

= S(k - 4)+(k - 3)+(k - 2)+(k - 1)+ k

     

...

     

= S(0)+ 1 + 2 + 3 + ... + k

     

= S(0)+Θ(k 2

假设S(0)= 1,则此递归求解为Θ(k 2 )。

由于S(k)= T(2 k )= T(n),我们得到T(n)=Θ(k 2 )=Θ( log 2 n)。

迭代重复

这里的另一个选择是扩展一些重复的术语,看看是否出现任何好的模式。这是我们得到的:

  

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

     

= T(n / 4)+ lg(n / 2)+ lg n

     

= T(n / 8)+ lg(n / 4)+ lg(n / 2)+ lg n

     

...

最终,在lg n层之后,这种重复发生在最低点,我们留下了这个表达式:

  

lg n + lg(n / 2)+ lg(n / 4)+ ... + lg(n / 2 lg n)

使用对数属性,我们可以将其重写为

  

lg n +(lg n - 1)+(lg n - 2)+(lg n - 3)+ ... +(lg n - lg n)

或者,反过来说,这就是总和

  

0 + 1 + 2 + 3 + ... + lg n

该和是高斯的总和达到lg n,其求值为(lg n)(lg n + 1)/ 2 =Θ((log n)2)。

希望这有帮助!

答案 1 :(得分:1)

如果n是2的幂,那么你可以使用lg(a / b)= lg(a) - lg(b)来扩展重复并精确求解。

T(n) = lg(n) + lg(n/2) + lg(n/4) + ... + lg(1) + 1
     = (lg(n) - 0) + (lg(n) - 1) .... + (lg(n) - lg(n)) + 1
     = lg(n)*lg(n) - lg(n)*(lg(n)+1)/2 + 1
     = lg(n)*lg(n)/2 - lg(n)/2 + 1

答案 2 :(得分:0)

这可以用Akra-Bazzi定理来完成。请参阅http://people.mpi-inf.mpg.de/~mehlhorn/DatAlg2008/NewMasterTheorem.pdf中的第三个示例。

答案 3 :(得分:0)

这可以通过Master theorem来解决。您的a=1b=2以及f(n) = log(n)。然后是c = log2(1) = 0。由于您的cf(n)属于第二种情况(k=1)。

所以解决方案是Θ(log 2 n)