递归函数运行时

时间:2016-02-04 06:06:32

标签: algorithm big-o

1.赋予T(0)=1, T(n)=T([2n/3])+c(在这种情况下2n/3为下限)。什么是T(n)的大Θ?这只是log(n)(base 3/2)。请告诉我如何获得结果。

2.给出代码

void mystery(int n) {
   if(n < 2)
      return;
   else {
      int i = 0;
      for(i = 1; i <= 8; i += 2) {
         mystery(n/3);
      }
      int count = 0;
      for(i = 1; i < n*n; i++) {
         count = count + 1;
      }
   }
}

根据主定理,big-O界限是n ^ 2。但我的结果是log(n)* n ^ 2(基数3)。我不确定我的结果,实际上我真的不知道如何处理递归函数的运行时。它只是简单的日志功能?

或者如果在此代码中T(n)=4*T(n/3)+n^2会怎么样?

干杯。

2 个答案:

答案 0 :(得分:1)

对于(1),递推求解为c log 3/2 n + c。要看到这一点,您可以使用迭代方法展开重复的几个术语并找出模式:

  

T(n)= T(2n / 3)+ c

     

= T(4n / 9)+ 2c

     

= T(8n / 27)+ 3c

     

= T((2/3) k n)+ kc

假设T(1)= c并且求解k的选择使得括号内的表达式等于1,我们得到

  

1 =(2/3) k n

     

(3/2) k = n

     

k = log 3/2

将这个k选择插入上面的表达式得出最终结果。

对于(2),您具有递归关系

  

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

使用a = 4,b = 3和d = 2的主定理,我们看到log b a = log3 4&lt; d,所以这解决了O(n 2 )。这是一种看待这个的方法。在顶层,你做 2 工作。在下面的那一层,你有四个调用,每个调用n 2 / 9工作,所以你做4n 2 / 9工作,少于顶层。下面的层执行16次调用,每次执行n 2 / 81工作总共16n 2 / 81工作,再次比上面的层工作多。总的来说,每一层的工作量都比它上面的层少得多,因此顶层最终会渐渐地支配所有其他层。

答案 1 :(得分:0)

让我们做一些复杂性分析,我们会发现T(n)的渐近行为取决于递归的常量。

鉴于T(n) = A T(n*p) + CA,C>0p<1,我们首先尝试证明T(n)=O(n log n)。我们尝试找到D,以便足够大n

T(n) <= D(n * log(n))

这会产生

A * D(n*p * log(n*p)) + C <= D*(n * log(n))

查看更高阶的术语,结果为

A*D*p <= D

因此,如果A*p <= 1有效,则 T(n)=O(n log n)

在特殊情况下A<=1我们可以做得更好,并证明 T(n)=O(log n)

T(n) <= D log(n)

产量

A * D(log(n*p)) + C <= D*(log(n))

查看更高阶的术语,结果为

A * D * log(n) + C + A * D *log(p) <= D * log(n)

Dn开始,A<=1log(p)<0足够大。

否则,如果A*p>1,让我们找到q的最小值T(n)=O(n^q)。我们尝试找到最小q,以便存在D

T(n) <= D n^q

这会产生

A * D p^q n^q + C <= D*n^q

查看更高阶的术语,结果为

A*D*p^q <= D

满足此要求的最小q

定义
A*p^q = 1

因此,我们对 T(n)=O(n^q) q = - log(A) / log(p) 得出结论。

现在,给定T(n) = A T(n*p) + B n^a + CA,B,C>0p<1,尝试为某些T(n)=O(n^q)证明q。我们尝试找到最小q>=a,以便对某些D>0

T(n) <= D n^q

这会产生

A * D n^q p^q + B n^a + C <= D n^q

尝试q==a,只有在

时才会有用
ADp^a + B <= D

即。如果 T(n)=O(n^a) ,则 Ap^a < 1

否则我们会像以前一样到达Ap^q = 1,这意味着 T(n)=O(n^q) q = - log(A) / log(p)