有人可以帮助解决这种递归关系吗?

时间:2010-10-18 03:15:22

标签: algorithm math time-complexity recurrence

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

T(n) = T(sqrt(n)) + 0(1)

在第一个中,我使用n,logn等的替换方法;都给了我错误的答案 重复树:我不知道我是否可以申请,因为根将是一个常数。

有人能帮忙吗?

6 个答案:

答案 0 :(得分:11)

使用Master Theorem来解决此类重复关系。

  

a 为大于或等于1的整数, b 为大于的实数   1.让 c 为正实数    d 非负实数。鉴于表格的重复出现

     
      
  • T(n)= a T(n / b)+ n c ..如果n> 1

  •   
  • T(n)= d ..如果n = 1

  •   
     

然后n为b的幂,

     
      
  1. 如果log b a< c,T(n)=Θ(n c ),
  2.   
  3. 如果log b a = c,T(n)=Θ(n c log n),
  4.   
  5. 如果log b a> c,T(n)=Θ(n log b a )。
  6.   

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

在这种情况下

a = b = 2;
   log b a = 1; c = 0(因为n c = 1 => c = 0)

案例(3)适用。所以T(n) = Θ(n):)


2)T(n) = T(sqrt(n)) + 0(1)

设m = log 2 n;

=> T(2 m )= T(2 m / 2 )+ 0(1)

现在重命名K(m)= T(2 m )=> K(m)= K(m / 2)+ 0(1)

应用案例(2)。


答案 1 :(得分:11)

让我们来看看第一个。首先,你需要知道T(基本情况)。你提到它是一个常数,但是当你解决这个问题时,你必须把它写下来。通常它就像T(1)= 1.我会使用它,但你可以推广到它是什么。

接下来,找出您重复的次数(即递归树的高度)。 n是您的问题大小,那么我们可以多次将n重复除以2?从数学上讲,n/(2^i) = 1时我是什么人?搞清楚,稍等一下。

接下来,做一些替换,直到你开始注意到一种模式。

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

好的,模式是我们将T()乘以2次,并将n除以2次。多少次? i次。{/ p>

T(n) = (2^i)*T(n/(2^i)) + ...

对于最后的大-θ术语,我们使用了一个可爱的技巧。看看我们有几个替换的地方,并忽略T()部分。我们想要θ项的总和。请注意,它们相加(1 + 2 + 4 + ... + 2^i) * θ(1)。你能找到1 + 2 + 4 + ... + 2^i的封闭表格吗?我会给你那个;它是(2^i - 1)。这是一个很好的记忆,但here's how you'd figure it out

无论如何,总而言之,我们得到了

T(n) = (2^i) * T(n/(2^i)) + (2^i - 1) * θ(1)

如果你之前解决了i,那么你知道i = log_2(n)。将其插入,做一些代数,然后进入

T(n) = n*T(1) + (n - 1)*θ(1)T(1) = 1。所以T(n) = n + (n - 1)*θ(1)。这是常数的n倍,加上常数加n。我们删除低阶项和常数,所以它是θ(n)。

Prasoon Saurav使用主方法是正确的,但重要的是你要知道复发关系的含义。要问的是,我在每一步做了多少工作,以及输入大小n的步骤数是多少?

答案 2 :(得分:7)

对于第1部分,您可以使用Master Theorem作为@Prasoon Saurav建议。

对于第2部分,只需展开重复:

T(n) = T(n ^ 1/2) + O(1)         // sqrt(n) = n ^ 1/2
     = T(n ^ 1/4) + O(1) + O(1)  // sqrt(sqrt(n)) = n ^ 1/4
     etc.

系列将继续k个字词,直至n ^ 1/(2^k) <= 1,即2^k = log nk = log log n。这给了T(n) = k * O(1) = O(log log n)

答案 3 :(得分:1)

让我们看看第一次重现,T(n)= 2T(n / 2)+ 1.这里我们的线索是n / 2:每个嵌套术语的参数是其父项的一半。因此,如果我们从n = 2 ^ k开始,那么在我们的基础情况T(0)之前,我们将在扩展中使用k个术语,每个术语在总数中加1。因此,假设T(0)= 1,我们可以说T(2 ^ k)= k + 1.现在,由于n = 2 ^ k,我们必须具有k = log_2(n)。因此T(n)= log_2(n)+ 1。

我们可以对你的第二次重复使用相同的技巧,T(n)= T(n ^ 0.5)+ 1.如果我们从n = 2 ^ 2 ^ k开始,我们将在扩展中使用k项,每次添加1到总数。假设T(0)= 1,我们必须有T(2 ^ 2 ^ k)= k + 1.由于n = 2 ^ 2 ^ k,我们必须有k = log_2(log_2(n)),因此T(n) = log_2(log_2(n))+ 1。

答案 4 :(得分:0)

递归关系和递归函数也应该从f(1)开始解决。在情况1中,T(1)= 1; T(2)= 3; T(4)= 7; T(8)= 15;很明显,T(n)= 2 * n -1,其中O符号为O(n) 在第二种情况下,T(1)= 1; T(2)= 2; T(4)= 3; T(16)= 4; T(256)= 5; T(256 * 256)= 6;需要很少的时间才能发现T(n)= log(log(n))+ 1其中log是基数2.显然这是O(log(log(n))关系。

答案 5 :(得分:0)

大多数情况下,处理重复的最佳方法是绘制重复树并小心处理基本情况。

但是在这里,我会给你一些轻微的提示来解决使用替换方法。

重复尝试首先尝试替换n = 2^k 在重复尝试第二次尝试替换n = 2^2^k