【发布时间】:2011-01-10 10:27:49
【问题描述】:
我真的很想知道真正的定义。我试图读一本书,但看不懂。
O:Big-O 表示法最坏的情况。
Θ:Theta 表示法的平均情况。
Ω:欧米茄表示法的最佳情况。
为什么 Wikipedia 仅以 Big-O 表示算法的速度,包括其平均、最佳和最坏情况?怎么不换成那些正式的关键词?
【问题讨论】:
-
大多数人只关心 O,因为它通常是最重要的最坏情况。
标签: big-o
我真的很想知道真正的定义。我试图读一本书,但看不懂。
O:Big-O 表示法最坏的情况。
Θ:Theta 表示法的平均情况。
Ω:欧米茄表示法的最佳情况。
为什么 Wikipedia 仅以 Big-O 表示算法的速度,包括其平均、最佳和最坏情况?怎么不换成那些正式的关键词?
【问题讨论】:
标签: big-o
O、Θ 和 Ω 不代表最坏、平均和最佳情况;尽管它们具有相似的含义。
Big-O 表示法 f(n) = O(g(n)) 表示对于较大的 n 值,f 的增长速度比 g 慢(“n > n0”表示“对于较大的n”在这种情况下)。这并不意味着 g 是最坏的情况:g 可能比最坏的情况更糟(例如,快速排序 also O(n!))。对于更复杂的算法,正在进行研究以确定其实际复杂度的最小 Big-O:原作者大多找到 Big-O 上限。
Ω 符号表示相反(f 增长快于 g),这意味着它可能比最好的情况更好(例如,所有算法都是 Ω(1))。
有许多算法没有单一的函数 g,因此复杂度为 O(g) 和 Ω(g)。例如,插入排序的 Big-O 下限为 O(n²)(这意味着您找不到任何小于 n² 的东西)和 Ω 上限为 Ω(n)。
其他算法可以:归并排序是 O(n log n) 和 Ω(n log n)。当这种情况发生时,它被写为 Θ(n log n),这意味着并非所有算法都具有 Θ 符号复杂度(尤其是具有最坏情况或最佳情况的算法都没有)。
为了摆脱概率非常低的最坏情况,检查平均情况复杂度是相当常见的 - 用不同的函数“favg" 只考虑最可能的结果。因此,对于快速排序,f = O(n²) 是最好的,但 favg = O(n log n)。
【讨论】:
我不确定您在哪里找到这些定义,但我认为它们是不正确的。
最好的、平均的和最坏的情况都是通常超过输入大小的函数。
Big-O、Theta 和 Omega 分别表示任何给定函数的上限、严格和下限。
也就是说,最好的情况有一个大 O、Theta 和 Omega 界限。平均情况和最差情况也是如此。
另请参阅:How do O and Ω relate to worst and best case?
注意:big-O 通常(可以说是错误的)用于表示紧密界限(而不是 Theta)。
让我们考虑一下插入排序的例子。
最好的情况是它已经排序,在这种情况下它将花费线性时间,即 f(n) = k<sub>1</sub>n 时间对于某个常数 k<sub>1</sub>。
k<sub>1</sub>n 是 O(n), Θ(n), Ω(n)。根据定义,我们也可以说是 O(n2), O(n3), ... 或者 Ω(1), Ω(log n) , Ω(log log n), ...,但通常期望它呈现最紧密的界限。
最差和平均的情况是g(n) = k<sub>2</sub>n<sup>2</sup>和h(n) = k<sub>3</sub>n<sup>2</sup>,它们都是O(n2), Θ(n2), Ω(n2).
现在你可能会说:这不是很有用,为什么我们需要三个边界,如果它们总是相同的?为什么我们不到处使用 Theta?
一般来说,您是绝对正确的 - 算法通常仅根据其中一个边界(通常是紧密边界)来描述。
但是,对于某些算法来说,很难准确计算出严格的界限是什么,但很容易获得上限和/或下限。计算Fibonacci numbers 的未优化算法就是这样一个例子——找到an upper bound of O(2n) 和a lower bound of Ω(1.5n) 并不难,但是~θ(1.6n) 的严格界限要困难得多计算。
【讨论】: