大O和小O符号的区别

Big-O符号O(n)Little-O符号o(n)什么区别?

f∈O(g)基本上是这样说的

对于常数k > 0的至less一个select,可以find一个常数a ,使得不等式0 <= f(x)<= kg(x)对于所有x> a都成立。

请注意,O(g)是这个条件成立的所有函数的集合。

f∈o(g)基本上是这样说的

对于常数k > 0的每一个select,你可以find一个常数a ,使得对于所有x> a,不等式0 <= f(x)<kg(x)。

再次注意,o(g)是一个集合。

在Big-O中,只需要find一个特定的乘数k ,不等式在某个最小值x以上即可

在Little-o中,只要不是负数或零,不pipe你有多less个k ,都有一个x的最小值。

这些都描述了上限,虽然有点反直觉,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的增大而变大。

纯粹使用math例子(而不是参考algorithm):

对于Big-O,以下情况是正确的,但如果您使用little-o,则不会成立:

  • x ^ 2∈O(x ^ 2)
  • x ^ 2∈O(x ^ 2 + x)
  • x ^ 2∈O(200 * x ^ 2)

以下是小o的事实:

  • x ^ 2∈o(x ^ 3)
  • x ^ 2∈o(x!)
  • ln(x)∈o(x)

注意如果f∈o(g),这意味着f∈O(g)。 例如x ^ 2∈o(x ^ 3),所以x ^ 2∈O(x ^ 3)(同样认为O <=

Big-O很less,因为 < 。 Big-O是一个包容性的上界,而little-o是一个严格的上界。

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

  • O(n^2)o(n^2)O(n)
  • 不在O(lg n)o(lg n)o(n)

类似地,数字1是:

  • ≤ 2< 2≤ 1
  • ≤ 0< 0< 1

这是一个表格,显示了一般的想法:

大o表

(注意:表格是一个很好的指导,但是它的极限定义应该是以上限而不是正常极限为例, 3 + (n mod 2)永远在3到4之间振荡,在O(1)尽pipe没有一个正常的限制,因为它仍然有一个限制:4.)

我build议记住Big-O符号如何转换为渐近比较。 比较容易记住,但不太灵活,因为你不能说像n^O(1) = P这样的东西。

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

[你知道的东西]对algorithm进行分类的一种常见方法是运行时,并且通过引用algorithm的大哦的复杂性,可以很好地估计哪一个是“更好的” – 哪一个具有“最小”的function在O! 即使在现实世界中,O(N)比O(N ^ 2)“更好”,除非超级巨量常量等愚蠢的东西。[/

假设有一些algorithm运行在O(N)中。 很好,是吧? 但是让我们说你(你这个聪明的人)提出了一个运行在O(N / loglogloglogN)中的algorithm。 好极了! 它更快! 但是当你写论文的时候,你会一遍又一遍地写这些东西。 所以你写了一次,你可以说:“在本文中,我已经certificatealgorithmX,以前可以在时间O(N)上计算,实际上可以在O(N)中计算。

因此,每个人都知道你的algorithm更快 – 多less不清楚,但他们知道它更快。 理论上。 🙂