Big O 表示法中有 O(n/2) 这样的东西吗?

Is there such a thing as O(n/2) in Big O notation?

我有一个数组,每次递增 2。因为有一半的增量,我会说 O(n/2) 还是 O(n) 因为它是线性的?

O(n)。 Big-O 不关心常数因子。 (或者更确切地说,乘以任意有限因子已经是 big-O 定义的一部分,因此在其中指定另一个常数因子是多余的。)从技术上讲:

定义:f(x) = O(g(x))x -> infinity 当且仅当存在实数 M 和正实数 x0 使得 |f(x)| <= M * |g(x)| 对于所有 x > x0.

但是如果你的g(x)实际上是1/2 h(x),那么你可以创建一个新的M'使得M = 2 M',并这样表达:|f(x)| <= 2M' * |1/2 h(x)| = M'|h(x)| - 即 O(n) 等同于 O(n/2).

换句话说:big-O 表示性能如何随着输入大小的变化而变化。如果你加倍你的数组,你就会加倍你的时间 - 无论你读取每个元素还是每个元素。

这也是在有限数据大小上应用 Big-O 的危险之一:如果你知道你有一万行并且正在两种算法之间进行选择,O(n) 不一定是这种情况将比 O(n^2) 更好——也许后者的每个周期时间非常快,而前者一次研究每个元素几分钟。 big-O 唯一相关的地方是 缩放 .

的度量

用符号O(n)描述的函数集和用符号O(n/2)描述的函数集完全一样,实际上和any constant finite c.

的符号 Ο(c*n) 描述的函数

tl;dr:没关系,两个意思一样。

根据定义 O(n/2) 不是正确的定义方式。即使是 O(n/100) 也不会对符号产生影响。

从实用的角度来说,如果你迭代N/2它会在速度方面更好(快两倍),但它会不是被认为更好比 O(n);使用大 O 表示法。

通常,您想尽一切可能减少它的 Big(O),例如在 O(1) 处线性化。如果这不可能,那么您应该只优化到 N/2 次迭代,或 N/4,等等。