当有人说Big O(n)是Big O(n ^ 2)时,它意味着什么?

时间:2017-05-22 08:31:05

标签: time big-o complexity-theory space

我有一点想法,但我不确定。大O(n)是大O(n ^ 2)?如果是,O(n log 2 n)是O(n ^ 2)?

2 个答案:

答案 0 :(得分:0)

简单的外行术语中,Big-Oh(O)表示法用于设置一段代码需要执行的时间的上限。

所以考虑这个例子,

  

用于从n元素列表中查找元素。这个简单的案例   将是顺序搜索,需要n比较。所以我们可以   比方说,顺序搜索是O(n)。当我们说它是O(n)   复杂性,这意味着代码最多需要n   比较完成执行。这是最大顺序   搜索需求少于n次比较。这也是事实(但不是   (如果我们说它比n^2比较少。所以O(n)可以   由O(n^2)取代。但我们通常更愿意使用尽可能低的   提到Big-Oh表示法的上限。

在Big-Oh中,任何符号都可以被表达式替换,因为Big-Oh定义了执行时间的上限。 因此,如果代码段的复杂性为O(n),那么它也是O(n^2)O(n^3)O(n!)O(2^n)等。

表现最好到最差,(左边一个是最好的,最右边一个是最差的)

O(1) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(2^n) > O(n!)

回到Big-Oh表示法,这是最好到最差的列表。 Big-Oh notation chart

希望这有帮助! :)

答案 1 :(得分:0)

O(n)是O(n ^ 2)可以解释为"对于大于n_0的所有值,第二函数总是大于(或等于)第一函数,其中n_0> = 0。

更具体地说 O(n)是O(n ^ 2)表示存在一些常量(称为c)和n的某个值(称为n_0),这样如果n大于或等于n_0则第二个函数将始终大于(或等于)第一个函数。

您可能还会遇到这种符号O(n)= O(n ^ 2),这意味着与O(n)相同的是O(n ^ 2)。

例如,如果我在java中有一个for循环,它在大小为n的相同列表中迭代两次,那么它就是O(n)。为什么?它将访问每个元素两次,这意味着将进行2 * n总访问,因此2 * n是O(n),因为对于所有n> = 0,其中2 * n <= 4 * n(其中4是我们的常数c )。

我随意挑选了4个,它不是什么常数c,只要它确保第二个函数总是大于第一个函数,因为n增加超过n_0。在计算机科学中,我们称之为“见证人”。所以我本来可以选择3或100,甚至2来获得c,它仍然有效。只要2 * n&lt; = c * n对于所有n> = n_0(其中n_0也是一些常数),则2 * n是O(n)。

下图显示了我的意思。

f(n)= O(g(n))表示对于某些常数c,我们的函数f(n)总是小于函数g(n)。这是对大O符号的更为随意的定义 在你的情况下,f(n)= O(n)和O(g(n))= O(n ^ 2)。

enter image description here 幻灯片来源:约克大学EECS 3101的Andy Mirzaian教授。

为什么我们使用这种表示法?它有助于我们比较算法的速度,以帮助做出更好的选择。某些类型的算法只能在非常小的输入上运行,因为它们太慢。例如,如果你的算法f(n)是O(n ^ 30)并且你的输入大小是一百万个元素,我们就知道在运行我们的代码之前这段代码将会减慢我们的程序,因为1,000,000 ^ 30是一个庞大的数字。相反,如果算法f(n)是O(log(n)),那么将很快计算出一百万个元素。