我真的想知道真正的定义。我试过看书,却无法理解。
O:Big-O符号最坏情况。
Θ:Theta表示平均情况。
Ω:Omega符号最佳情况。
为什么维基百科代表Big-O算法的速度,包括平均,最佳和最差情况?为什么他们没有取代那些正式的关键词?
答案 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) = k2n2
和h(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 )计算起来要困难得多。