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,等等。
我有一个数组,每次递增 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,等等。