Big-O和Little-O表示法之间的区别

时间:2009-09-01 20:22:39

标签: algorithm time-complexity big-o asymptotic-complexity little-o

Big-O 表示法O(n) Little-O 表示法o(n)之间有什么区别?

5 个答案:

答案 0 :(得分:390)

f∈O(g)表示,基本上

  

对于至少一个选择的常量 k > 0,你可以找到常数 a ,使得不等式0< = f(x)< = k g(x)适用于所有x>一个。

请注意,O(g)是此条件所适用的所有函数的集合。

f∈o(g)说,基本上是

  

对于每个选择的常量 k > 0,你可以找到常数 a ,使得不等式0< = f(x)< k g(x)适用于所有x>一个。

再次注意o(g)是一组。

在Big-O中,只需要找到一个特定的乘数 k ,其中不等式超出某些最小值 x

在Little-o中,必须存在最小 x ,在此之后,不管你做出多小的 k ,不平等都会成立,只要它不是否定或为零。

这两个都描述了上限,虽然有点违反直觉,Little-o是更强的说法。如果f∈o(g),则f和g的增长率之间存在比f∈O(g)更大的差距。

视差的一个例子是:f∈O(f)为真,但f∈o(f)为假。因此,Big-O可以被解读为“f∈O(g)意味着f的渐近增长不比g更快”,而“f∈o(g)意味着f的渐近增长严格地慢于g”。这就像<=<

更具体地,如果g(x)的值是f(x)的值的常数倍,则f∈O(g)为真。这就是使用big-O表示法时可以删除常量的原因。

然而,对于f∈o(g)为真,则g必须在其公式中包含x的更高,因此f(x)和g(x)之间的相对间隔当x变大时,实际上必须变大。

使用纯数学示例(而不是参考算法):

对于Big-O,以下情况属实,但如果您使用little-o:

则不然
  • x²∈O(x²)
  • x²∈O(x²+ x)
  • x²∈O(200 *x²)

对于little-o,以下情况属实:

  • x²∈o(x³)
  • x²∈o(x!)
  • ln(x)∈o(x)

注意,如果f∈o(g),这意味着f∈O(g)。例如x²∈(x³)所以x²∈O(x³)也是如此,(再次,将O视为<=,将o视为<

答案 1 :(得分:175)

Big-O对于<为小o。 Big-O是包含上限,而little-o是严格的上限。

例如,函数f(n) = 3n是:

  • 位于O(n²)o(n²)O(n)
  • 不在O(lg n)o(lg n)o(n)

类似地,数字1是:

  • ≤ 2< 2≤ 1
  • 不是≤ 0< 0< 1

这是一张表格,显示了一般概念:

Big o table

(注意:该表是一个很好的指南,但其限制定义应该是superior limit而不是正常限制。例如,3 + (n mod 2)永远在3到4之间振荡。它在O(1)尽管没有正常限制,因为它仍有lim sup:4。)

我建议记住Big-O符号如何转换为渐近比较。比较更容易记住,但不太灵活,因为你不能说n O(1) = P。

答案 2 :(得分:40)

我发现当我无法在概念上掌握某些东西时,想到为什么要使用X 有助于理解X.(不是说你没有尝试过,我只是设置舞台。)

[你知道的]对算法进行分类的常用方法是运行时,通过引用算法的大复杂性,你可以很好地估计哪一个是“更好” - 无论哪个有“最小的“功能在O!即使在现实世界中,O(N)比O(N²)“更好”,除非像超大质量常数等傻事。[/你知道的东西]

假设有一些在O(N)中运行的算法。很好,对吧?但是,让我们说你(你很聪明的人,你)想出一个在O( N / loglogloglogN )中运行的算法。好极了!它更快!但是当你撰写论文时,你会一遍又一遍地写下傻傻的写作。所以你写了一次,你可以说“在本文中,我已经证明算法X,以前可以在时间O(N)中计算,实际上可以在o(n)中计算。”

因此,每个人都知道你的算法更快 - 有多少不清楚,但他们知道它更快。理论上。 :)

答案 3 :(得分:2)

一般

渐近符号是您可以理解的:缩小时函数如何比较?(测试这一点的一种好方法就是使用Desmos之类的工具并玩鼠标滚轮)。特别是:

  • f(n) ∈ o(n)的意思是:在某一点上,您缩小得越多,f(n)将由n主导更多g(n)
  • g(n) ∈ Θ(n)的意思是:在某些时候,缩小不会改变nh(n) ∈ O(n)的比较方式(如果我们删除轴上的刻度,您将无法知道缩放级别)。

最后h表示函数n可以属于这两种类别。当n增加时,它看起来可能很像n,也可能越来越小{{1}。基本上,f(n)g(n)也在O(n)中。

在计算机科学中

在计算机科学中,人们通常会证明给定算法同时接受上限O和下限?。当两个边界都满足时,这意味着我们找到了一种渐近最优算法来解决该特定问题。

例如,如果我们证明算法的复杂度在O(n)?(n)中,则意味着算法的复杂度在Θ(n)中。这就是Θ的定义,它或多或少地转化为“渐近相等”。这也意味着没有算法可以解决o(n)中的给定问题。再说一次,粗略地说“这个问题不能在少于n个步骤中解决”。

O(n)的上限只是意味着即使在最坏的情况下,该算法也将终止于最多n个步骤(忽略所有常数因子,包括乘法和加法)。 ?(n)的下限反过来意味着我们建立了一些示例,这些示例无法用少于n的步骤解决该算法所解决的问题(再次忽略乘法常数和加性常数)。步骤数最多为n,至少为n,因此此问题的复杂度为“恰好为n”。每次我们只是简短地写Θ(n)时,都不必说“忽略常数乘/加因子”。

答案 4 :(得分:0)

大 O 表示法有一个称为小 O 表示法的伴侣。大 O 表示法表示一个函数渐近 no more than 另一个。要说一个函数渐近 less than 另一个函数,我们使用 small-o 表示法。 big-O 和 small-o 符号之间的区别类似于 <=(小于等于)和 <(小于)之间的区别。