我在期中考试中遇到了这个问题,我不确定我的答案是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);}
用输入的递归函数的执行时间表示。然后,如果n大于0,则执行以下操作:
所以
R(n) = c1*n + c2 + R(n-1)
该方程有一个解,即O(n^2)。你可以通过归纳来证明,或者仅仅通过猜测一个形式为a*n^2 b*n c的解来证明。
注意:我假设“做点什么”有恒定的运行时间。这似乎是合理的。然而,如果它不是真的(例如,它包含一个递归调用),您的复杂性将更大-可能更大,这取决于“某物”正在做什么。
首先,我在代码中添加了另一个缩进
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
达到零值。
。所以时间是
是O(n^2)n(n-1)(n-2)。。。1 0
是((n 1)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)时间?
我知道,对于迭代,递增。