我想知道如何使用T(n)来找到这些函数的复杂性......以及类似的东西..因为我只能猜猜。
第一功能:
int f(int n)
{
if (n == 1)
return 1 ;
return 1 + f(f(n-1));
}
时间和空间复杂度?
第二功能:
时间和空间函数f()的复杂性??? :
void f(int n)
{
int i ;
if(n < 2) return ;
for(i = 0 ; i < n/2 , i+= 5)
printf("*");
g(n/3);
g(n/3);
}
void g(int n)
{
int i ;
for(i = 0 ; i < n ; i++)
printf("?") ;
f(3*n/2);
}
非常感谢:)
答案 0 :(得分:1)
这可能会让您感到惊讶,但第二个更容易入手。 O_o ikr
第二功能:
g(n) = n + f(3n/2)
,f(n) = n/10 + 2g(n/3)
。因此f(n) = 21n/10 + 2f(n/2)
。
替换n = 2^m
,因此f(2^m) = 21(2^m)/10 + 2f(2^(m-1)) = 2*21(2^m)/10 + 4f(2^(m-2))
等等......
第一项总和为m*21(2^m)/10
,这对您来说可能很明显。
第二个词(f())几何增长;现在f(1) = 1
(因为只有一个操作),所以如果你扩展到最后一个术语,你会发现这个术语是2^m * f(1) = 2^m
。因此,f
的总复杂度为f(2^m) = m*21(2^m)/10 + 2^m
或f(n) = n(2.1*log(n) + 1)
,其中log
为2对数。
因此f(n)
为O(n log(n))
。
第一个功能:
好的我说实话我不知道如何开始,但我用C ++测试了代码,结果正是f(n) = n
。
归纳证明:
f(n) = n
,然后是f(n + 1) = 1 + f(f(n)) = n + 1
。因此,如果对于n为真,那么对于n + 1 f(1) = 1
。因此,对于2和3,4,5等等都是如此。因此,通过数学归纳,f(n) = n
。
现在为时间复杂度位。由于f(n)
返回n
,因此嵌套f(f(n-1))
中的外部调用实际上将是第二次调用,因为参数相同:f(n-1); f(n-1);
。因此T(n) = 2*T(n-1)
因此T(n) = 2^n
。的 O(2^n)
强>