大O和小O表示法之间的区别


Answers:


442

f∈O(g)本质上说

对于常数k > 0的至少一种选择,您可以找到一个常数a,使得不等式0 <= f(x)<= kg(x)对于所有x> a成立。

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

f∈o(g)说,本质上

对于常数k > 0的每个选择,您都可以找到常数a,使得不等式0 <= f(x)<kg(x)对于所有x> a成立。

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

在Big-O中,仅需要找到一个特定的乘数k,对于该乘数k,不等式保持在某个最小值x之上。

在Little-o中,必须保证存在一个最小值x,只要将k设为负数或零,无论将k设为多小,不等式都成立。

两者都描述了上限,尽管有点违反直觉,Little-o是更强有力的陈述。如果f∈o(g),则f和g的增长率之间的差距比f∈O(g)时大得多。

差异的一个例证是:f∈O(f)为真,而f∈o(f)为假。因此,Big-O可以理解为“ f∈O(g)表示f的渐近增长不快于g's,而“ f∈o(g)意味着f's的渐近增长严格快于g's”。就像<=vs 一样<

更具体地说,如果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²∈o(x³),因此x²∈O(x³)也成立(同样,将O视为<=o并将o视为<


146
是的-区别在于两个函数是否在渐近上相同。直觉上,我喜欢想到“大-O”的意思是“增长不快于”(即以相同的速度或更慢的速度增长),而“小-O”的意思是“增长绝对慢于”。
菲尔

12
复制到维基百科?这比那里的要好得多。
cloudurfin 2014年

1
@SA是的。在这种棘手的情况下,我给出的关于“ x的更高幂”的简单规则显然不适用。但是,如果您查看下面Strilanc的答案中给出的更严格的限制定义,您想知道的是lim n-> inf(2 ^ n / 3 ^ n)=0。因为(2 ^ n / 3 ^ n) =(2/3)^ n并且因为对于任何0 <= x <1,lim n-> inf(x ^ n)= 0,所以确实2 ^ n = o(3 ^ n)。
Tyler McHenry

1
请注意“在Little-o中,必须确保存在一个最小值x,只要不小于k,只要不小于k或不为零,不等式都成立。” 不是“每个a都有k……”,而是“每个k都有a……”
GA1

1
“在Little-o中,必须确保存在一个最小值x,只要将k设为负数或为零,无论将k设为多小,不等式都成立。” 不,这是不正确的。
菲利波·科斯塔

196

大澳是小邻为<。大O是一个包容的上限,而小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

这是一张表,显示了总体思路:

大o表

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

我建议记住Big-O表示法如何转换为渐进比较。比较起来比较容易记住,但灵活性较差,因为您不能说n O(1) =P。


我有一个问题:第3行和第4行(限制定义列)有什么区别?您能举一个4成立(lim> 0)但不成立3的例子吗?
蒙面侠

3
哦,我知道了。Big Omega适用于lim> 0,Big Oh适用于lim <infinity,Big Theta适用于两个条件都满足的情况,这意味着0 <lim <infinity。
蒙面侠

对于f∈Ω(g),不应该将无穷大的极限计算为> = 1吗?同样对于f∈O(g),1 = <c <∞?
user2963623

1
@ user2963623否,因为严格高于0的有限值(包括0到1之间的值)对应于“相同的渐进复杂度,但是不同的常数因子”。如果您忽略小于1的值,则在常量因子空间而不是渐近复杂性空间中将有一个截止点。
Craig Gidney 2015年

1
@ubadub您在集合上广播了幂运算。这是个松散的符号。
Craig Gidney '18

45

我发现,当我无法从概念上掌握某些内容时,思考为什么要使用X有助于理解X。(并不是说您还没有尝试过,我只是在做准备。)

[您知道的东西]一种常用的算法分类方法是通过运行时,并通过引用算法的大哦复杂度,您可以很好地估算出哪种算法“更好”-哪种算法具有“最小”功能在O!即使在现实世界中,O(N)也比O(N²)“更好”,除非有超质量常数之类的愚蠢事物。[/你知道的东西]

假设有一些算法可以在O(N)中运行。还不错吧?但是,假设您(您是出色的人,您)想出了一种以O(NloglogloglogN)运行的算法。好极了!它更快!但是,当您撰写论文时,您会一遍又一遍地写作而感到愚蠢。因此,您只需编写一次,就可以说:“在本文中,我证明了以前可以在时间O(N)进行计算的算法X实际上可以在o(n)进行计算”。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.