Algorithm 大哦-为什么这个不平等是真的?
我正在阅读斯基纳的《算法设计手册》 第一章陈述了大O符号的正式定义: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=
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:最初与您同时发布,但是的,这是正确的想法。