我遇到了关于big-oh的两个略有不同的定义,需要证明它们彼此等效:
定义1: 如果存在常数c和N,使得对于所有n> N,f(n)≤c g(n),则f(n)= O(g(n))。
定义2: 如果存在常数c,对于所有n≥1,f(n)≤c g(n),则f(n)= O(g(n))。
直觉上我知道,如果我们选择c足够大,我们可以像定义2中那样摆脱N。 但是如何证明定义1隐含定义2,反之亦然。
答案 0 :(得分:3)
它们实际上不是等效的,并且(1)是正确的定义。
差异的一个示例是,在(1)n = O(n log(n))
下,但在定义(2)下,不是因为在n=1
上,对于任何c
,{{1 }}。
(1)是正确定义的原因是因为big-O的目的是捕获行为“接近无限”,因此对于小c g(n) = c*1*log(1) = 0 < 1
,应忽略有限数量的特殊情况。 / p>
之所以会出现(2),是因为足以建立big-O。只是没有必要。
答案 1 :(得分:1)
让我更好地解释我对@btilly答案的评论。
当g(n)>0
的所有值都是n
时,两个定义实际上是等效的。这是原因:
首先,当定义2成立时,定义1也成立是永远正确的。实际上,在这种情况下,我们可以选择N=0
。
现在假设对于某个常数c
和某个数字N
满足定义1。如果是N=0
,我们有定义2。如果是N>0
,请考虑以下数量:
c1 := max{f(1)/g(1), ..., f(N)/g(N)}
商之所以有意义,是因为在g(n)
始终为正的情况下。此外,由于
f(n)/g(n) <= c1 (1<=n<=N)
我们得到
f(n) <= c1*g(n) (1<=n<=N)
并且由于f(n) <= c*g(n)
为n>N
,所以发生了
f(n) <= max(c1,c)*g(n) for all n
按照定义2的要求。