用C ++学习Big O表示法,对于这是O(n)还是O(n2)感到困惑

时间:2014-06-18 07:51:31

标签: c++ algorithm big-o

我使用YouTube学习编程以及我能找到的任何东西。我偶然发现了一些大O问题,我对其中一个问题感到很困惑。

for (int i = 0; i < n; i++)
    for (int j = 0; j < 2; j++)
        cout << i << " " << j << endl;

我的第一个想法是它是O(n 2 )因为有2个for循环。然后我仔细看了一下,注意到内部for循环只从0到2。

根据我的理解,Big O着眼于最糟糕的情况。我的想法是,如果n = 2那么它会导致O(n 2 ),但是所有其他情况都会导致O(n),这让我很困惑。

有人可以解释为什么这是O(n 2 )或O(n)?

5 个答案:

答案 0 :(得分:10)

这是O(n)。当函数f(n)O(n)时,它基本上意味着每个A都有一些常量Bn(至少对于足够大的{{}} {1}} S):

n

换句话说,常量(乘法和加法)不会影响big-O表示法。由于f(n) <= A * n + B 是常量(它不依赖于2),因此它不会反映在big-O表示法中。

在您的情况下,函数n是时间复杂度 - 即程序为大小f输入所花费的固定时间步数。

答案 1 :(得分:5)

从技术上讲,这两者都是,因为Big O是一个上限,所有O(n)也是O(n 2 )。

但是,这是O(n)。实际上是Θ(n)。 (有关区别,请参阅this question。)

大O不是“最糟糕的情况”。一些算法可能具有“平均情况”和“最坏情况”时间复杂度,这可能是非常不同的。例如,快速排序是O(n log n)平均情况和O(n 2 )最坏情况。但是,没有人通常会快速调用O(n 2 )算法。

大O是随着n增加算法复杂度增加的最高限度。 O(n)算法的复杂性最多线性增长。在你的情况下,正如其他答案所解释的那样,内环是恒定时间,因此总时间复杂度是n的线性函数 - 因此,O(n)。

答案 2 :(得分:2)

唯一的&#34;手柄&#34;你有这个&#34;算法&#34;是nn仅用于外循环。

内循环是恒定的时间复杂度,因此总体上你有O(N)。

答案 3 :(得分:2)

无论输入如何,内部循环总是执行两次迭代。因此常数。现在,外循环将执行内循环中的n次操作。因此,其复杂性是内循环复杂性的n倍。总的来说,您将执行n次恒定操作,或者您的复杂性为O(n)

您可以进行一项实验:如果您的算法的复杂性为O(n^2),那么它将为n * 2执行的操作数应该是{n执行操作数的4倍左右1}}。所以试试这个:如果你的算法为n = 100执行K操作,它会为n = 200执行多少次?

答案 4 :(得分:2)

Ο-表示法(上限)

  

此符号为函数提供了一个常数因子的上限。如果有正常量f(n) = O(g(n))n0,我们会写cn0右侧f(n)的值始终位于c g(n)之上或之下Ο(g(n)) = {f(n): there exist positive constants c and n0 such that 0 ≤ f(n) ≤ c g(n) for all n ≥ n0} 1}}。

n

enter image description here

这意味着说你的函数是有序的O(n 2 )或甚至O(n 3 )都是正确的,因为它是一个上限。

但您的计划仅取决于n(因为常量字词对2n 没有影响,n相当于此处{{1}} )因此O(n)是非常接近的上限,因此可以说它的时间复杂度为O(n)。