我最近接受了一次编程访谈,并出现了以下代码。面试官告诉我这是一个O(n * n)算法,但我很困惑,考虑到每次外循环运行时内循环运行次数较少。
绝对不是O(n),但为什么是O(n * n)?
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
...
}
}
答案 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)的大符号。