【问题标题】:What is the complexity of these functions with explanation?这些功能的复杂性和解释是什么?
【发布时间】:2016-03-07 11:15:18
【问题描述】:

我想知道如何使用 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);
   }


非常感谢 :)

【问题讨论】:

  • 您不仅可以猜测,还可以针对不同的值进行测量,而不是在锁定图表后进行有根据的猜测,或者尝试使用不同类型的函数对结果进行插值?
  • 您好,stackexchange 网络。人们应该表现出他们在这里解决问题所付出的努力。你试过什么,你在哪里卡住了?
  • @G.Bach 我尝试使用像 T(n) 这样的哮喘方程来解决它.. 但我不知道如何继续
  • @AmeenAli 你是否卡住真的不是问题——只要记住尽可能简洁地描述你做了什么以及为什么卡住了;你越清楚地描述你被卡住的原因,更好的人就能帮助你学习一些东西,而不仅仅是发布解决方案。

标签: algorithm performance time-complexity complexity-theory


【解决方案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(因为只有1个操作),所以如果你扩大到最后一个词,你会发现这个词是2^m * f(1) = 2^m。因此f 的总复杂度为f(2^m) = m*21(2^m)/10 + 2^mf(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^nO(2^n)

【讨论】:

  • 第二个函数是 n*log(n) 谢谢!!第一个是 2^n :((
  • @AmeenAli 已修复 :) 抱歉,我以某种方式忘记了时间复杂度
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多