【问题标题】:Big-O notation's definitionBig-O 符号的定义
【发布时间】:2011-01-10 10:27:49
【问题描述】:

我真的很想知道真正的定义。我试图读一本书,但看不懂。

O:Big-O 表示法最坏的情况。
Θ:Theta 表示法的平均情况。
Ω:欧米茄表示法的最佳情况。

为什么 Wikipedia 仅以 Big-O 表示算法的速度,包括其平均、最佳和最坏情况?怎么不换成那些正式的关键词?

【问题讨论】:

标签: big-o


【解决方案1】:

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)。

【讨论】:

  • 维克多,请看一下这个question
  • 这个答案不正确。最佳、平均和最差情况是函数,O、Θ 和 Ω 是这些函数的界限。您可以用 O、Θ 或 Ω 表示最佳情况。这就是为什么 Wikipedia 为所有情况都列出了 big-O,而不是为每种情况使用不同的符号。请参阅我在下面发布的答案。
  • "例如,插入排序的 Big-O 下限为 O(n²)(这意味着您找不到任何小于 n² 的值)和 Ω 上限 Ω(n )。” 这是不正确的,它与您的第一句话(正确)相矛盾:“O、Θ 和 Ω 不代表最坏、平均和最好的情况”。插入排序在最佳情况下的时间复杂度为 Θ(n),在平均和最坏情况下为 Θ(n^2)。此外,每个函数 f 都是微不足道的 O(f)、Θ(f) 和 Ω(f),所以这也与您的说法相矛盾:“有许多算法没有单个函数 g,因此复杂度为O(g) 和 Ω(g)。"
【解决方案2】:

我不确定您在哪里找到这些定义,但我认为它们是不正确的。

最好的、平均的和最坏的情况都是通常超过输入大小的函数。

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) 的严格界限要困难得多计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多