我有一个数组,每次增加两个。由于增量的一半,我会说O(n / 2)或只是O(n),因为它是线性的吗?
答案 0 :(得分:4)
只需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)
相当于O(n)
。
换句话说:big-O表示性能如何随输入大小的变化而变化。如果你将数组翻倍,你的时间会翻倍 - 无论你是阅读每个元素还是其他所有元素。
这也是在有限数据大小上应用Big-O的危险之一:如果你知道你有一万行并且正在两种算法之间进行选择,那么O(n^2)
将不一定是这种情况。优于{{1}} - 也许后者的周期时间非常快,而前者每次研究每个元素几分钟。 big-O相关的唯一地方是缩放的度量。
答案 1 :(得分:1)
符号Ο(n)描述的函数集与符号Ο(n / 2)描述的函数集完全相同,实际上与函数集描述的函数集完全相同。 任何常数有限c的符号Ο(c * n)。
tl; dr:没关系,两者的意思相同。
答案 2 :(得分:0)
根据定义,O(n / 2)不是定义它的正确方法。即使O(n / 100)也不会对符号产生影响。
就实际术语而言,如果你迭代N / 2,它在速度方面会更好(两倍快),但不被认为优于O(n);使用Big O表示法。
通常,您希望尽可能减少其Big(O),例如减少O(1)处的线性。如果那是不可能的,那么只有你应该优化到N / 2次迭代,或N / 4,等等。