繁体   English   中英

大O-O(N ^ 2)或O(N ^ 2 +1)吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM