繁体   English   中英

该规范的最大功能是什么?

[英]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”

那是因为您的函数不能完全执行n^3操作。

实际上,它执行f(n) = (1/6)*n^3 - (1/2)*n^2 + (1/3)*n运算(使用多项式拟合找到)。

但是,根据定义f(n)O(n^3) 这背后的直觉是:

  • (1/6)*n^3是主导因素
  • (1/6)*n^3生长的一个常数因子内n^3

这是您的代码的静态分析。 因为循环具有不同的迭代范围,所以最好从最内层的循环开始,然后从内层循环到外层循环。

  • 最内部的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM