我正在读考试,我们有一些练习题。实际考试的解决方案直到实际考试前两小时才给出,所以我无法确定我是否真正了解这些概念。问题和我的工作如下。
以下嵌套循环的最坏情况执行时间:
for(int i = 0; i < n - 1; i++)
{
for(int j = 0; j < n - i - 1; j++)
{
do some comparisons. (this is just O(1))
}
}
外部循环有n-1次迭代,我不确定内部循环,因为它依赖于i。当i为0时,内循环具有n-1次迭代,当i为1时,内循环具有n-2次迭代。我对这个算法的最坏情况执行时间的答案是O(n ^ 2),这是正确的吗?
int n = arr.length
bar(arr); //function bar takes O(n^2)
while(n > 0)
foo1(arr); //function foo1 takes O(n)
foo2(arr); //function foo2 takes O(n log n)
n = n -2;
在这种情况下,while循环迭代n / 2次(n每次迭代减少2)。因为foo1和foo2都在循环中,所以它们共同取O(n ^ 2 * log n)。循环外的函数栏取O(n ^ 2),因此三个函数共同取O(n ^ 2 * log n + n ^ 2)(不包括while循环)。我不确定在这种情况下如何包含while循环,是否会乘以两个内部函数或添加?
答案 0 :(得分:1)
第一个是正确的。为O(n ^ 2)。对于第二个,从技术上讲,foo1上的运行时与foo2的比较并不重要,因为n的大小变得非常大。当n接近无穷大时,这是一个简单的限制比较。 while循环将是O(n ^ 2 * log n)因为正如你所说的那样是n / 2次迭代所以n / 2 * n log n给你n ^ 2 log n就像在1/2之前不是一个重要的随着n变得非常大而不变。当n增长非常大时,取O(n ^ 2)的条函数对O(n ^ 2 * log n)也是无关紧要的。所以第二个问题的运行时间是O(n ^ 2 * log n)。
即使在最后的猜测中。如果比较这两个项,当n接近非常大的数时,n ^ 2 * log n将比n ^ 2快得多。所以你会得到同样的结论。
答案 1 :(得分:0)
在第一个问题中,您应该注意到外部循环的运行时间确实为O(n);这使得嵌套循环运行时成为以下内容的总和:
(n-1) + (n-2) + ... + (1)
这是一个带和的算术序列:
S = (a1 + an)*(n/2) = (n-1+1)*(n-1) = n^2 - n = O(n^2)
因此整体运行时间确实是O(n^2)
根据定义,T(n)
可以被描述为O(f(n))
,如果存在常量c
,那么T(n) <= c * f(n)
,从某个n
开始并进一步。
因此,“快速增长”功能决定f(n)
。
在你的情况下:
n^2*log(n) + n^2 = n^2 * (log(n) + 1) <= c * n^2 * log(n)
(因为n
转到无穷大,很容易找到满足c
的{{1}}值