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

Algorithm 大哦-为什么这个不平等是真的?,algorithm,big-o,Algorithm,Big O,我正在阅读斯基纳的《算法设计手册》 第一章陈述了大O符号的正式定义: f(n)=O(g(n))表示c*g(n)是f(n)的上界。 i、 e.存在一些常数c,使得f(n)对于足够大的n总是小于或等于c*g(n)。(即,对于某些常数n0,n>=n0) 所以这很好,很有意义 但是作者接着描述了一个特定函数的大O:3n^2-100n+6 他说O(3n^2-100n-6)不等于O(n)。他的理由是,对于我选择的任何c,当n>c时,c*n总是3n^2。这是正确的,但是(-100n+6)部分呢 假设我选择c=

我正在阅读斯基纳的《算法设计手册》

第一章陈述了大O符号的正式定义:

f(n)=O(g(n))
表示
c*g(n)
f(n)
的上界。 i、 e.存在一些常数
c
,使得
f(n)
对于足够大的n总是小于或等于
c*g(n)
。(即,对于某些常数
n0
,n>=n0)

所以这很好,很有意义

但是作者接着描述了一个特定函数的大O:
3n^2-100n+6

他说
O(3n^2-100n-6)
不等于
O(n)
。他的理由是,对于我选择的任何
c
,当
n>c
时,
c*n
总是
3n^2
。这是正确的,但是
(-100n+6)
部分呢

假设我选择
c=1
n=2
3n^2-100n+6=12-200+6=-182


c*n
1*2
,它是
2
-182肯定小于
2
,那么为什么Skiena会忽略这些术语呢?

请注意定义中的
n>=n0

如果您选择一些
c
n0
,则每个
n
=
n0
,而不仅仅是
n0
,都必须为真

因此,如果您有
c=1
n0=2
,那么对于
n=1000
,它也必须是真的,例如,它不是真的

3n^2 - 100n + 6
=> 3(1000)^2 - 100(1000) + 6 = 3 000 000 - 100 000 + 6 = 2 900 006

c.n
=> 1(1000) = 1 000

这是简化。对于每一个
n>=(SQRT(2482)+50)/3~=33.2732249428
,3n^2大于任何100n-6-请检查-这是一个简单的等式。因此O(3n^2)>O(100n-6)。这就是为什么它不值得考虑的部分-它没有增加任何价值

请注意,根据定义,您必须找到(至少一个)c,其中每n大于或等于某些n0(至少一个),每个c*n始终<3n^2-100n+6。只需选择c=1000和n0=1000,您就会看到,对于这些c和n0,它总是正确的。因为我发现这样的c和n0比O(n)
但我同意这种简化可能会产生误导。

没有人真正关心数据集大小为2时的性能如何。即使是冒泡排序也没问题:-)这个想法是高效的算法可以扩展到
N
@Damien的大值,我应该如何解释“足够大的N”这个短语,这只是一个选择常数c然后使N真正大的问题吗?读了Dukeling的答案,有人会同意斯基纳应该把短语“足够大的n”改为“n的所有值>=某个常数”@patchwork:最初与您同时发布,但是的,这是正确的想法。