Algorithm 这些函数的复杂性是什么?

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

我想知道如何使用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 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
    ,那么
    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)

您不仅可以猜测,还可以测量不同的值,然后在锁定图形后进行有根据的猜测,或者尝试使用不同类型的函数对结果进行插值。您好,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);
   }