低阶项在大 O 表示法中的作用
Role of lower order terms in big O notation
在大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) 的含义。但是,如果我只依赖这个常用的函数,我是否会遗漏一些重要的概念?如果我跳过分析那些长函数,我会错过什么?
您的工作中有过中间步骤吗?这就是当你计算一个大 O 时可能的情况,很可能你还不确定最高阶项是什么,因此你跟踪所有这些项然后确定哪个复杂度 class感觉到底。为了理解为什么可以忽略低阶项,还有一些话要说。
采用一些图形算法,例如最小生成树或最短路径。现在,只要看一个算法,你就能知道最高项是什么吗?我知道我不会,所以我会跟踪算法并收集一堆术语。
如果你想要另一个例子,请考虑排序算法以及你是否想记住所有的复杂性。冒泡排序、Shell 排序、合并排序、快速排序、基数排序和堆排序是一些较常见的算法。如果您知道如何跟踪它们,您可以同时记住算法和复杂性,或者只记住算法并从伪代码中推导出复杂性。
让我们首先描述一下我们所说的 f(n) is in O(g(n))
:
的意思
... we can say that f(n) is O(g(n)) if we can find a constant c such
that f(n) is less than c·g(n) or all n larger than n0, i.e., for all
n>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)) 中,即,none-唯一常量对 (c, n0) 用于表明 (+) 成立。可以说常数项对我们分析的结果没有影响,但是可以影响我们对这个结果的推导
让我们看看您的函数以及另一个相关函数
f(n) = 2n^2 + 120n + 5 (x)
h(n) = 2n^2 + 120n + 22500 (xx)
使用与 类似的方法,对于 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)
这意味着如果我们将 (x) 中的 120n
和 5
都替换为 n^2
我们可以得出以下不等式结果:
Given that n > 120, we have:
2n^2 + n^2 + n^2 = 4n^2 > {by (ii)} > 2n^2 + 120n + 5 = f(n) (iii)
从 (iii) 中,我们可以选择 (c, n0) = (4, 120)
,然后 (iii) 表明这些常数满足 f(n)
和 g(n) = n^2
的 (+),因此 [=45] =]
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)
在这种情况下,我们将 (xx) 中的 120n
和 22500
替换为 n^2
,但我们需要 一个大于 n 的约束为这些举行,即n > 150
。因此,我们认为:
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)
,然后(III)表明这些常数满足h(n)
的(+),其中g(n) = n^2
,因此
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)。
本次讨论的核心是:
- 只要您查看
n
的足够大的值,您就可以将关系中的常数项描述为 constant < dominantTerm(n)
,在我们的示例中,我们查看关系关于主导词 n^2
。
- 函数的渐近行为(除了一些非常不寻常的情况外)不依赖于常数项,所以我们不妨根本不看它们。然而,对于某些函数的渐近行为的严格证明,我们还需要考虑常数项。
在大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) 的含义。但是,如果我只依赖这个常用的函数,我是否会遗漏一些重要的概念?如果我跳过分析那些长函数,我会错过什么?
您的工作中有过中间步骤吗?这就是当你计算一个大 O 时可能的情况,很可能你还不确定最高阶项是什么,因此你跟踪所有这些项然后确定哪个复杂度 class感觉到底。为了理解为什么可以忽略低阶项,还有一些话要说。
采用一些图形算法,例如最小生成树或最短路径。现在,只要看一个算法,你就能知道最高项是什么吗?我知道我不会,所以我会跟踪算法并收集一堆术语。
如果你想要另一个例子,请考虑排序算法以及你是否想记住所有的复杂性。冒泡排序、Shell 排序、合并排序、快速排序、基数排序和堆排序是一些较常见的算法。如果您知道如何跟踪它们,您可以同时记住算法和复杂性,或者只记住算法并从伪代码中推导出复杂性。
让我们首先描述一下我们所说的 f(n) is in O(g(n))
:
... we can say that f(n) is O(g(n)) if we can find a constant c such that f(n) is less than c·g(n) or all n larger than n0, i.e., for all n>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)) 中,即,none-唯一常量对 (c, n0) 用于表明 (+) 成立。可以说常数项对我们分析的结果没有影响,但是可以影响我们对这个结果的推导
让我们看看您的函数以及另一个相关函数
f(n) = 2n^2 + 120n + 5 (x)
h(n) = 2n^2 + 120n + 22500 (xx)
使用与 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)
这意味着如果我们将 (x) 中的 120n
和 5
都替换为 n^2
我们可以得出以下不等式结果:
Given that n > 120, we have:
2n^2 + n^2 + n^2 = 4n^2 > {by (ii)} > 2n^2 + 120n + 5 = f(n) (iii)
从 (iii) 中,我们可以选择 (c, n0) = (4, 120)
,然后 (iii) 表明这些常数满足 f(n)
和 g(n) = n^2
的 (+),因此 [=45] =]
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)
在这种情况下,我们将 (xx) 中的 120n
和 22500
替换为 n^2
,但我们需要 一个大于 n 的约束为这些举行,即n > 150
。因此,我们认为:
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)
,然后(III)表明这些常数满足h(n)
的(+),其中g(n) = n^2
,因此
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)。
本次讨论的核心是:
- 只要您查看
n
的足够大的值,您就可以将关系中的常数项描述为constant < dominantTerm(n)
,在我们的示例中,我们查看关系关于主导词n^2
。 - 函数的渐近行为(除了一些非常不寻常的情况外)不依赖于常数项,所以我们不妨根本不看它们。然而,对于某些函数的渐近行为的严格证明,我们还需要考虑常数项。