int f(int x)
{
if (x < 1) return 1;
return f(x-1) + g(x);
}
int g(int x)
{
if (x < 2) return 1;
return f(x-1) + g(x/2)
}
f的大O是什么?更重要的是,使用什么技术来计算这样的问题的运行时间?
答案 0 :(得分:2)
允许写Cf(x)
(resp Cg(x)
)调用f(x)
(resp g(x)
)时执行的添加次数。
首先,两个函数都返回一些数字,这些数字是通过加法返回最终得到的1.因此
Cf(x) = f(x) - 1
Cg(x) = g(x) - 1
所以让我们坚持f和g。以下是前几个值:
[(f(i), g(i), 2^i) for i in range(10)]
[(1, 1, 1),
(2, 1, 2),
(5, 3, 4),
(11, 6, 8),
(25, 14, 16),
(53, 28, 32),
(112, 59, 64),
(230, 118, 128),
(474, 244, 256),
(962, 488, 512)]
看起来呈指数级。此外:
f(x) = f(x-1) + g(x)
= 2*f(x-1) + g(x/2)
这清楚地表明
f(x) > 2*f(x-1) > 4*f(x-2) > 8*f(x-3) > 2^x.
所以你很好地认为f(x)
是O(2^x)
,实际上是Theta(2^x)
。
现在f(x) > 2^x
和f(x-1) <= g(x) <= f(x)
。因此g
和f
以相同的速度增长。
因此g(x/2)
与f(x)
相比完全可以忽略不计。那么
f(x) is a O(2^n)