大哦 - 为什么这种不平等是真的?

时间:2014-01-03 07:51:48

标签: algorithm big-o

我正在阅读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 = 1n = 2。     3n^2 - 100n + 6 = 12 - 200 + 6 = -182

c * n1*2,即2-182肯定低于2,那么为什么Skiena会忽略这些条款?

2 个答案:

答案 0 :(得分:6)

请注意定义中的n >= n0

如果你选择了一些cn0,那么每个 n> = n0都必须如此,而不仅仅是{ {1}}。

因此,如果你有n0c = 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)成立。

但我同意这种简化可能会产生误导。