Big-oh vs big-theta

Bor*_*ltz 93 algorithm complexity-theory

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

在我看来,当人们非正式地谈论算法复杂性时,他们谈论的是大哦.但是在正式情况下,我经常会看到偶尔出现大oh的大角色.我在数学上知道两者之间有什么区别,但在英语中,在什么情况下会使用大哦 - 当你的意思是大be时不正确,反之亦然(一个示例算法将不胜感激)?

额外奖励:为什么人们在非正式谈话时似乎总是使用大哦?

pol*_*nts 96

Big-O是一个上限.

Big-Theta是一个紧密的界限,即上限下限.

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

也可以看看

相关问题


来自维基百科的以下引用也有一些亮点:

非正式地,尤其是在计算机科学中,Big O符号通常被允许在某种程度上被滥用来描述渐近的紧束缚,其中使用Big Theta符号在给定的上下文中可能更为事实.

例如,当考虑功能T(n) = 73n3 + 22n2时+ 58,以下所有通常都是可接受的,但是绑定的紧密度(即,下面的子弹2和3)通常比结合的松弛(即,下面的子弹1)强烈优选.

  1. T(n) = O(n100),与100相同T(n) ? O(n)
  2. T(n) = O(n3),与3相同T(n) ? O(n)
  3. T(n) = ?(n3),与3相同T(n) ? ?(n)

等效的英文陈述分别为:

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

因此,虽然所有三个陈述都是真的,但每个陈述中都包含越来越多的信息.但是,在某些领域中,Big O符号(上面列表中的2号子弹)比Big Theta符号(上面列表中的3号子弹)更常用,因为增长速度较慢的函数更为理想.

  • "紧张的约束有时难以计算",而且通常也没用,这就回答了"奖金"问题;) (10认同)

Gre*_*erg 47

我是一名数学家,我一次又一次地看到并需要大O,大-Theta和大欧米茄符号,而不仅仅是算法的复杂性.正如人们所说,大The是一个双面的界限.严格地说,当你想要解释算法可以做得多好,并且该算法不能做得更好或没有算法可以做得更好时,你应该使用它.例如,如果您说"排序需要Θ(n(log n))比较最坏情况输入",那么您将解释有一种排序算法使用O(n(log n))比较任何输入; 对于每种排序算法,都有一个输入强制它进行Ω(n(log n))比较.

现在,人们使用O代替Ω的一个狭窄原因是放弃关于最差或平均情况的免责声明.如果你说"排序需要O(n(log n))比较",那么对于有利的输入,该陈述仍然适用.另一个狭窄的原因是,即使一个算法做X需要时间Θ(f(n)),另一个算法可能会做得更好,所以你只能说X本身的复杂性是O(f(n)).

然而,有一个更广泛的原因,即人们非正式地使用O.在人类层面,当反向方面从背景"显而易见"时,总是做出双面陈述是一种痛苦.因为我是一名数学家,所以我总是小心翼翼地说:"如果下雨,我会带伞"或"我可以玩4个球而不是5个球",而不是"我会拿伞,如果它下雨"或"我可以玩弄4球".但是这些陈述的另外一半通常显然是有意或无意的.关于显而易见的事情,只是人性.分裂头发令人困惑.

不幸的是,在数学或算法理论等严格的领域,它也令人困惑,不分裂.当他们应该说Ω或Θ时,人们将不可避免地说O. 跳过细节,因为它们"显而易见"总是会导致误解.没有解决方案.

  • 我不知道"很多",但当然,我已经看过了,我也做过(至少是非正式的).我同意这通常是令人难以接受的混淆,在研究论文中肯定应该避免.但非正式地说,嘿,我们是人类,我们依靠我们修复错误的能力. (4认同)
  • “哦,当他们应该说 Ω 的时候” - 哇!这是一个_严重的_错误!你确定很多人真的这样做吗?(披露:我错误地在stackoverflow上完成了)。 (2认同)
  • @Raffi - 我不知道这个词,但它在这里很完美。当人们说O(N)但他们指的是θ(N)时,这不是任何人的定义,它恰恰是一种含义。同样的事情也发生在数学的其他领域,因为数学语言仍然是人类语言。如果形状 R 是矩形,则通常意味着它不是正方形。当然,有时矩形是正方形,从技术上讲,O(N^2) 算法也可以是 O(N) 算法,因为含义并不严格强制;尽管其中一些接近强制性。 (2认同)

Ax.*_*Ax. 17

因为我的键盘有一个O键.
它没有?还是一个?键.

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

  • 时间为[键盘](http://world.std.com/~jdostale/kbd/SpaceCadet3.jpeg) [升级](http://www.google.com/images?q=space-cadet+keyboard) ! (12认同)

Ste*_*314 8

大O被如此使用的一个原因是因为它得到了如此多的使用.很多人都看到了这种符号,并认为他们知道这意味着什么,然后自己(错误地)使用它.这种情况发生在程序员身上,他们的正规教育只到目前为止 - 我曾经一度感到愧疚.

另一个原因是因为在大多数非希腊语键盘上键入大O比在大theta上键入更容易.

但我认为很多是因为一种偏执狂.我在防御相关的编程方面工作了一段时间(当时对算法分析知之甚少).在这种情况下,最糟糕的情况表现始终是人们感兴趣的,因为最糟糕的情况可能只是在错误的时间发生.如果发生这种情况的实际可能性远远小于船员在同一时刻遭受突然侥幸心脏病发作的概率并不重要 - 它仍然可能发生.

虽然当然很多算法在非常常见的情况下都有最坏的情况 - 经典的例子是按顺序插入二叉树以获得有效的单链表.对平均性能的"真实"评估需要考虑不同类型输入的相对频率.


IVl*_*lad 5

额外奖励:为什么人们在非正式谈话时似乎总是使用大哦?

因为在大哦,这个循环:

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

O(n), O(n^2), O(n^3), O(n^1423424).big-oh只是一个上限,这使得计算更容易,因为你不必找到紧束缚.

但是,上述循环只是 big-theta(n).

eratosthenes筛子的复杂性是多少?如果你说O(n log n)你不会错,但它也不是最好的答案.如果你说big-theta(n log n),那你就错了.