递归函数运行时

Recursive function runtime

1.Given 即 T(0)=1, T(n)=T([2n/3])+c(在本例中 2n/3 是下限)。 T(n) 的 big-Θ 是什么?这只是简单的log(n)(base 3/2)。请告诉我如何得到结果。

2.Given代码

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;
      }
   }
}

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

或者如果像在这段代码中一样怎么办 T(n)=4*T(n/3)+n^2

干杯。

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

给定T(n) = A T(n*p) + C,加上A,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) for 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) for q = - log(A) / log(p) .

对于(1),递归求解为c log3/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 并求解使括号内的表达式等于 1 的 k 的选择,我们得到

1 = (2/3)k n

(3/2)k = n

k = log3/2

将 k 的选择代入上述表达式给出最终结果。

对于 (2),你有递推关系

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

使用主定理 a = 4, b = 3, d = 2,我们看到 logb a = log3 4 < d,所以这解决了 O(n2)。这是一种查看方式。在顶层,你做 n2 工作。在那层下面,你有四个调用,每个调用做 n2 / 9 工作,所以你做 4n2 / 9 工作,少于顶层。下面的层执行 16 个调用,每个调用执行 n2 / 81 次,总共执行 16n2 / 81 次,再次比层之上。总的来说,每一层所做的工作都比它上面的层少得多,所以顶层最终逐渐支配所有其他层。