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

Big o 如何根据大O表示法找到这种嵌套for循环代码的复杂性?,big-o,code-complexity,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; } } } (i=1;ii+1;j--)的{ 如果(a[j-1]>a[j]){ t=a[j-1]; a[j-1]=a[j]; a[j]=t; } } }

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

代码如下:

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;
    }
  }
}
(i=1;ii+1;j--)的
{
如果(a[j-1]>a[j]){
t=a[j-1];
a[j-1]=a[j];
a[j]=t;
}
}
}
现在根据这本书,每个部分的复杂性都是这样计算的

整个代码的大O也是这样计算的


但是我不明白。你能给我解释一下这个代码的复杂性吗?特别是计算复杂性的部分,由于术语
j>i+1

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

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;
        }
    }
}
(i=1;i{ 对于(j=n;j>i+1;j--){ 如果(a[j-1]>a[j]){ t=a[j-1]; a[j-1]=a[j]; a[j]=t; } } } 请注意,外部循环将采取
N-1
步骤。内部循环将在
N-2
1
步骤之间进行。我们可以通过说外循环有
N
步数,而内循环将在1到
N
步数之间来进一步近似这一点。那么,内部循环平均需要
N/2
步才能完成


结果是
O(N*N/2)
=
O(N^2)
。因此,您向我们展示的交换代码是
O(N^2)
外部循环执行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)as(n-3),而是将它取为n,并且不考虑** 3和/ 2。使用这种方法计算复杂度是一种近似方法。所以复杂性是n*n的数量级。O(n^2)

当你看到一个循环,然后把它看成是N个步骤。如果存在内部循环,则将其相乘。对于一个循环O(n)。对于两个循环O(n*n)。对于三个回路O(n**n*n)等