困惑于大O符号

时间:2015-12-22 08:50:55

标签: big-o asymptotic-complexity

根据this book,大O意味着:

f(n)= O(g(n))表示c·g(n)是f(n)的上限。因此存在一些常数c,使得f(n)总是≤c·g(n),足够大的n(即,对于某些常数n0,n≥n0)。

我对下面的大O方程有了理解

3n2 - 100n + 6 = O(n2),因为我选择c = 3且3n2> 3n2 - 100n + 6;

3如何成为一个因素?在3n2 - 100n + 6中,如果我们降低低位项-100n和6,那么3n2和3.n2不一样吗?如何解决这个等式?

4 个答案:

答案 0 :(得分:2)

我冒昧地将这个问题略微解释为:

  

为什么formulaformula具有相同的渐近复杂度。

为此,定义应该是双向的。

<小时/> 第一:

formula
formula
formula
formula

然后对于formula,总是满足不等式。

<小时/> 反过来说:

formula
formula
formula
formula

我们向上打开一个抛物线,因此再次有一些formula,之后总是满足不等式。

答案 1 :(得分:1)

y=3x^2 (top graph) vs y=3x^2 - 100x + 6

y = 3n ^ 2(上图)vs y = 3n ^ 2 - 100n + 6

考虑上面的草图。根据您的定义,对于足够大的n(即,对于某些常数n0,n≥n0),3n ^ 2仅需要大于3n ^ 2 - 100n + 6 。在这种情况下,让n0 = 5(它可能会稍微小一些,但是很明显哪个图表在n = 5时更大,所以我们只需要这样做)。

从图中可以清楚地看出,在我们绘制的范围内,3n ^ 2> = 3n ^ 2 - 100n + 6。 3n ^ 2 - 100n + 6大于3n ^ 2的唯一方法就是让它变得更加陡峭。

但3n ^ 2和3n ^ 2 - 100n + 6的梯度分别为6n和6n - 100,因此3n ^ 2 - 100n + 6不能生长得更陡峭,因此必须始终位于下方。

所以你的定义成立 - 3n ^ 2 - 100n + 6&lt; = 3n ^ 2所有n&gt; = 5

答案 2 :(得分:1)

我不是专家,但这看起来与我们在实际分析课程中的相似。

基本上,如果你有类似f(n) = 3n^2 − 100n + 6的东西,那么“增长最快”的术语会“胜出”其他术语,当你真的很大的时候。

所以在这种情况下3n^2超过了100n,当n非常大时。

另一个例子是f(n) = n/n^2f(n) = n! * n^2

第一个变小,因为n根本无法跟上n ^ 2。在第二个例子中n!显然比n ^ 2增长得快,所以我想那个答案应该是f(n) = n!然后,因为n ^ 2在技术上会停止与大n的关系。

像+6这样没有影响它们的术语是常数,因为即使n增长它们也不会增长,因此它们的含量甚至更少。

当n非常大时,这就是所发生的事情。如果你的n是34934854385754385463543856,那么n ^ 2是一个大于100n的地狱,因为n ^ 2 = n * n = 34934854385754385463543856 * 34934854385754385463543856。

答案 3 :(得分:1)

让我们看看您为f(n) in O(g(n))发布的定义:

  

f(n)= O(g(n))表示c·g(n)是f(n)的上限。因此有   存在某个常数c ,使得f(n)总是≤c·g(n),   足够大n (即,对于某些常数n0,n≥n0)。

因此,我们只需要找到一组满足

的常量(c,n0)
f(n) < c · g(n), for all n > n0,                         (+)

但此设置并非唯一。即,找到常数(c,n0)使得(+​​)成立的问题是退化。实际上,如果存在任何这样的常数对,则将存在无限量的不同的这样的对。

请注意,在这里我已经转向严格的不平等,这实际上只是一个品味问题,但我更喜欢后一种惯例。现在,我们可以用更容易理解的术语重新陈述Big-O定义:

  

...如果我们能找到一个常数c,我们可以说f(n)是O(g(n))   f(n)小于c·g(n)或全部n大于n0,即全部   N'GT; N0

现在,让我们看一下你的函数f(n)

f(n) = 3n^2 - 100n + 6                                   (*)

让我们将你的函数描述为它的最高项和另一个函数的总和

f(n) = 3n^2 + h(n)                                       (**)
h(n) = 6 - 100n                                          (***)

我们现在分别研究h(n)和f(n)的行为:

h(n) = 6 - 100n
what can we say about this expression?

    => if n > 6/100, then h(n) < 0, since 6 - 100*(6/100) = 0

        => h(n) < 0, given n > 6/100                     (i)

f(n) = 3n^2 + h(n)
what can we say about this expression, given (i)?

    => if n > 6/100, the f(n) = 3n^2 + h(n) < 3n^2

         => f(n) < c*n^2, with c=3, given n > 6/100      (ii)

确定!

  • 从(ii)我们可以选择常数 c = 3 ,因为我们选择另一个常数n0大于6/100。让我们选择第一个满足此要求的整数: n0 = 1

因此,我们已经证明(+)金为常数集**(c,n0)=(3,1),随后, f(n)在O(n ^ 2)< / em>的

有关渐近行为的参考,请参见例如