我在我的算法书上找到了这段代码,但我无法理解这个例子。
这是代码:
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(n/2)
因为术语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;
}
}
}
但我无法理解。你能向我解释一下这段代码的复杂性吗?尤其是计算复杂性的部分,O(n/2)
因为术语j>i+1
外循环执行 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) 等。
像这样的问题似乎经常出现在这里。这是您的交换代码:
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)
.