我无法弄清楚这个练习的解决方案:
计算f(g(n))+ g(f(n))的复杂度,g和f定义如下:
int f(int x) {
if (x<=1) return 2;
int a = g(x) + 2*f(x/2);
return 1+ x + 2*a;
}
int g(int x) {
int b=0;
if (x<=1) return 5;
for (int i=1, i<=x*x;i++)
b+=i;
return b + g(x-1);
}
任何人都可以解释我如何找到解决方案吗?
答案 0 :(得分:3)
解决此问题有两个单独的步骤。首先,我们必须查看每个函数的 time 复杂性,然后查看输出复杂性。
时间复杂度
由于g
是自包含的,因此请先查看它。
g
中完成的工作包括:
x^2
执行循环x - 1
因此可以将时间复杂度递归关系写为(使用大写将其与原始函数区分开来)
要解决它,反复自我替代以给出总和。这是从6到x
的自然数的平方和:
在最后一步中,我们使用了标准结果。因此,a
是常数:
接下来,f
:
g(x)
x / 2
使用类似的方法:
应用停止条件:
因此:
由于指数期限2^(-x^3)
消失了:
输出复杂性
这与上面的过程基本相同,递归关系略有不同。我将跳过细节并仅说明结果(使用小写输出函数):
因此f(g(n)) + g(f(n))
的最终时间复杂度为:
哪个与您的来源给出的结果相符。