如何根据Big O表示法找到此嵌套for循环代码的复杂性?

时间:2017-06-20 07:09:39

标签: big-o code-complexity

我在算法书上找到了这段代码,但我无法理解这个例子。

以下是代码:

for(i=1;i<n-1;i++){
   for(j=n;j>i+1;j--){
      if(a[j-1]>a[j]){
         t=a[j-1];
         a[j-1]=a[j];
         a[j]=t;
    }
  }
}

现在,根据书籍,每个部分的复杂性计算如下this

以及像this

那样计算整个代码的大O.

但我无法理解。你能解释一下这段代码的复杂性吗?特别是由于术语O(n/2)

而将复杂度计算为j>i+1的部分

2 个答案:

答案 0 :(得分:0)

这样的问题似乎经常出现在这里。这是您的交换代码:

for (i=1; i < n-1; i++) {
    for (j=n; j > i+1; j--) {
        if (a[j-1] > a[j]) {
            t = a[j-1];
            a[j-1] = a[j];
            a[j] = t;
        }
    }
}

欣赏外部循环将采取N-1步骤。内循环将介于N-21步之间。我们可以通过说外环具有N步并且内环将采用1和N步之间来进一步估计这一点。然后,平均而言,内循环将完成N/2步骤。

这适用于O(N*N/2) = O(N^2)。因此,您向我们展示的代码是O(N^2)

答案 1 :(得分:0)

外循环执行i = 1到n-2,即n-2次。内循环执行(n-3),(n-4),......,n-(n-1),总共n-3 + n-4 + n-5 + ... + 2 + 1次。当i = 1时,内循环执行(n-3)次,当i =(n-2)时,内循环执行1次。这将给出(n-3)(n-2)/ 2。当我们考虑if条件和它的主体然后每次执行内循环时,执行3个语句。总共将给出(n-3)(n-2)/ 2 * 3.没有必要将(n-3)视为(n-3),而是将其视为n而不是考虑** 3和/ 2。使用这种方法的复杂度计算是近似值。所以复杂性是n * n的量级。为O(n ^ 2)。

当您看到循环时,请将其视为n步。如果有内循环则将其相乘。对于一个循环O(n)。对于两个循环O(n * n)。对于三个循环O(n ** n * n)等。