Big-O Notation 中的 O 是什么意思?

What does the O in Big-O Notation mean?

在分析算法的复杂性的背景下,我正在努力思考 Landau-Notation 的含义。

O 在大 O 表示法中的正式含义是什么?

所以我的理解是 O(g(x)) 给出了一个 set 函数,其增长速度或比 g(x) 慢,这意味着,例如在 O(n^2) 的情况下:

例如,t(x) 可能是 x + 3 或 x^2 + 5。我的理解正确吗?

另外,下面的记法正确吗?

我看到一位导师写下了以下内容。这是什么意思?如果 O-Notation returns 一组,你怎么能使用 less or equal?

我也可以这样写吗?

So the way I understand it is that O(g(x)) gives a set of functions which grow as rapidly or slower as g(x).

这个Big-Oh符号的解释是正确的。

f(n) = n^2 + 5n - 2, f(n) is an element of O(n^2)

是的,我们可以这么说。 O(n^2) 用简单的英语表示“所有增长速度等于或慢于 n^2 的函数的集合”。因此,f(n) 满足该要求。

O(n) is a subset of O(n^2), O(n^2) is a subset of O(2^n)

这个符号是正确的,它来自定义。 O(n) 中的任何函数也都在 O(n^2) 中,因为它的增长速度比 n^2 慢。 2^n 是指数时间复杂度,而 n^2 是多项式。当 n 趋于无穷大时,您可以取 n^2 / 2^n 的极限,并证明 O(n^2)O(2^n) 的子集,因为 2^n 变大了.

O(n) <= O(n^2) <= O(2^n)

这个符号很棘手。正如 here 所解释的那样,对于集合,我们没有“小于或等于”。我认为 tutor 的意思是属于集合 O(n) 的函数的时间复杂度小于(或等于)属于集合 O(n^2) 的函数的时间复杂度。反正这个记号看起来不太眼熟,教科书上最好不要出现这种含糊不清的地方。

O(g(x)) gives a set of functions which grow as rapidly or slower as g(x)

这在技术上是正确的,但有点不精确。更好的描述包含附录

O(g(x)) gives the set of functions which are asymptotically bounded above by g(x), up to constant factors.

这看起来像是吹毛求疵,但从不精确的定义中得出的一个推论是错误的。

你的第一个等式的 'fixed version',如果你使变量匹配并且有一个极限符号,似乎是:

这是不正确的:比率只需要小于或等于某个固定常数c > 0

这是正确的版本:

其中 c 是一些固定的正实数,不依赖于 n

例如,f(x) = 3 (n^2)O(n^2) 中:适用于此 f 的一个常量 cc = 4。请注意,要求不是 'for all c > 0',而是 'for at least one constant c > 0'

你的其他评论都是准确的。该表达式中的 <= 符号是一种不寻常的用法,但如果 <= 表示集合包含,则为真。我不会担心那个表达的意思。


还有其他更微妙的原因可以谈论 'boundedness' 而不是增长率。例如,考虑 cosine 函数。 |cos(x)|O(1) 中,但它的导数从负一波动到正一,即使 x 增加到无穷大。

如果你把 'growth rate' 当作导数之类的东西,像这样的例子就很难说了,但是说 |cos(x)|2 的限制就很清楚了。

一个更好的例子,考虑 logistic curve。逻辑函数是 O(1),但是,它的导数和增长率(在正数上)是正的。它严格 increasing/always 增长,而 1 的增长率为 0。这似乎与第一个定义冲突,没有对 'grow' 的含义进行大量额外的澄清。

O(1)中的一个不断增长的函数(图片来自维基百科link):