Algorithm 大O整数和运行时
我一直在努力学习大O,对我刚刚遇到的一个算法感到困惑。算法是:Algorithm 大O整数和运行时,algorithm,big-o,Algorithm,Big O,我一直在努力学习大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]); } } } void对(int[]数组){ for(int i=0;i
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]);
}
}
}
void对(int[]数组){
for(int i=0;i 对于(int j=i+1;j您的错误是将第二个循环计算为O(1/2n^2)
…
首先,您可以清楚地看到它被限制为N-1
(当j=0时)
第一个循环显然是N
第二个循环的最大值为N-1
…
在此之前,O(N^2)
如果我们再仔细检查一下,
当i=0
,
然后N-2
对于i=1
,
对于i=n-1
,只需一次
这是1/2n(n-1)
=1/2n^2-1/2n
=O(n^2)
注意这也包括外循环的所有迭代!当你说内循环是O(1/2*n(n+1))
时,你实际上是在描述两个循环的big-O复杂性
也就是说,外循环具有复杂性O(N)基本上意味着它的主体运行N次。但是为了计算内循环的复杂度,你已经考虑了外循环的所有迭代,因为你把内循环在外循环的所有迭代中运行的次数加起来。如果你再乘以N,你会说外循环本身是重新运行的第N次
换句话说,您的分析表明,内部循环体(System.out.println
call)的运行次数是总次数的1/2*n(n+1)
倍。这意味着两个循环组合的总复杂度是O(1/2*n(n+1))=O(n^2)
。两个循环组合的总体复杂性描述了最里面的代码运行了多少次。这不是有效的Python代码。@BrenBarn是的,我销毁了那一个。我把它放回Java。为什么你认为第二个循环是1/2*n(n+1)?@BrenBarn首先运行j,执行n-1步,然后是n-2步,然后是n-3步,等等。看起来像(n-1)+(n-2)+(n-3)+…+2+1。整数1到n-1的和是1/2*n*(n+1)。我想。我的数学有点生疏。如果你已经考虑了从外循环开始的所有运行,为什么还要再乘以O(n)
?