当前位置: 首页 > 知识库问答 >
问题:

确定函数的复杂度(大O表示法)

邰昀
2023-03-14

我在期中考试中遇到了这个问题,我不确定我的答案是O(n^2)。我想要有解释的答案,谢谢。

int recursiveFun1(int n)
{  for(i=0;i<n;i+=1) 
      do something;                                                                 
    if (n <= 0)
    return 1;
else
    return 1 + recursiveFun1(n-1);}

共有2个答案

郭元明
2023-03-14

用输入的递归函数的执行时间表示。然后,如果n大于0,则执行以下操作:

  • 假设“某物”有恒定的运行时间,它消耗c1*n时间

所以

R(n) = c1*n + c2 + R(n-1)

该方程有一个解,即O(n^2)。你可以通过归纳来证明,或者仅仅通过猜测一个形式为a*n^2 b*n c的解来证明。

注意:我假设“做点什么”有恒定的运行时间。这似乎是合理的。然而,如果它不是真的(例如,它包含一个递归调用),您的复杂性将更大-可能更大,这取决于“某物”正在做什么。

颜楚青
2023-03-14

首先,我在代码中添加了另一个缩进

int recursiveFun1(int n)
{  
  for(i=0;i<n;i+=1) // this is bounded by O(n)
    do something; // I assume this part is O(1)

  if (n <= 0)
    return 1;
  else
    return 1 + recursiveFun1(n-1);
}

首先要说的是,每次调用recursiveFun1()时,O(n)都是由于的而支付的。虽然每次调用时n都会减少,但时间仍以O(n)为界。

第二件事是计算将调用runsiveFun1()的次数。显然(对我来说)它将被精确地调用n 1次,直到参数n达到零值。

所以时间是n(n-1)(n-2)。。。1 0是((n 1)n)/2是O(n^2)

 类似资料:
  • 我想确定两个函数的复杂性。 第一个我只需要知道我的解决方案是否正确,第二个是因为我正在努力寻找解决方案的两个递归调用,如果可能的话,最好进行工作,这样我就可以了解它是如何完成的。 第一: 尝试的解决方案: 第二: 任何帮助将不胜感激。 当做

  • 在最近的一次测试中,我们得到了一个函数来计算未排序的ArrayList中出现了多少个double(不是原语double,而是一个项目出现了两次)。 我正确地确定了Big O复杂度为O(N^2),但由于我错误地确定了全部复杂度,因此只获得了部分学分。函数如下: 在他刚刚发布的考试解决方案中,他给出了这样的解释: 输入集合中有N个项,该方法通过一个缩减步骤反复调用自己,该步骤生成一个新索引N次,直到达

  • 给定已排序的两个单链表,合并这些列表。 示例: list1: 1 2 3 5 7 list2: 0 4 6 7 10 --- 尽管这个解决方案非常简单,并且有几个不同的问题实现,不管是否使用递归(如下所示http://www.geeksforgeeks.org/merge-two-sorted-linked-lists/见方法3), 我想知道这个实现有多复杂: 如果其中一个列表是空的,只需返回另一

  • 下面是链接:array reversed() 在讨论部分的最后,它说复杂性O(1),我相信这是关于时间复杂性的,如何反转一个数组需要O(1)时间?

  • 我知道,对于迭代,递增。