繁体   English   中英

不同渐近符号之间有什么区别?

[英]What is difference between different asymptotic notations?

我对渐近符号真的很困惑。 据我所知,Big-O 表示法是最差的,omega 是最好的情况,theta 是平均情况。 然而,我总是看到 Big O 无处不在,即使在最好的情况下也是如此。 例如,在以下链接中,请参阅提及不同排序算法的时间复杂度的表格 -

https://en.wikipedia.org/wiki/Best,_worst_and_average_case

表中的每个地方都使用大 O 表示法,无论是最好的情况、最坏的情况还是平均情况。 那么另外两种记法有什么用呢,又用在什么地方呢?

Big O 用于上限,而不是最坏的情况! 没有专门针对最坏情况/最好情况的符号。 您正在谈论的示例都有大 O,因为它们都以给定值为上限。 我建议你再看看你从中学习基础知识的书,因为这对理解非常重要:)

编辑:回答您的疑问 - 因为通常,我们对我们的最高性能感到困扰,即当我们说我们的算法在最佳情况下以 O(logn) 执行时,我们知道它的性能不会比对数时间差在给定的场景中。 这是我们通常寻求减少的上限,因此我们通常会提到大 O 来比较算法。 (并不是说我们从未提及其他两个)

据我所知,Big-O 表示法是最差的,omega 是最好的情况,theta 是平均情况。

他们不是 Omicron 是(渐近)上限,omega 是下界,theta 是界,既是上限又是下界。 如果算法的下界和上限不同,则复杂度无法用 theta 符号表示。

上限、下限、紧边界的概念与最佳、平均、最坏情况的概念正交。 您可以分析每种情况的上限,也可以分析最坏情况的不同界限(以及上述任何其他组合)。

渐近边界总是与表达式中的变量集有关。 例如, O(n)n 最好的、平均的和最坏的情况来自除n所有其他情况。 例如,如果n是元素的数量,那么不同的情况可能来自元素的顺序、唯一元素的数量或值的分布。

然而,我总是看到 Big O 无处不在,即使在最好的情况下也是如此。

这是因为在描述算法时,上限几乎总是最重要和最有趣的上限。 我们很少关心下限。 就像我们很少关心最好的情况一样。

下限有时可用于描述已被证明具有特定复杂性的问题。 例如,已证明所有通用比较排序算法的最坏情况复杂度为Ω(n log n) 如果排序算法也是O(n log n) ,那么根据定义,它也是Θ(n log n)

O(...)基本上意味着“不(远)比...慢”。
它可以用于所有三种情况(“最坏情况不慢于”,“最好情况不慢于”,等等)。

Omega 正好相反:您可以说,某些事情不可能比 ...快得多 同样,它可以用于所有三种情况。 O(...)相比,这并不重要,因为告诉某人“我确定我的程序没有你的快”并没有什么值得骄傲的。

Theta 是一个组合:它“(或多或少)与……一样快”,而不仅仅是更慢/更快。

Big-O表示法类似于这样>=在渐近相等方面。

例如,如果你看到这个:

x = O(x^2)它确实说x <= x^2 (在渐近术语中)。

它确实意味着“x 至多与 x^2 一样复杂”,这是您通常感兴趣的东西。

即使在比较最佳/平均情况时,您也可以说“在最好的输入中,我最多会有这种复杂性”。

有两件事混为一谈:Big O、Omega、Theta 是纯粹的数学结构。 例如,O (f (N)) 是小于 c * f (n) 的函数集,对于某些 c > 0,并且对于所有 n >= 某个最小值 N0。 根据该定义,n = O (f (n^4)),因为 n ≤ n^4。 100 = O (f (n)),因为 n ≥ 100 时 100 <= n,或者 n ≥ 1 时 100 <= 100 * n。

对于算法,您希望给出最坏情况下的速度,平均情况下的速度,很少是最佳情况下的速度,有时是摊销平均速度(即运行一次算法确实有效,再次运行时可以使用。就像计算 n! for n = 1, 2, 3, ... 其中每个计算都可以利用前一个)。 无论你测量什么速度,你都可以用一种符号给出结果。

例如,您可能有一个算法,您可以证明最坏的情况是 O(n^2),但您无法证明是否存在更快的特殊情况,也无法证明该算法实际上并没有更快,就像 O (n^1.9)。 所以 O (n^2) 是唯一可以证明的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM