我有一点想法,但我不确定。大O(n)是大O(n ^ 2)?如果是,O(n log 2 n)是O(n ^ 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!)
希望这有帮助! :)
答案 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)。
幻灯片来源:约克大学EECS 3101的Andy Mirzaian教授。
为什么我们使用这种表示法?它有助于我们比较算法的速度,以帮助做出更好的选择。某些类型的算法只能在非常小的输入上运行,因为它们太慢。例如,如果你的算法f(n)是O(n ^ 30)并且你的输入大小是一百万个元素,我们就知道在运行我们的代码之前这段代码将会减慢我们的程序,因为1,000,000 ^ 30是一个庞大的数字。相反,如果算法f(n)是O(log(n)),那么将很快计算出一百万个元素。