此函数的算术运算(以上限计)的时间成本是多少?
int foo(int n)
{
int i;
if (n <= 3) return 1;
else if (n > 333)
{
i = n/2;
return 3 * foo(i) + foo(i) + n * i;
}
else return foo(n - 3) + 9;
}
我试图分析它,这些是我的想法:
T(n)是:
1 ; if n ≤ 3 4T(n/2) + (n2)/2 ; if n > 333 T(n-3) + 9 ; otherwise
所以对于第二个等式,我可以说它是O((n2)/2 logn)
。
这是对的吗?
答案 0 :(得分:3)
不要被抛入函数的所有操作所迷惑,这些操作只是常量时间操作。加法,乘法,比较 - 这些都是恒定时间操作。分支递归是您需要关注的。
在不改变复杂性的情况下,我可以将函数重新排列为等效函数:
int foo(int n)
{
if (n <= 3) return 1;
else if (n <= 333) return foo(n - 3) + 9;
else
{
int i = n/2;
return 3 * foo(i) + foo(i) + n * i;
}
}
前两个案例必不可少说“当n
小于某个固定常数时,还有一定数量的工作要做。”因此,我们最终O(1)
阻止结果的唯一方法是最后else
阻止。
在那里,唯一的非常数时间操作是对foo(n/2)
的两次调用。所以我们有递归关系
T(n) = T(n/2) + T(n/2) = 2T(n/2)
产生
T(n) = 2T(n/2) = 4T(n/4) = 8T(n/8) = ... = O(n)
因此foo(n)
的复杂性为O(n)
。
WolframAlpha同意我的意见:
http://www.wolframalpha.com/input/?i=T%28n%29+%3D+2*T%28n%2F2%29
您必须具有T(n) = O(n) + 2*T(n/2)
形式的重复关系才能获得T(n) = O(n log n)
。 WolframAlpha再次同意:
http://www.wolframalpha.com/input/?i=T%28n%29+%3D+n+%2B+2*T%28n%2F2%29