大哦vs big-theta

可能重复:
Θ(n)和O(n)有什么区别?

在我看来,当人们非正式地谈论algorithm的复杂性时,他们谈论的很大哦。 但是在正式的情况下,我经常看到偶尔会出现的大屁股。我从math上知道两者之间的区别,但是在英语中,在什么情况下会使用大哦,当你的意思是大的时候不正确,反之亦然(示例algorithm将被赞赏)?

奖金:为什么人们在非正式谈话时似乎总是用得很大?

大O是一个上界。

Big-Theta是一个紧束缚,即上下界。

当人们只担心可能发生的最坏情况时,大O就足够了; 即它说“不会比这更糟糕”。 当然,越紧密越好,但紧密的边界并不总是容易计算。

也可以看看

  • 维基百科/大O符号

相关问题

  • Θ(n)和O(n)有什么区别?

以下来自维基百科的引用也说明了一点:

非正式地,尤其是在计算机科学中,大O符号经常被允许有些被滥用来描述一个渐近的紧束缚,在某种情况下使用Big Theta符号可能更符合事实。

例如,当考虑一个函数T(n) = 73n 3 + 22n 2 + 58 ,下面的所有条件通常都是可以接受的,但是束缚的紧密性(比如下面的子弹2和3)通常强于束缚松弛即下面的子弹1)。

  1. T(n) = O(n 100 ) ,与T(n) ∈ O(n 100 )
  2. T(n) = O(n 3 ) ,与T(n) ∈ O(n 3 )
  3. T(n) = Θ(n 3 ) ,与T(n) ∈ Θ(n 3 )

相当的英语语句分别是:

  1. T(n)渐近增长不超过n 100
  2. T(n)渐近增长不超过n 3
  3. T(n)渐近地增长到n 3

所以,尽pipe所有这三个陈述都是真实的,但是每一个都包含更多的信息。 然而,在某些领域,大O符号(上面的第2号子弹)比Big Theta符号更常用(上面列表中的第3号符号),因为变得更慢的函数是更可取的。

我是一名math家,我一次又一次地看到并需要大O,大O,大Omega符号,而不仅仅是algorithm的复杂性。 正如人们所说,大泰达是一个双向的边界。 严格地说,当你想解释一个algorithm能做得如何时,你应该使用它,或者那个algorithm不能做得更好,或者没有algorithm可以做的更好。 例如,如果你说“sorting需要Θ(n(log n))比较最坏情况input”,那么你解释说有一个sortingalgorithm使用O(n(log n))比较任何input; 并且对于每个sortingalgorithm,都有一个input强制它进行Ω(n(log n))比较。

现在,人们使用O而不是Ω的一个狭义的理由是放弃关于最坏或平均情况的免责声明。 如果你说“sorting需要O(n(log n))比较”,那么声明仍然适用于有利的input。 另一个狭隘的原因是,即使一个algorithm做X需要时间Θ(f(n)),另一个algorithm可能会更好,所以你只能说X本身的复杂性是O(f(n))。

然而,人们非正式地使用O的原因更为广泛。在人的层面上,当反面从背景中“明显”出现时,总是做出双面的陈述是一种痛苦。 因为我是一名math家,所以在理想的情况下,我总是要小心地说:“只要下雨,我就会带雨伞”,或者“我可以玩弄4个球而不是5个”,而不是“我会拿伞雨“或”我可以玩弄4个球“。 但是这样的陈述的另一半通常显然是有意的或显然不是有意的。 显而易见,这只是人为的天性。 把头发分开是令人困惑的。

不幸的是,在math或algorithm理论等严格的领域,也不会分裂头发。 当他们应该说Ω或者Θ时,人们将不可避免地说O. 跳过细节,因为他们是“明显的”总是导致误解。 没有解决scheme。

因为我的键盘有一个O键。
它没有Θ或Ω键。

我怀疑大多数人同样懒惰,当他们的意思是Θ,因为它更容易打字使用O.

大O被大量使用的一个原因是因为它被大量使用。 许多人看到这个符号,并认为他们知道这意味着什么,然后自己使用它(错误地)。 程序员的这种情况发生了很多,他们的正规教育只到目前为止 – 我自己曾经有罪。

另一个是因为在大多数非希腊语键盘上input一个大O比输出一个大theta更容易。

但我觉得很多是因为一种偏执狂。 我在防御相关的编程方面工作了一段时间(当时对algorithm分析知之甚less)。 在这种情况下,最糟糕的performance总是人们感兴趣的,因为最坏的情况可能发生在错误的时间。 发生这种事件的实际可能性是否远远小于船员全体成员在同一时刻突然遭受侥幸心脏病发作的概率并不重要 – 这种情况仍然可能发生。

当然,很多algorithm在很常见的情况下有最糟糕的情况 – 经典的例子是按顺序插入到二叉树中以获得有效的单链表。 平均绩效的“真实”评估需要考虑到不同types投入的相对频率。

奖金:为什么人们在非正式谈话时似乎总是用得很大?

因为在这个大循环里,

 for i = 1 to n do something in O(1) that doesn't change n and i and isn't a jump 

O(n), O(n^2), O(n^3), O(n^1423424) 。 大哦,只是一个上限,这使得它更容易计算,因为你不必find一个严格的界限。

上面的循环只是 big-theta(n)

Eratosthenes筛的复杂性是什么? 如果你说O(n log n)你不会错的,但也不是最好的答案。 如果你说big-theta(n log n) ,你就错了。

因为有algorithm的最好情况是快速的,因此它在技术上是一个大的O,而不是一个大的Theta。

大O是一个上界 ,大的Theta是一个等价关系

我曾经见过Big Theta,而且我很确定我在学校里学到了不同的东西。 我不得不查看它。 这就是维基百科所说的:

大O是用于比较函数的最常用的渐进表示法,尽pipe在很多情况下,大O可以用大θ代替渐近更紧的边界。

来源: Big O符号#相关的渐近表示法

我不知道为什么人们在正式谈话时使用Big-O。 也许是因为大多数人比Big-Theta更熟悉Big-O? 我忘了Big-Theta甚至存在,直到你提醒我。 尽pipe现在我的记忆力已经恢复了,但我最终可能会在谈话中使用它。 🙂

这里有很多很好的答案,但我注意到有些东西不见了。 大多数的答案似乎暗示了人们为什么用Big O而不是Big Theta的原因是一个难题,在某些情况下这可能是事实。 通常情况下,导致Big Theta结果的证据比导致Big O的结果要复杂得多。这通常是成立的,但我不认为这与使用一个分析结果有很大关系。

谈到复杂性时,我们可以说很多事情。 大时间复杂度只是告诉我们一个algorithm是保证运行的上限。 大欧米茄的讨论要less得多,并告诉我们algorithm保证运行的最小时间,即下限。 现在Big Theta告诉我们,对于一个给定的分析,这两个数字实际上是相同的。 这告诉我们,应用程序有一个非常严格的运行时间,只能偏离一个比我们的复杂度慢的值。 许多algorithm根本没有上下边界,而这些边界恰好是渐近等价的。

所以对于使用Big O代替Big Theta的问题在技术上总是有效的,而使用Big Theta代替Big O只会在Big O和Big Omega恰好相等的情况下有效。 例如,插入sorting在n ^ 2时间复杂度为BigО,但是最好的情况是将大欧米茄放在n。 在这种情况下,说它的时间复杂性是n或n ^ 2的Big Theta是不正确的,因为它们是两个不同的边界,应该这样对待。