我对渐近符号非常困惑。据我所知,Big-O表示法是最糟糕的演员,omega是最好的情况,theta是平均情况。但是,我总是看到Big O在任何地方都被使用,即使是最好的情况。对于例如在以下链接中,请参阅表中提到了不同排序算法的时间复杂度 -
https://en.wikipedia.org/wiki/Best,_worst_and_average_case
表格中的任何地方都使用大O表示法,无论是最佳情况,最坏情况还是普通情况。那么其他两种符号的用途是什么?我们在哪里使用它?
答案 0 :(得分:1)
大O是上限,不是最坏情况!没有特别针对最坏情况/最佳情况的符号。你所谈论的例子都有Big O,因为它们都是给定值的上限。我建议你再看看你从中学到基础知识的那本书,因为这对于理解非常重要:)
编辑:回答您的疑问 - 因为通常情况下,我们对最高性能感到困扰,即当我们说,我们的算法在最佳情况下以O(logn)执行时,我们知道它的性能不会比给定场景中的对数时间差。它是我们寻求通常减少的上限,因此我们通常会提到大O来比较算法。 (不是说我们从不提及其他两个)
答案 1 :(得分:1)
据我所知,Big-O表示法是最糟糕的演员,omega表示最佳情况,theta表示平均情况。
They aren't。 Omicron用于(渐近)上限,omega用于下限,theta用于紧绑定,它既是上限也是下限。如果算法的下限和上限不同,则复杂性不能用theta表示法表示。
上限,下限,紧束的概念与最佳,平均,最坏情况的概念正交。您可以分析每个案例的上限,并且可以分析最坏情况的不同界限(以及上述任何其他组合)。
渐近边界始终与表达式中的变量集相关。例如,O(n)
与n
有关。最好的,平均的和最差的案例都来自n
以外的所有其他案例。例如,如果n
是元素的数量,则不同的情况可能来自元素的顺序,或唯一元素的数量,或值的分布。
然而,我总是看到Big O在任何地方都被使用,即使是最好的情况。
这是因为当描述算法时,上限几乎总是最重要且最有趣的。我们很少关心下限。就像我们很少关心最好的情况一样。
下限有时在描述问题中有用,该问题已被证明具有特定的复杂性。例如,事实证明,所有一般比较排序算法的最坏情况复杂度为Ω(n log n)
。如果排序算法也是O(n log n)
,那么根据定义,它也是Θ(n log n)
。
答案 2 :(得分:0)
O(...)
基本上意味着“没有(比)慢......”
它可用于所有三种情况(“最坏的情况不慢”,“最好的情况不慢于”,依此类推)。
欧米茄是反对者:你可以说,某些东西不能比更快而不是.......同样,它可以用于所有三种情况。与O(...)
相比,它并不那么重要,因为告诉别人“我确定我的节目并不比你的快”并不值得骄傲。
Theta是一个组合:它“(或多或少)和”......一样快,而不仅仅是更慢/更快。“
答案 3 :(得分:-1)
Big-O
符号在渐近相等方面与>=
类似。
例如,如果您看到:
x = O(x^2)
它确实说x <= x^2
(渐近条件)。
它确实意味着&#34; x最多和x ^ 2&#34;一样复杂,这是你通常感兴趣的东西。
即使您比较最佳/平均情况,也可以说&#34;在最好的输入情况下,我将拥有最大的这种复杂性&#34;。
答案 4 :(得分:-1)
混合起来有两件事:Big O,Omega,Theta,纯粹是数学结构。例如,O(f(N))是小于c * f(n)的函数集,对于某些c> 1。 0,并且对于所有n> =某个最小值N0。根据该定义,n = O(f(n ^ 4)),因为n≤n^ 4。 100 = O(f(n)),因为对于n≥100,100 <= n,或者对于n≥1,100 <= 100 * n。
对于算法,您希望给出最差情况下的速度,平均情况速度,很少是最佳情况下的速度,有时是平均速度的摊销(运行算法时运行算法时可以使用的算法&#39; ; s再次运行。比如计算n!为n = 1,2,3,...其中每个计算都可以利用前一个计算)。无论你衡量什么速度,你都可以在其中一个符号中给出结果。
例如,你可能有一个算法,你可以证明最坏的情况是O(n ^ 2),但你不能证明是否有更快的特殊情况,你也无法证明算法不是&# 39;实际上更快,就像O(n ^ 1.9)。所以O(n ^ 2)是唯一可以证明的东西。