计算两个递归调用时的复杂性

时间:2013-08-31 11:02:31

标签: algorithm recursion complexity-theory

如果有多个递归调用,如何计算复杂度?

例如在这个问题上。

F(n)
{
   if (n is 1)
     return;
   F(n/2)  //Call 1
   F(n/3)  //Call 2
   F(n/6)  //Call 3
}

2 个答案:

答案 0 :(得分:1)

你只需要解决这个等式,

T(n)=T(n/2)+T(n/3)+T(n/6)+O(1)

现在作为T(n / 2)> T(n / 3),我们可以改为求解

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

使用master's theorem,T(n)= O(n ^(log(base 2)3))= O(n ^ 1.58)

请注意,可能有更好的解决方案,但因为这是Big O表示法,这也是有效的

答案 1 :(得分:0)

有趣的问题。

我相信我可以证明这个函数的复杂性对于任何c>而言都是O(n c )。 1。

回想一下big-O表示法的定义。我们说如果存在常数k和n',则函数g(n)是O(f(n)),使得g(n)<1。所有n的k * f(n)> N”。 (通俗地说,对于足够大的n,g(n)在f(n)之上是有限的,忽略了常数因子。)

选择任何c&gt; 1,并观察到足够大的n,

1&gt; (1/2) c +(1/3) c +(1/6) c + 1 / n c < / SUP>

这很容易看出,因为1/2 + 1/3 + 1/6 = 1,并且(1/2) c &lt; 1/2等因为c> 1.当n足够大时,1 / n c 是任意小的。

乘以n c ,得到足够大的n:

n c &gt; (n / 2) c +(n / 3) c +(n / 6) c + 1

因此,如果对于m = n / 2,m = n / 3,m = n / 6,F(m)的运行时间超过m c ,则运行F(n)的时间以n c 为界。结果如下归纳。

所以尽管我错了这个函数是O(n),但是它是任意接近的......在任何正值epsilon的意义上,无论多小,函数都是O(n 1+小量)。

...

一般来说,对于这类问题,我想你想猜测n c 形式的解,然后尝试在c上设置一个约束。这基本上是主定理本身的运作方式。