Big O整数运行时的总和

时间:2016-07-03 20:05:48

标签: algorithm big-o

我正在尝试学习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)

2 个答案:

答案 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)。双循环组合的总体复杂性描述了最内层代码的运行次数。