Big-O表示法O(n)
和Little-O表示法有o(n)
什么区别?
Big-O表示法O(n)
和Little-O表示法有o(n)
什么区别?
Answers:
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则不适用:
以下是适用于little-o的情况:
注意,如果f∈o(g),则意味着f∈O(g)。例如x²∈o(x³),因此x²∈O(x³)也成立(同样,将O视为<=
o并将o视为<
)
a
都有k
……”,而是“每个k
都有a
……”
大澳是小邻为≤
是<
。大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
这是一张表,显示了总体思路:
(注意:该表是一个很好的指南,但其限制定义应使用上级限制而不是正常限制。例如,3 + (n mod 2)
永远在3到4之间振荡。O(1)
尽管没有正常限制,它仍然处于,因为它仍然具有a lim sup
:4.)
我建议记住Big-O表示法如何转换为渐进比较。比较起来比较容易记住,但灵活性较差,因为您不能说n O(1) =P。
我发现,当我无法从概念上掌握某些内容时,思考为什么要使用X有助于理解X。(并不是说您还没有尝试过,我只是在做准备。)
[您知道的东西]一种常用的算法分类方法是通过运行时,并通过引用算法的大哦复杂度,您可以很好地估算出哪种算法“更好”-哪种算法具有“最小”功能在O!即使在现实世界中,O(N)也比O(N²)“更好”,除非有超质量常数之类的愚蠢事物。[/你知道的东西]
假设有一些算法可以在O(N)中运行。还不错吧?但是,假设您(您是出色的人,您)想出了一种以O(N ⁄ loglogloglogN)运行的算法。好极了!它更快!但是,当您撰写论文时,您会一遍又一遍地写作而感到愚蠢。因此,您只需编写一次,就可以说:“在本文中,我证明了以前可以在时间O(N)进行计算的算法X实际上可以在o(n)进行计算”。
因此,每个人都知道您的算法更快-还不清楚多少,但是他们知道它更快。从理论上讲。:)