我使用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)?
答案 0 :(得分:10)
这是O(n)
。当函数f(n)
为O(n)
时,它基本上意味着每个A
都有一些常量B
和n
(至少对于足够大的{{}} {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;是n
,n
仅用于外循环。
内循环是恒定的时间复杂度,因此总体上你有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
,我们会写c
,n0
右侧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
这意味着说你的函数是有序的O(n 2 )或甚至O(n 3 )都是正确的,因为它是一个上限。
但您的计划仅取决于n
(因为常量字词对大2n
没有影响,n
相当于此处{{1}} )因此O(n)是非常接近的上限,因此可以说它的时间复杂度为O(n)。