BigO表示法:如何在嵌套循环中计算它? (初学者)

时间:2013-01-27 01:19:23

标签: computer-science complexity-theory big-o

编辑:到目前为止,我已经在SO上阅读了大约3个小时,但这对我来说仍然没有多大意义(这意味着我已经完成了我的研究在询问之前)。忘了在OQ中说明。

好吧,我对BigO完全不知所措,在尝试应用其他方法将其应用于我的代码时,对我来说几乎没有任何意义。如果有人可以提供帮助,我想了解如何计算以下BigO。

int i = 0;
int t = 0;
while(i <= 4){
    // Basic instructions
    int s = 0;
    while(s <= 4){
        // Basic instructions
        t + 2;
        if(conditions){ // Checks if a value isn't in a hashset
            for(int r = 0; r <= t; r++){
                // Basic instructions
                if(conditions){ // This statement can make t equal to any number < t, checks if two strings are identical.
                    // Do stuff
                }else{
                    // Do stuff. 
                }
            }
        }else if(condition){
            i++;
        }
        s++;
    }
}

如果需要,我可以把完整的代码放在那里,但据我所知,我认为应该足以帮助我了。

到目前为止,我的想法是(不包括if语句)符号类似于O(n ^ 3),但因为它们是嵌套的(而其他人告诉我的东西)它有点让我失望。

请注意:这不是直接用于作业,但我们已经完成了谈论我们为作业编写的代码及其复杂性的任务。我们被告知要表明我们理解复杂性/正确性(一般而言,不是BigO)以及它是如何应用的,而不是将其应用于我们的代码,因为它太复杂了。我只是在考虑这样做,因为我想更好地了解未来。上面的代码也是一个随机的例子,而不是我的实际代码意味着我仍然需要改变它以适应。

在此先感谢,我们在课堂上只看了30分钟BigO,经过大量的阅读后,我觉得自己太困惑了。正如我所说,如果该代码不合适,我可以改变它。

1 个答案:

答案 0 :(得分:3)

如果不清楚N是什么,那么你可以计算出所有变量的性能,看看哪一个变化更大。在这种情况下,变量是i,s r和t。严格来说,性能是O(i * s * t)。 r不包括在内,因为它计算到t,这是大O中的t来自的地方。

问题是,由于t不能超过2 * s,用t代替2s得到O(i * s * 2s)。这与O(2 * i * s ^ 2)相同。但是,在大O表示法中,所有coefficients都被视为等于1.因此,它变为O(i * s ^ 2)。但是,i和s不能超过4,因为大O只关心最坏的情况,所以它变成O(4 * 4 ^ 2),因为大O只关心最坏的情况。这简化为O(64)。但是,64被认为是系数*。因此,实际的大O是O(1)*。

*注意这不是严格正确的,因为像O(x + 64)这样的情况变为O(x)而不是O(x + 1),在这种情况下,64实际上变为零而不是一。

意思是,目前的算法是O(1),它基本上是输入无关的。这就是为什么评论者会产生一些混淆的原因。

这里的关键是,你可能有多个输入大小变量,它们会独立地影响性能,你也可能有一个output-sensitive algorithm,它的性能基于输入的大小和大小的输出。或者,您可能有一个不受输入大小影响的算法。

有关更详细的说明,请参阅Wikipedia page