编辑:到目前为止,我已经在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,经过大量的阅读后,我觉得自己太困惑了。正如我所说,如果该代码不合适,我可以改变它。
答案 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。