这些循环的执行时间?

时间:2018-02-13 22:51:03

标签: big-o execution-time

我正在读考试,我们有一些练习题。实际考试的解决方案直到实际考试前两小时才给出,所以我无法确定我是否真正了解这些概念。问题和我的工作如下。

以下嵌套循环的最坏情况执行时间:

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循环,是否会乘以两个内部函数或添加?

2 个答案:

答案 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)

  1. 在第一个问题中,您应该注意到外部循环的运行时间确实为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)

  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}}值