我正在阅读this 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)。
答案 0 :(得分:2)
Big O描述了当所选参数变大时执行时间如何增长。
在您的示例中,如果我们想要准确,则公式为:
所用时间=时间(开始)+时间(外部循环)* N +时间(继续)* N +时间(不继续)* N ^ 2
可以改写为
所花费的时间= a + b * N + c * N ^ 2
现在,随着N变得越来越大,很明显整体上这将形成抛物线。当N增长到无穷大时,零顺序和一个顺序变得无关紧要。
所花费的时间(大N)〜= c * N ^ 2
最后,由于我们有兴趣讨论定性而不是定量,我们只是将algorirhm描述为N ^ 2
O(N ^ 2)意味着对于较大的N值,该算法的行为大约为c * N ^ 2
它与微积分中的o(x)类似(不同之处在于小o用于参数为零。