低阶词在大O符号中的作用

时间:2015-12-22 17:45:48

标签: big-o asymptotic-complexity

在大O符号中,我们总是说我们应该忽略大多数情况下的常数因素。也就是说,而不是写作,

3N ^ 2-100n + 6

我们几乎总是满意

N ^ 2

因为该术语是等式中增长最快的术语。

但我发现许多算法课程开始将功能与许多术语进行比较

2n ^ 2 + 120n + 5 = n ^ 2的大O

然后在建议最后忽略低阶项之前,为那些长函数找到c和n0。

我的问题是,如果用多个术语来理解和诠释这些功能,我会得到什么?在本月之前,我很清楚理解O(1),O(n),O(LOG(n)),O(N ^ 3)的含义。但是,如果我只依靠这个通常使用的函数,我会错过一些重要的概念吗?如果我跳过分析这些长函数,我会想念什么?

2 个答案:

答案 0 :(得分:3)

让我们首先描述当我们说f(n) is in O(g(n))

时我们的意思
  

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

在等式中:我们需要找到一个一组常量(c,n0)来实现

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

现在,f(n) is in O(g(n))有时以差异形式呈现的结果,例如如f(n) = O(g(n))f(n) ∈ O(g(n)),但声明是相同的。因此,根据您的问题,声明2n^2+120n+5 = big O of n^2只是:

f(n) = 2n^2 + 120n + 5

a result after some analysis: f(n) is in O(g(n)), where

    g(n) = n^2

好的,在这一过程中,我们会在我们想要渐近分析的函数中查看常量项,让我们在教育上看一下它,然后使用你的例子。

任何大O分析的结果都是函数的渐近行为,除了一些非常特殊的情况外,常量项对此行为没有任何影响。然而,常数因子可以影响如何选择常数对(c,n0),用于表示某些函数f(n)和g(n)的f(n)在O(g(n))中,即,用于表示(+)成立的非唯一常数对(c,n0)。我们可以说常量项对我们的分析结果没有影响,但它会影响我们派生这个结果。

让我们看看你的功能以及另一个相关的功能

f(n) = 2n^2 + 120n + 5                                        (x)
h(n) = 2n^2 + 120n + 22500                                    (xx)

使用与this thread类似的方法,对于f(n),我们可以显示:

linear term: 

    120n < n^2 for n > 120 (verify: 120n = n^2 at n = 120)    (i)

constant term:

    5 < n^2 for e.g. n > 3 (verify: 3^2 = 9 > 5)              (ii)

这意味着,如果我们将120n中的5n^2替换为Given that n > 120, we have: 2n^2 + n^2 + n^2 = 4n^2 > {by (ii)} > 2n^2 + 120n + 5 = f(n) (iii) ,我们可以声明以下不等式结果:

(c, n0) = (4, 120)

从(iii)开始,我们可以选择f(n),然后(iii)显示这些常量符合g(n) = n^2 result: f(n) is in O(n^2) 的{​​+},因此

h(n)

现在,对于linear term (same as for f(n)) 120n < n^2 for n > 120 (verify: 120n = n^2 at n = 120) (I) constant term: 22500 < n^2 for e.g. n > 150 (verify: 150^2 = 22500) (II) ,我们类似地:

120n

在这种情况下,我们将22500以及n^2替换为n > 150,但我们需要大于n的约束要保持这些,即Given that n > 150, we have: 2n^2 + n^2 + n^2 = 4n^2 > {by (ii)} > 2n^2 + 120n + 5 = h(n) (III) 。因此,我们有以下几点:

f(n)

(c, n0) = (4, 150)相同,我们可以在这里选择h(n),然后(III)显示这些常量满足{+ 1} g(n) = n^2,{{1}因此

result: h(n) is in O(n^2)

因此,我们对函数f(n)和h(n)都有相同的结果,但是我们必须使用不同的常数(c,n0)来表示这些(即,稍微不同的推导)。最后请注意:

  • 当然,常数(c,n0)=(4,150)(用于h(n)分析)也有效,表明f(n)在O(n ^ 2)中,即(+)成立对于f(n),其中g(n)= n ^ 2.
  • 然而,不是相反的:(c,n0)=(4,120)不能用于表示(+)适用​​于h(n)(g(n)= n ^ 2)。

本讨论的核心是:

  1. 只要你看一下n足够大的值,你就能够将关系中的常数项描述为constant < dominantTerm(n),在我们的例子中,我们看一下关系的关系占主导词n^2
  2. 函数的渐近行为(除了一些非常特殊的情况之外)都不依赖于常数项,所以我们也可以跳过查看它们。但是,对于某些函数的渐近行为的严格证明,我们还需要考虑常数项。

答案 1 :(得分:2)

你的工作中有过中间步吗?这就是你计算一个大O的可能性,很可能你不确定最高阶项是什么,因此你跟踪它们然后确定哪个复杂类最终有意义。还有一些事情要说明,为什么可以忽略低阶项。

采用一些图算法,如最小生成树或最短路径。现在,只需查看一个算法,您就知道最高项将是什么?我知道我不会,所以我会追踪算法并收集一堆术语。

如果您想要其他示例,请考虑排序算法以及是否要记住所有复杂性。冒泡排序,外壳排序,合并排序,快速排序,基数排序和堆排序是一些比较常见的算法。您可以记住算法和复杂性,也可以只记住算法,如果您知道如何跟踪它们,则可以从伪代码中获得复杂性。