这个守则的大O是什么?

时间:2015-09-08 13:53:01

标签: algorithm big-o

我认为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;

3 个答案:

答案 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^3category_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: - )