Big-O表示法定义

时间:2011-01-10 10:27:50

标签: big-o

我真的想知道真正的定义。我试过看书,却无法理解。

O:Big-O符号最坏情况。
Θ:Theta表示平均情况。
Ω:Omega符号最佳情况。

为什么维基百科代表Big-O算法的速度,包括平均,最佳和最差情况?为什么他们没有取代那些正式的关键词?

2 个答案:

答案 0 :(得分:12)

O,Θ和Ω不代表最差,平均和最佳情况;虽然它们有类似的含义。

Big-O表示法f(n)= O(g(n))表示对于大的n值,f增长慢于g(“n> n 0 ”表示“对于大值n“在这种情况下)。这并不意味着g是最坏的情况:g可能比最坏的情况更糟糕(快速排序 O(n!))。对于更复杂的算法,正在进行研究以确定最小的Big-O的实际复杂性:原作者大多发现Big-O上限。

Ω表示反向(f增长快于g),这意味着它可能比最佳情况更好(例如,所有算法都是Ω(1))。

有许多算法没有单一函数g,因此复杂度都是O(g)和Ω(g)。例如,插入排序具有O(n²)的Big-O下界(意味着您找不到小于n²的任何值)和Ω(n)的Ω上界。

其他算法可以:合并排序是O(n log n)和Ω(n log n)。当发生这种情况时,它被写为Θ(n log n),这意味着并非所有算法都具有Θ符号复杂度(并且值得注意的是,具有最坏情况或最佳情况的算法没有一个)。

为了摆脱具有极低概率的最坏情况,检查平均情况复杂度是相当普遍的 - 用左边的标准“f”值替换不同的函数“f avg < / sub>“只考虑最可能的结果。所以,为了快速排序,f = O(n²)是你能得到的最好的,但f avg = O(n log n)。

答案 1 :(得分:3)

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

最佳,平均和最差情况都是通常超过输入大小的所有函数。

Big-O,Theta和Omega分别表示任何给定函数的上限,下限和下限。

也就是说,最好的情况是大O,Theta和Omega绑定。平均和最差情况也是如此。

另请参阅:How do O and Ω relate to worst and best case?

注意:big-O通常(可以说是错误的)用于表示紧束缚(而不是Theta)。

让我们考虑插入排序的例子。

最好的情况是它已经排序,在这种情况下,它需要线性时间,即f(n) = k1n时间为某个常数k1

k1n是O(n),Θ(n),Ω(n)。根据定义,我们也可以说它是O(n 2 ),O(n 3 ),......或Ω(1),Ω(log n) ,Ω(log log n),...,但通常期望它呈现出最严格的界限。

最差和平均情况是g(n) = k2n2h(n) = k3n2,它们都是O(n 2 ),Θ(n 2 ), Ω(N 2 )。

现在你可能会说:这不是很有用,为什么我们需要三个界限,如果它们总是一样的?为什么我们不到处都使用Theta?

一般来说,你是绝对正确的 - 算法通常只用一个边界来描述(通常是紧束缚)。

然而,对于某些算法,很难确切地知道紧束是什么,而很容易得到上限和/或下限。用于计算Fibonacci numbers的未经优化的算法就是这样一个例子 - 找到an upper bound of O(2n)a lower bound of Ω(1.5n)并不难,但是〜θ的紧束缚(1.6 n )计算起来要困难得多。