[英]Big O - O(N^2) or O(N^2 + 1)?
我正在阅读这篇 Big O文章(以及其他一些参考书),试图找出哪些变化会影响我的算法。
因此,给出以下O(N ^ 2)代码:
bool ContainsDuplicates(String[] strings)
{
for(int i = 0; i < strings.Length; i++)
{
for(int j = 0; j < strings.Length; j++)
{
if(i == j) // Don't compare with self
{
continue;
}
if(strings[i] == strings[j])
{
return true;
}
}
}
return false;
}
我进行了以下更改:
bool ContainsDuplicates(String[] strings)
{
for(int i = 0; i < strings.Length; i++)
{
for(int j = 0; j < strings.Length; j++)
{
if(i != j) // Don't compare with self
{
if(strings[i] == strings[j])
{
return true;
}
}
}
}
return false;
}
现在,两个IF都嵌套了,并且删除了“ continue”。 这个算法真的变成O(N ^ 2 +1)吗? 为什么? 据我所知,之前无论如何都存在IF检查,因此最初认为它仍然是O(N ^ 2)。
大O描述的是执行时间如何随着所选参数变大而增加。
在您的示例中,如果我们想要精确,则公式为:
花费的时间=时间(开始)+时间(外部循环)* N +时间(连续)* N +时间(不继续)* N ^ 2
可以改写成
花费的时间= a + b * N + c * N ^ 2
现在,随着N变得越来越大,很明显,总体而言,它的形状将像抛物线。 随着N增长到无穷大,零阶和一阶项变得无关紧要。
花费的时间(大N)〜= c * N ^ 2
最后,由于我们对定性讨论而不是定量讨论感兴趣,因此我们将算法简单地描述为N ^ 2
O(N ^ 2)表示对于大的N值,该算法的行为近似为c * N ^ 2
它与微积分中的o(x)类似(不同之处在于small-o用于参数变为零)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.