[英]What is the Big-O of this Code?
我以为Big-O表示法将为n ^ 3,但输出结果与我的Big O甚至不完全匹配:
int bigO(int [] myArray, int x) {
int count = 0;
for (int i = 0; i < x; i++)
for (int j = i+1; j < x; j++)
for (int k = j+1; k < x; k++) {
System.out.println(myArray[i] + ", " + myArray[j] + ", " +
myArray[k]);
count++;
}
return count;
}
抱歉,我应该用“ x”代替“ n”
这是您的代码的静态分析。 因为循环具有不同的迭代范围,所以最好从最内层的循环开始,然后从内层循环到外层循环。
最内部的for循环具有nj-1
次迭代。
因此,如果查看2个内部循环,则有Sum (nj-1)
次迭代(对于[i+1; n-1]
区间中的j
)。 所以你有(n-(i+1)-1) + (n-(i+2)-1) + ... + (n-(n-1)-1)
迭代,等于(ni-2) + (ni-3) + ... + 1 + 0
,这是一个算术级数,结果为(ni-2)*(ni-1)/2
。
现在,我们遍历外部循环并获得Sum (ni-2)*(ni-1)/2
次迭代(对于i
在[0; n-1]
区间中)。 这等于1/2*Sum(i^2) + (-n+3/2)*Sum(i) + (n^2/2-3n/2+1)*Sum(1)
。 这些总和很容易计算,经过一些重新排列后您会收到: n^3/6 -n^2/2+n/3
3/6 n^3/6 -n^2/2+n/3
,与@JuanLopes的公式相同。
由于您的函数是O(n^3)
( n^3/6 -n^2/2+n/3 = O(n^3)
),因此您的代码没有确切的n^3
迭代。 主导因素是n^3/6
,您将进行大约多次迭代。
Big-O表示法不是算法本身的功能! 它描述了输出相对于输入大小如何随时间/空间“增长”。 定义输入的“大小”,然后您可以计算它的Big-O复杂度。
更改输入的“大小”的定义后,您将获得完全不同的复杂性。
例:
将高斯滤波器应用于大小为X * Y的图像集的算法
所以答案是:您没有定义N
:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.