【发布时间】:2017-05-22 08:31:04
【问题描述】:
我有一点想法,但我不确定。大 O(n) 是大 O(n^2)?如果是,O(n log 2 n) 是 O(n^2)?
【问题讨论】:
-
是的,两种说法都是正确的。您可以松散地将大 O 表示法视为一个上限。
-
您能详细说明一下吗?
标签: time big-o complexity-theory space
我有一点想法,但我不确定。大 O(n) 是大 O(n^2)?如果是,O(n log 2 n) 是 O(n^2)?
【问题讨论】:
标签: time big-o complexity-theory space
O(n) is O(n^2) 可以解释为“对于所有大于 n_0 的值,第二个函数总是大于(或等于)第一个函数,其中 n_0 >= 0。
更具体地说 O(n) is 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),因为 2*n = 0(其中 4 是我们的常数 c)。
我随意选择了 4,它是什么常数 c 无关紧要,只要它确保当 n 增加到超过 n_0 时,第二个函数总是大于第一个函数。在计算机科学中,我们称之为“证人”。所以我可以为 c 选择 3 或 100,甚至 2,它仍然可以工作。只要所有 n >= n_0 的 2*n
下图显示了我的意思。
f(n) = O(g(n)) 意味着对于某个常数 c,我们的函数 f(n) 总是小于函数 g(n)。这是大 O 表示法的更任意定义。
在你的情况下 f(n) = O(n) 和 O(g(n)) = O(n^2)。
幻灯片来源:Andy Mirzaian 教授,约克大学 EECS 3101。
为什么我们使用这种表示法?它可以帮助我们比较算法的速度,从而做出更好的选择。某些类型的算法只能在非常小的输入上运行,因为它们太慢了。例如,如果你的算法 f(n) 是 O(n^30) 并且你的输入大小是一百万个元素,我们甚至在我们运行我们的代码之前就知道这段代码会大大减慢我们的程序,因为 1,000,000^ 30是一个巨大的数字。相反,如果算法 f(n) 是 O(log(n)),那么一百万个元素的计算速度将非常快。
【讨论】:
在简单的外行术语中,Big-Oh(O) 表示法用于设置一段代码需要执行多少时间的上限。
所以考虑这个例子,
用于从
n元素列表中查找元素。简单的案例 将是顺序搜索,需要n比较。所以我们可以 比如说,顺序搜索是O(n)。当我们说它是 O(n) 复杂性,这意味着代码最多占用n比较以完成其执行。这是最大的顺序 搜索需要少于n比较。这也是真的(但不是 精确)如果我们说它比n^2比较少。所以O(n)可以 替换为O(n^2)。但我们通常更喜欢使用尽可能低的 提到 Big-Oh 符号时的上限。
在 Big-Oh 中,任何符号都可以替换为性能较差的表达式,因为 Big-Oh 定义了执行时间的上限。
所以如果一个代码sn-p的复杂度为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!)
希望这会有所帮助! :)
【讨论】: