我认为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;
}
我的道歉,我应该&#34; x&#34;而不是&#34; n&#34;
答案 0 :(得分:1)
那是因为你的函数不能完全执行n^3
次操作。
实际上,它执行f(n) = (1/6)*n^3 - (1/2)*n^2 + (1/3)*n
次操作(使用polynomial fitting找到它)。
但是,the definition f(n)
O(n^3)
为(1/6)*n^3
。这背后的直觉是:
(1/6)*n^3
是主导因素n^3
在category_paths
。{/ li>的常数因子内增长
答案 1 :(得分:1)
这是您的代码的静态分析。因为循环具有所有不同的迭代范围,所以如果从最内循环开始并从内循环到外循环工作,它是最好的。
最内部的for循环有n-j-1
次迭代。
因此,如果您查看2个内部循环,则会在Sum (n-j-1)
区间内进行j
次迭代([i+1; n-1]
)。所以你有(n-(i+1)-1) + (n-(i+2)-1) + ... + (n-(n-1)-1)
次迭代,等于(n-i-2) + (n-i-3) + ... + 1 + 0
,这是一个算术系列,结果是:(n-i-2)*(n-i-1)/2
。
现在我们遍历外部循环并获得Sum (n-i-2)*(n-i-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
,这与@JuanLopes的公式相同。
由于您的功能是O(n^3)
(n^3/6 -n^2/2+n/3 = O(n^3)
),因此您的代码并没有完全n^3
次迭代。主导因素是n^3/6
,您将有这么多次迭代。
答案 2 :(得分:0)
Big-O表示法不是算法的本身特征!它描述了输出如何相对于输入的大小在时间/空间上“增长”。定义输入的“大小”,您可以计算它的Big-O复杂性。
只要您更改输入的“大小”定义,就会有完全不同的复杂性。
示例:
将高斯滤波器应用于大小为X * Y
的一组图像的算法所以答案是:你没有定义你的N
: - )