我正在阅读Skiena的“算法设计手册”。
第一章阐述了Big O符号的正式定义:
f(n) = O(g(n))
表示c * g(n)
是f(n)
的上限。
即,存在一些常数c
,使f(n)
总是小于或等于c * g(n)
足够大的n。 (即n >= n0
代表一些常数n0
)
这样很好,也很有意义。
然后作者继续描述特定函数的大O:3n^2 - 100n + 6
他说{{1}}不等于O(3n^2 - 100n - 6)
。他的理由是,对于我选择的任何O(n)
,c
总是< c * n
3n^2
时的n>c
。这是真的,但(-100n + 6)
部分呢?
假设我选择c = 1
和n = 2
。
3n^2 - 100n + 6 = 12 - 200 + 6 = -182
且c * n
为1*2
,即2
。 -182
肯定低于2
,那么为什么Skiena会忽略这些条款?
答案 0 :(得分:6)
请注意定义中的n >= n0
。
如果你选择了一些c
和n0
,那么每个 n
> = n0
都必须如此,而不仅仅是{ {1}}。
因此,如果你有n0
和c = 1
,那么n0 = 2
也必须如此,但事实并非如此。
n = 1000
答案 1 :(得分:2)
这是简化。对于每n >= (SQRT(2482)+50)/3 ~= 33.2732249428
,3n ^ 2大于任何100n-6 - 请检查 - 这是简单的等式。因此,O(3n ^ 2)> O(100N-6)。这就是为什么不值得考虑这个部分 - 它没有增加任何价值。
请注意,根据定义,您必须找到(至少一个)c,每个c * n始终为< 3n ^ 2 - 100n + 6,每n大于或等于某个n0(至少一个)。只需选择c = 1000和n0 = 1000,您将看到c和n0始终为真。因为我发现了这样的c和n0而不是陈述O(n)< O(3n ^ 2 - 100n - 6)成立。
但我同意这种简化可能会产生误导。