我正在尝试学习Big O,并且对我刚刚遇到的算法感到困惑。算法是:
void pairs(int[] array){
for (int i=0; i < array.length; i++){
for (int j=i+1; j<array.length; j++){
System.out.println(array[i]+","+array[j]);
}
}
}
我认为第一个for循环是O(n)
,我知道第二个for循环是O(1/2*n(n+1))
。该问题的答案是该函数的运行时间为O(n^2)
。我将O(1/2*n(n+1))
简化为O(1/2*(n^2+n))
。所以我很困惑,因为我认为你需要将两个运行时间项相乘,因为for循环是嵌套的,这将给O(n) * O(1/2*(n^2+n))
。我将其简化为O(1/2n^3 + 1/2n^2)
。根据我对Big O的理解,您只保留最大的术语,因此这将减少到O(n^3)
。任何人都可以帮我解决我出错的地方吗?不确定答案是O(n^2)
而不是O(n^3)
。
答案 0 :(得分:0)
你的错误是将第二个循环计为O(1/2n^2)
...
首先,你可以清楚地看到它被限制在N-1
(当j = 0时)
第一个循环显然是N
第二个循环是N-1
...的MAX
因此,O(N ^ 2)......
如果我们再检查一下,
当N-1
时,第二个循环将运行i=0
,
然后是N-2
i=1
,
i=n-1
,
这是1/2n(n-1)
= 1/2n^2 - 1/2n
= O(n^2)
注意这也包括外循环的所有迭代!
答案 1 :(得分:0)
当你说内循环是O(1/2*n(n+1))
时,你实际上是在描述两个循环的大O复杂性。
要说外环有复杂性O(N)基本上意味着它的身体运行N次。但是为了计算内循环的复杂性,你已经考虑了外循环的所有次迭代,因为你把内循环遍历所有迭代的次数加起来了。外循环。如果你再次乘以N,你会说外环本身再重新运行N次。
换句话说,您的分析显示内部循环体(System.out.println
调用)整体运行1/2*n(n+1)
次。这意味着双循环组合的总体复杂性为O(1/2*n(n+1)) = O(n^2)
。双循环组合的总体复杂性描述了最内层代码的运行次数。