大O - O(N ^ 2)还是O(N ^ 2 + 1)?

时间:2013-12-14 15:11:43

标签: algorithm big-o

我正在阅读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)。

1 个答案:

答案 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用于参数为零。