计算大O复杂度

时间:2015-12-31 01:16:00

标签: java big-o time-complexity

我最终会给这个程序一个类似60,000个400像素图像的输入文件,所以我试着想一想这个代码如何运行大输入。为了便于阅读,我用“blah”替换了不重要的东西,用简单的字母(nnmmkk替换了所有的ArrayList名称。

        for (Perceptron P : nn){
            //blah
        }
        for (Perceptron P : mm) {
            //blah
        }
        for (Perceptron P : kk){
            //blah
        }

        for (Perceptron P : mm) {
            for (int i = 0; i < nn; i++) {
                //blah
            }
            for (int j = 0; j < kk; j++){
                //blah
            }
        }

        for (Perceptron X : nn){
            for (Perceptron Y : mm){
                //blah
            }
        }

        for (Perceptron Z : kk){
            for (Perceptron Y : mm){
                //blah
            }
        }

我认为答案是O(nn+mm+kk+mm(nn+kk)+nnmm+kkmm)。如果我知道nn为400,mm为300,kk为10,则为O(246710)。但是现在我被卡住了。我真的不知道O(246710)是什么意思。我是否必须一次仅针对其中一个变量计算big-O?如果是这样,那会有什么好处呢?我只是想知道这将如何表现。感谢

7 个答案:

答案 0 :(得分:3)

Big-O仅涉及运行时间中最大的术语,在这种情况下为O(mm*(nn+kk))。生成此术语的代码部分是以下嵌套循环:

for (Perceptron P : mm) {
    for (int i = 0; i < nn; i++) {
        //blah
    }
    for (int j = 0; j < kk; j++){
        //blah
    }
}

如果您向我们透露kkmmnn与图片的实际尺寸有何关联,那么我们可以用更有意义的术语为您提供运行时间限制

答案 1 :(得分:1)

O(N)表示程序的执行时间与N成线性比例。因此,O(246710)并不意味着什么。

程序的复杂程度实际上是O(mm *(nn + kk))。这并没有告诉你任何关于输入特定大小需要多长时间的事情(为此,你需要知道所有单个操作需要多长时间),只有当{,1}的大小时... } double,虽然所有其他条件都保持不变,那么你的程序执行的时间大约是以前的两倍。

答案 2 :(得分:1)

Big O并没有按照您的想法使用。它用于确定最坏情况。现在,如果nnmmkk在数据存储中都是线性的,而非嵌套则只是O('the-largest-chain')。现在我们不知道nnmmkk之间的关系,所以我能告诉你的最好的是;因为你从不将它们与自己嵌套,所以它是线性的。

两个快速举例说明它的实际效果。

<强>输入:

int[] arr = {1,2,3}

示例#1

for (int i : arr) {
    // do something
}

Big-O在这种情况下只是O(n),因为你只是从数组的开始到完成迭代,它与元素成正比。

示例#2

for (int i : arr) {
    for (int j : arr) {
        // do something
    }
}

现在输入和算法之间的关系是二次的,给你O(n2)

我建议您使用read over here,或者按照教程进行操作,因为它可以澄清比我的答案更多的内容。

在你的情况下,你永远不会嵌套输入,并且因为没有给出变量之间的直接关系,所以Big-O将只是添加它们。在你的情况下应该是O(mm(nn+kk))

答案 3 :(得分:1)

对于算法的运行时分析,您有Worst-Case, Average-Case, and Best-Case个场景,但算法的顺序比处理器的速度更重要。这与算法执行的操作数相关。 (也称为 n

以下是使用Big-O-Notation的几个示例:

线性:2n^2 + 2n或O(n)。这意味着它需要n次操作,你的共同循环

二次方:number of digits in n或O(n ^ 2)。这在嵌套循环中很常见

对数:{{1}}或O(1)。这在字典中使用,并且在很少的操作之后将访问元素。 (尝试并记住在适用的情况下应用此表现。)

答案 4 :(得分:1)

Big-O表示法表示当大小变为无穷大时输入大小的时间。

首先,您必须决定输入变量。在您的示例中,nn,mm和kk是输入变量。

然后我们计算我们需要做多少次迭代:

nn + mm + kk + mm(nn + kk) + nn + kk

简化:

2nn + 2kk + mm(nn + kk + 1)

我们有3个术语,但是当所有术语都进入无穷大时,只有具有最高asymptotic order of growth的术语才会显着,即 mm(nn + kk + 1)。你应该检查渐近的命令,因为在这个答案中解释它会太长。

我们将 mm(nn + kk + 1)简化为 mm(nn + kk),因为当它变为无穷大时,常数不重要(不不规模。

现在我们有 mm(nn + kk),在这里我们选择 nn kk 中增长较快的一个,如何知道哪个增长更快?这取决于你的输入。假设我们选择nn,那么我们有 O(mm * nn)。属于 O(n ^ 2)类别。

答案 5 :(得分:0)

假设所有输入大小都向无穷大方向移动,那么大O符号应该减少到算法最大的最坏情况分母。

所以你的表达式O(nn + mm + kk + mm(nn + kk)+ nnmm + kkmm)应该减少到O(mmnn + mmkk)。

答案 6 :(得分:0)

我认为关于复杂度O(nn + mm + kk + mm(nn + kk)+ nnmm + kkmm)的确切表达是正确的。它用变量测量复杂度变化,所以不要用变量替换变量,在nn = 400,mm = 300,kk = 10的情况下,它可以简化为O(nn mm)或O(NN ン)