Algorithm 这些函数的复杂性是什么?
我想知道如何使用T(n)来发现这些函数的复杂性。。诸如此类的事情。。因为我只能猜测。Algorithm 这些函数的复杂性是什么?,algorithm,performance,time-complexity,complexity-theory,Algorithm,Performance,Time Complexity,Complexity Theory,我想知道如何使用T(n)来发现这些函数的复杂性。。诸如此类的事情。。因为我只能猜测。 第一个功能: 时间和空间复杂性?? 第二个功能: 函数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
第一个功能: 时间和空间复杂性??
第二个功能:
函数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);
}
void f(int n)
{
int i;
如果(n<2)返回;
对于(i=0;i
非常感谢:)这可能会让你大吃一惊,但第二个更容易开始。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))
第一个功能:
OK,我不知道如何开始,但是我用C++测试了代码,结果是:代码> f(n)= n< /代码>。 归纳证明:
- 假设
,那么f(n)=n
。因此,如果n为真,则n+1也为真f(n+1)=1+f(f(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)
您不仅可以猜测,还可以测量不同的值,然后在锁定图形后进行有根据的猜测,或者尝试使用不同类型的函数对结果进行插值。您好,stackexchange网络。人们被期望在这里展示出他们为解决问题所付出的巨大努力。你试过什么,你在哪里卡住了?@G.Bach我试着用哮喘方程来解决它,比如T(n)。。但我不知道该怎么做continue@AmeenAli你是否陷入困境其实不是问题——只要记住尽可能简洁地描述你做了什么以及为什么陷入困境;你越清楚地描述你为什么陷入困境,人们就越能帮助你学习一些东西,而不仅仅是发布解决方案。第二个功能是n*log(n)谢谢!!第一个是2^n:(@AmeenAli fixed:)sry不知怎么的,我忘记了时间复杂性的事情了
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);
}