在Big-O表示法的定义中,我们只关心C
系数:
f(n) ≤ Cg(n) for all n ≥ k
为什么我们也不关心A
:
f(n) ≤ Cg(n) + A for all n ≥ k
答案 0 :(得分:3)
这里有两种情况需要考虑。首先,假设你的函数g(n)具有g(n)≥1的性质,对于所有“足够大”的n选择。在这种情况下,如果你知道
f(n)≥cg(n)+ A,
然后你也知道
f(n)≥cg(n)+ Ag(n),
所以
f(n)≥(c + A)g(n)。
换句话说,如果你的函数g总是至少为1,那么用cg(n)+ A形式的边界来绑定f(n)相当于用c'g(n)形式边界它对于一些新的常数c'。从这个意义上说,在big-O表示法的定义中增加一些额外的灵活性,至少在这种情况下,不会有所作为。
在算法分析的上下文中,几乎每个你可能绑定的函数g(n)都至少有一个,所以我们可以通过选择g的更大倍数来“咀嚼”额外的附加项
然而,在许多情况下,big-O表示法也用于约束随n增加而减少的函数。例如,我们可以说某些算法给出正确答案的概率是O(1 / n),其中函数1 / n作为n的函数下降到0。在这种情况下,我们使用big-O表示法来讨论函数下降的速度。例如,如果成功概率为O(1 / n 2 ),那么假设n足够大,这比早期的O(1 / n)成功概率更好。在这种情况下,在big-O表示法的定义中允许添加术语实际上会破坏事物。例如,直观地说,函数1 / n 2 比函数1 / n下降到0,并且使用big-O表示法的形式定义,你可以看到这个,因为1 / n 2 ≤1/ n,对于所有n≥1。但是,使用修改后的big-O表示法定义,我们也可以说1 / n = O(1 / n 2 ) ,自
对于所有n≥1,1 /n≤1/ n 2 + 1,
这是正确的,因为加法1项限制了1 / n项,而不是我们最初可能感兴趣的1 / n 2 。
所以对你的问题的长期回答是“如果我们仅将自己限制在g(n)不会降为零的情况下,你上面提出的定义等同于big-O的常规定义” n,并且在g(n)确实将零作为n的函数丢弃的情况下,您的新定义不是特别有用。“
答案 1 :(得分:2)
评论太长了。
Big-O表示法是关于数据变大时会发生什么。换句话说,它是n - >的限制。无穷大。
随着n变大,A
保持不变。相比之下,它变得越来越小。另一方面,g(n)
(可能)越来越大,因此其贡献越来越大。
答案 2 :(得分:1)
A
常量,因此当问题的大小增长时,它不会对复杂性产生太大影响。
当你有100万的成本时,你不在乎你是否将常数因子加起来为100。你关心这100万人的成长(由Cg(n)
产生);例如,如果问题的规模有所增加,它是否会变成2百万。但是,你的常数仍然是100,所以它并不会真正影响整体的复杂性。