Big O符号中是否有O(n / 2)这样的东西?

时间:2015-01-09 04:26:50

标签: arrays big-o

我有一个数组,每次增加两个。由于增量的一半,我会说O(n / 2)或只是O(n),因为它是线性的吗?

3 个答案:

答案 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,等等。