我在算法书上找到了这段代码,但我无法理解这个例子。
以下是代码:
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;
}
}
}
那样计算整个代码的大O.
但我无法理解。你能解释一下这段代码的复杂性吗?特别是由于术语O(n/2)
j>i+1
的部分
答案 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-2
和1
步之间。我们可以通过说外环具有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)等。