在我看来,当人们非正式地谈论算法复杂性时,他们谈论的是大哦。但在正式情况下,我常常会看到偶尔出现大奖的大角落。 我在数学上知道两者之间有什么区别,但在英语中,在什么情况下会使用大哦,当你的意思是大不正确,反之亦然(一个示例算法会受到赞赏)?
奖金:为什么人们在非正式谈话时似乎总是使用大哦?
答案 0 :(得分:92)
Big-O是一个上限。
Big-Theta是一个紧密的界限,即上限和下限。
当人们只担心可能发生的最坏情况时,大O就足够了;即它说“它不会比这更糟糕”。当然,越接近越好,但是一个紧密的界限并不总是很容易计算。
维基百科的以下引用也有一些亮点:
非正式地,特别是在计算机科学中,Big O符号通常是 允许有点滥用来描述渐近的紧束缚 使用Big Theta表示法的地方可能更合适 给定的背景。
例如,在考虑函数
T(n) = 73n
3+ 22n
2+ 58
时,以下所有内容通常都可以接受,但是束缚的紧密度(即下面的子弹2和3)通常比束缚的松弛更强烈(即子弹1) 下文)。
T(n) = O(n
100)
,与T(n) ∈ O(n
100相同)
T(n) = O(n
3)
,与T(n) ∈ O(n
3相同)
- 醇>
T(n) = Θ(n
3)
,与T(n) ∈ Θ(n
3相同)
等效的英语陈述分别为:
T(n)
渐近渐渐增长不超过n
100T(n)
渐近渐渐增长不超过n
3- 醇>
T(n)
渐渐渐渐增长,与n
3 一样快。因此,虽然所有三个陈述都是真的,但逐渐包含更多信息 每。但是,在某些字段中,Big O表示法(上面列表中的项目符号为2) 将比Big Theta表示法更常用(子弹数字3中的 上面列出的)因为增长更慢的函数是更理想的。
答案 1 :(得分:45)
我是一名数学家,我一次又一次地看到并需要大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.跳过细节,因为它们“显而易见”总是会导致误解。没有解决方案。
答案 2 :(得分:19)
因为我的键盘有一个O键 它没有Θ或Ω键。
我怀疑大多数人都是同样懒惰的,当他们的意思是Θ时使用O,因为它更容易输入。
答案 3 :(得分:8)
大O被如此广泛使用的一个原因是因为它得到了如此多的使用。很多人都看到了符号并且认为他们知道它意味着什么,然后自己(错误地)使用它。这种情况发生在程序员身上,他们的正规教育只到目前为止 - 我曾经一度感到内疚。
另一个原因是因为在大多数非希腊语键盘上输入大O比在大theta上键入更容易。
但我认为很多是因为某种偏执狂。我在防御相关的编程方面工作了一段时间(当时对算法分析知之甚少)。在这种情况下,最糟糕的情况表现始终是人们感兴趣的,因为最糟糕的情况可能只是在错误的时间发生。如果发生这种情况的实际可能性是多少,则无关紧要。远远低于船员的所有成员在同一时刻遭受突然侥幸心脏病发作的概率 - 它可能仍然发生。
虽然当然很多算法在非常常见的情况下都是最糟糕的情况 - 经典的例子是按顺序插入二叉树以获得有效的单链表。对平均绩效的“真实”评估需要考虑不同类型投入的相对频率。
答案 4 :(得分:5)
奖金:为什么人们在非正式谈话时似乎总是使用大哦?
因为在大哦,这个循环:
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)
。 big-oh只是一个上限,这使得它更容易计算,因为你不必找到紧束缚。
上述循环仅 big-theta(n)
。
sieve of eratosthenes的复杂性是多少?如果你说O(n log n)
你不会错,但它也不是最好的答案。如果您说big-theta(n log n)
,那就错了。
答案 5 :(得分:3)
因为算法的最佳情况很快,因此它在技术上是一个很大的O,而不是一个大的Theta。
Big O是上限,大Theta是等价关系。
答案 6 :(得分:1)
这里有很多好的答案,但我注意到有些东西丢失了。大多数答案似乎暗示人们使用Big O而不是Big Theta的原因是一个难题,在某些情况下这可能是真的。通常导致Big Theta结果的证据远比导致Big O的结果更为复杂。这通常是正确的,但我不认为这与使用一个分析相比具有很大关系。
在谈论复杂性时,我们可以说很多事情。大O时间复杂性只是告诉我们一个算法保证在内部运行,一个上限。 Big Omega的讨论要少得多,并告诉我们算法保证运行的最短时间,即下限。现在Big Theta告诉我们,对于给定的分析,这两个数字实际上是相同的。这告诉我们应用程序具有非常严格的运行时间,它只能偏离渐近地小于我们复杂度的值。许多算法根本没有上下限,恰好是渐近等价的。
因此,使用Big O代替Big Theta的问题在技术上总是有效的,而使用Big Theta代替Big O只有在Big O和Big Omega恰好相同时才有效。例如,插入排序在n ^ 2时具有BigО的时间复杂度,但其最佳情况是将其Big Omega置于n。在这种情况下,说它的时间复杂度是n或n ^ 2的Big Theta是不正确的,因为它们是两个不同的界限,应该这样对待。
答案 7 :(得分:0)
我见过Big Theta,我很确定我在学校里被教导了。我不得不查一查。这就是维基百科所说的:
Big O是比较函数最常用的渐近符号,尽管在很多情况下Big O可以用BigThetaΘ代替渐近更紧的边界。
来源:Big O Notation#Related asymptotic notation
我不知道为什么人们在正式谈话时会使用Big-O.也许是因为大多数人比Big-Theta更熟悉Big-O?我忘记了Big-Theta甚至存在,直到你提醒我。虽然现在我的记忆得到了恢复,但最终我可能会在谈话中使用它。 :)