减少嵌套for循环的运行时间

时间:2013-09-30 19:56:37

标签: algorithm runtime big-o

我最近接受了一次编程访谈,并出现了以下代码。面试官告诉我这是一个O(n * n)算法,但我很困惑,考虑到每次外循环运行时内循环运行次数较少。

绝对不是O(n),但为什么是O(n * n)?

for(int i = 0; i < n; i++)
{
    for(int j = i + 1; j < n; j++)
    {
        ...
    }
}

3 个答案:

答案 0 :(得分:3)

以这种方式看待它。第一次通过i,您将循环j 99次。接下来,98,97,96等,一直到一个。这等于:

1 + 2 + 3 + 4 + 5 + ... + n

将这些(triangular)数字相加的快速方法是使用attributed to Gauss技术:

sum = ((n * n) + n) / 2

现在你可以清楚地看到O(n * n)。

答案 1 :(得分:0)

对于i = 0:内循环运行99次 对于i = 1:内循环运行98次 对于i = 2:内循环运行97次
对于i = 3:内循环运行96次 。


对于i = 99:内循环运行0次

如果我们计算EOP的数量,比如#(EOPs):= S,那么S = 0 + 1 + 2 + 3 + .... + 99 所以S =(99 *(99 + 1))/ 2 = S =(99 * 99 + 99)/ 2 =&gt; S <= 1/2 * 99 ^ 2 + 99 - = S&lt; = 99 ^ 2 + 99&lt; =&gt; S&lt; = 99 ^ 2 + 99 ^ 2 =&lt; =&gt; S <= 2 * 99 ^ 2因此,令n = 99且c = 2,我们得到S <= c * n ^ 2,则S具有n ^ 2的量级。你所编写的程序片段因为n ^ 2的顺序

答案 2 :(得分:0)

算法的运行时复杂度或最差投射复杂度为O(n * n)。这背后的简单推理来自数学,

当i = 0时,j将从j = 1运行到j = n(进行n次比较) 当i = 1时,j将从j = 2运行到j = n(进行n-1次比较) .... 当i = n-1时,j将从j = n运行到j = n(取1比较)

如果你添加它,(1)+(2)+(3)+ ... +(n-1)+(n),你基本上计算前n个自然数的总和,即n *(的n + 1)/ 2。扩展这个你得到(n n + n)/ 2。这基本上具有n n的时间复杂度,或O(n * n)的大符号。