分类目录:《算法设计与分析》总目录
相关文章:
算法学基础(一):算法学概述
算法学基础(二):分析算法
算法学基础(三):渐进记号
第《算法学基础(二):分析算法》中定义了算法运行时间的增长量级简单地刻画了算法效率,并且还允许我们比较可选算法的相对性能。一旦输入规模 n n n变得足够大,最坏情况运行时间为 Θ ( n lg n ) \Theta(n\lg{n}) Θ(nlgn)的归并排序将战胜最坏情况运行时间为 Θ ( n 2 ) \Theta(n^2) Θ(n2)的插入排序。正如我们在分析插入排序时所做的工作,虽然有时我们能够确定一个算法的精确运行时间,但是通常并不值得花力气来计算它以获得多余的精度。对于足够大的输入,精确运行时间中的倍增常量和低阶项被输入规模本身的影响所支配。
当输入规模足够大,使得只有运行时间的增长量级有关时,我们要研究算法的渐近效率。也就是说,我们关心当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加。通常,渐近地更有效的某个算法对除很小的输入外的所有情况将是最好的选择。
本文以及后文将给出几种标准方法来简化算法的渐近分析。首先定义几类“渐近记号”,其中,我们已经见过的一个例子是 Θ \Theta Θ记号。然后,我们给出算法分析领域经常使用的几种记号约定。
渐近记号、函数与运行时间
正如我们写插入排序的最坏情况运行时间为 Θ ( n 2 ) \Theta(n^2) Θ(n2)时那样,我们将主要使用渐近记号来描述算法的运行时间。然而,渐近记号实际上应用于函数。回顾一下,我们曾把插入排序的最坏情况运行时间刻画为 a n 2 + b n + c an^2 + bn + c an2+bn+c,其中 a a a、 b b b和 c c c是常量。通过把插入排序的运行时间写成 Θ ( n 2 ) \Theta(n^2) Θ(n2),我们除去了该函数的某些细节。因为渐近记号适用于函数,我们所写成的 Θ ( n 2 ) \Theta(n^2) Θ(n2)就是函数 a n 2 + b n + c an^2 + bn + c an2+bn+c,所以上述情况碰巧刻画了插入排序的最坏情况运行时间。
算法分析领域常常对其使用渐近记号的函数通常刻画算法的运行时间。但是渐近记号也可以适用于刻画算法的某个其他方面(例如,算法使用的空间数量)的函数,甚至可以适用于和算法没有任何关系的函数。
即使我们使用渐近记号来刻画算法的运行时间,我们也需要了解意指哪个运行时间。有时我们对最坏情况运行时间感兴趣。然而,我们常常希望刻画任何输入的运行时间。换句话说,我们常常希望做出一种综合性地覆盖所有输入而不仅仅是最坏情况的陈述。我们将看到完全适合刻画任何输入的运行时间的渐近记号。
渐近记号
Θ \Theta Θ记号
在《算法学基础(二):分析算法》中,我们发现插入排序的最坏情况运行时间为
T
(
n
)
=
Θ
(
n
2
)
T(n) = \Theta(n^2)
T(n)=Θ(n2)。这意味着:对一个给定的函数
g
(
n
)
g(n)
g(n),用
Θ
(
g
(
n
)
)
\Theta(g(n))
Θ(g(n))来表示以下函数的集合:
Θ
(
g
(
n
)
)
=
{
f
(
n
)
:
∃
c
1
>
0
,
c
2
>
0
,
n
0
>
0
,
∀
n
≥
n
0
,
0
≤
c
1
g
(
n
)
≤
f
(
n
)
≤
c
2
g
(
n
)
}
\Theta(g(n)) = \{ f(n):\exists \ c_1 > 0, c_2 > 0, n_0 >0,\forall n \geq n_0,0 \leq c_1g(n) \leq f(n) \leq c_2g(n) \}
Θ(g(n))={f(n):∃ c1>0,c2>0,n0>0,∀n≥n0,0≤c1g(n)≤f(n)≤c2g(n)}
若存在正常量 c 1 c_1 c1和 c 2 c_2 c2,使得对于足够大的 n n n,函数 f ( n ) f(n) f(n)能“夹入” c 1 g ( n ) c_1g(n) c1g(n)与 c 2 g ( n ) c_2g(n) c2g(n)之间,则 f ( n ) f(n) f(n))属于集合 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))。因为 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))是一个集合,所以可以记 f ( n ) ∈ Θ ( g ( n ) ) f(n) \in \Theta(g(n)) f(n)∈Θ(g(n)),以指出 f ( n ) f(n) f(n)是 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))的成员。作为替代,我们通常记 f ( n ) = Θ ( g ( n ) ) f(n) = \Theta(g(n)) f(n)=Θ(g(n))以表达相同的概念。因为我们按这种方式活用了等式,所以你可能感到困惑,但是在后面的文章中我们将看到这样做有其好处。
下图(a)给出了函数 f ( n ) f(n) f(n)与 g ( n ) g(n) g(n)的一幅直观画面,其中 f ( n ) = Θ ( g ( n ) ) f(n) = \Theta(g(n)) f(n)=Θ(g(n))。对在 n 0 n_0 n0及其右边 n n n的所有值, f ( n ) f(n) f(n)的值位于或高于 c 1 g ( n ) c_1g(n) c1g(n)且位于或低于 c 2 g ( n ) c_2g(n) c2g(n)。换句话说,对所有 n ≤ n 0 n \leq n_0 n≤n0,函数 f ( n ) f(n) f(n)在一个常量因子内等于 g ( n ) g(n) g(n)。我们称 g ( n ) g(n) g(n)是 f ( n ) f(n) f(n)的一个渐近紧确界。
Θ
(
g
(
n
)
)
\Theta(g(n))
Θ(g(n))的定义要求每个成员
f
(
n
)
∈
Θ
(
g
(
n
)
)
f(n) \in \Theta(g(n))
f(n)∈Θ(g(n))均渐近非负,即当
n
n
n足够大时,
f
(
n
)
f(n)
f(n)非负。其中,渐近正函数就是对所有足够大的
n
n
n均为正的函数。因此,函数
g
(
n
)
g(n)
g(n)本身必为渐近非负,否则集合
Θ
(
g
(
n
)
)
\Theta(g(n))
Θ(g(n))为空。所以我们假设用在
Θ
\Theta
Θ记号中的每个函数均渐近非负。这个假设对本章定义的其他渐近记号也成立。
在《算法学基础(二):分析算法》中我们介绍了 Θ \Theta Θ记号的一种非形式化的概念,相当于扔掉低阶项并忽略最高阶项前的系数。直觉上,一个渐近正函数的低阶项在确定渐近确界时可以被忽略,因为对大的 n n n,它们是无足轻重的。当 n n n较大时,即使最高阶项的一个很小的部分都足以支配所有低阶项。因此,将 c 1 c_1 c1置为稍小于最高阶项系数的值并将 c 2 c_2 c2置为稍大于最高阶项系数的值能使 Θ \Theta Θ记号定义中的不等式得到满足。最高阶项系数同样可以被忽略,因为它仅仅根据一个等于该系数的常量因子来改变 c 1 c_1 c1和 c 2 c_2 c2。
作为一个例子,考虑任意二次函数 f ( n ) = a n 2 + b n + c f(n) = an^2 + bn + c f(n)=an2+bn+c,其中 a a a、 b b b和 c c c均为常量且 a > 0 a > 0 a>0。扔掉低阶项并忽略常量后得 f ( n ) = Θ ( n 2 ) f(n) = \Theta(n^2) f(n)=Θ(n2)。为了形式化地证明相同的结论,我们取常量 c 1 = a 4 c_1 = \frac{a}{4} c1=4a, c 2 = 7 a 4 c_2 = \frac{7a}{4} c2=47a且 n 0 = 2 max ( ∣ b ∣ a , ∣ c ∣ a ) n_0 = 2\max{(\frac{|b|}{a}, \sqrt{\frac{|c|}{a}})} n0=2max(a∣b∣,a∣c∣)。可以证明对所有 n ≥ n 0 n \geq n_0 n≥n0,有 0 ≤ c 1 n 2 ≤ a n 2 + b n + c ≤ c 2 n 2 0 \leq c_1n^2 \leq an^2 + bn + c \leq c_2n^2 0≤c1n2≤an2+bn+c≤c2n2。一般来说,对任意多项式 p ( n ) = ∑ i = 0 d a i n i p(n) = \sum_{i = 0}^d a_in^i p(n)=∑i=0daini,其中 a i a_i ai为常量且 a d > 0 a_d > 0 ad>0,我们有 p ( n ) = Θ ( n d ) p(n) = \Theta(n^d) p(n)=Θ(nd)。
因为任意常量是一个 0 0 0阶多项式,所以可以把任意常量函数表示成 Θ ( n 0 ) \Theta(n^0) Θ(n0)或者 Θ ( 1 ) \Theta(1) Θ(1)。然而,后一种记号是一种轻微的活用,因为该表达式并未指出什么变量趋于无穷e。我们将经常使用记号 Θ ( 1 ) \Theta(1) Θ(1)来意指一个常量或者关于某个变量的一个常量函数。
O O O记号
记号渐近地给出一个函数的上界和下界。当只有一个渐近上界时,使用 O O O记号。对于给定的函数 g ( n ) g(n) g(n),用 O ( g ( n ) ) O(g(n)) O(g(n))来表示以下函数的集合:
O ( g ( n ) ) = { f ( n ) : ∃ c > 0 , n 0 > 0 , ∀ n ≥ n 0 , 0 ≤ f ( n ) ≤ c g ( n ) } O(g(n)) = \{ f(n):\exists \ c > 0, n_0 >0,\forall n \geq n_0,0 \leq f(n) \leq cg(n) \} O(g(n))={f(n):∃ c>0,n0>0,∀n≥n0,0≤f(n)≤cg(n)}
我们使用 O O O记号来给出函数的一个在常量因子内的上界。上图(b)展示了 O O O记号背后的直觉知识。对在 n 0 n_0 n0及其右边的所有值 n n n,函数 f ( n ) f(n) f(n)的值总小于或等于 c g ( n ) cg(n) cg(n)。
我们记 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n))以指出函数 f ( n ) f(n) f(n)是集合 O ( g ( n ) ) O(g(n)) O(g(n))的成员。注意, f ( n ) = Θ ( g ( n ) ) f(n) = \Theta(g(n)) f(n)=Θ(g(n))蕴涵着 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n)),因为 Θ \Theta Θ记号是一个比 O O O记号更强的概念。按集合论中的写法,我们有 Θ ( g ( n ) ) ⊆ O ( g ( n ) ) \Theta(g(n)) \subseteq O(g(n)) Θ(g(n))⊆O(g(n))。因此,关于任意二次函数 f ( n ) = a n 2 + b n + c f(n) = an^2 + bn + c f(n)=an2+bn+c,其中 a > 0 a > 0 a>0,在 Θ ( n 2 ) \Theta(n^2) Θ(n2)中的证明也证明了任意这样的二次函数在 O ( n 2 ) O(n^2) O(n2)中。也许更令人惊奇的是当 a > 0 a > 0 a>0时,任意线性函数 a n + b an + b an+b也在 O ( n 2 ) O(n^2) O(n2)中,我们可以很容易证明这个结论。
但是在文献中,有时我们发现 O O O记号非形式化地描述渐近确界,即已经使用 Θ \Theta Θ记号定义的东西。使用 O O O记号,我们常常可以仅仅通过检查算法的总体结构来描述算法的运行时间。例如,《排序算法(一):插入排序》中插入排序算法的双重嵌套循环结构对最坏情况运行时间立即产生一个 O ( n 2 ) O(n^2) O(n2)的上界:内层循环每次迭代的代价以 O ( 1 ) O(1) O(1)为上界,下标 i i i和 i i i均最多为 n n n,对于 n 2 n^2 n2个 i i i和 j j j值对的每一对,内循环最多执行一次。
既然 O O O记号描述上界,那么当用它来限制算法的最坏情况运行时间时,关于算法在每个输入上的运行时间,我们也有一个界,这就是前面讨论的综合性陈述。因此,对插入排序的最坏情况运行时间的界 O ( n 2 ) O(n^2) O(n2)也适用于该算法对每个输入的运行时间。然而,对插入排序的最坏情况运行时间的界 Θ ( n 2 ) \Theta(n^2) Θ(n2)并未暗示插入排序对每个输入的运行时间的界也是 Θ ( n 2 ) \Theta(n^2) Θ(n2))。例如,我们在当输入已排好序时,插入排序的运行时间为 Θ ( n ) \Theta(n) Θ(n)。从技术上看,称插入排序的运行时间为 O ( n 2 ) O(n^2) O(n2)有点不合适,因为对给定的 n n n,实际的运行时间是变化的,依赖于规模为 n n n的特定输入。当我们说“运行时间为 O ( n 2 ) O(n^2) O(n2)”时,意指存在一个 O ( n 2 ) O(n^2) O(n2)的函数 f ( n ) f(n) f(n),使得对 n n n的任意值,不管选择什么特定的规模为 n n n的输入,其运行时间的上界都是 f ( n ) f(n) f(n)。这也就是说最坏情况运行时间为 O ( n 2 ) O(n^2) O(n2)。
Ω \Omega Ω记号
正如 O O O记号提供了一个函数的渐近上界, Ω \Omega Ω记号提供了渐近下界。对于给定的函数 g ( n ) g(n) g(n),用 Ω ( g ( n ) ) \Omega(g(n)) Ω(g(n))来表示以下函数的集合:
Ω ( g ( n ) ) = { f ( n ) : ∃ c > 0 , n 0 > 0 , ∀ n ≥ n 0 , 0 ≤ c g ( n ) ≤ f ( n ) } \Omega(g(n)) = \{ f(n):\exists \ c > 0, n_0 >0,\forall n \geq n_0,0 \leq cg(n) \leq f(n) \} Ω(g(n))={f(n):∃ c>0,n0>0,∀n≥n0,0≤cg(n)≤f(n)}
上图©给出了 Ω \Omega Ω记号的直观解释。对在 n 0 n_0 n0及其右边的所有值 n n n, f ( n ) f(n) f(n)的值总大于或等于 c g ( n ) cg(n) cg(n)。
根据目前所看到的这些渐近记号的定义,容易证明以下重要定理:对任意两个函数 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n),我们有 f ( n ) = Θ ( g ( n ) ) f(n) = \Theta(g(n)) f(n)=Θ(g(n)),当且仅当 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n))且 f ( n ) = Ω ( g ( n ) ) f(n) = \Omega(g(n)) f(n)=Ω(g(n))。
当称一个算法的运行时间为 Ω ( g ( n ) ) \Omega(g(n)) Ω(g(n))时,我们意指对每个 n n n值,不管选择什么特定的规模为 n n n的输入,只要 n n n足够大,对那个输入的运行时间至少是 g ( n ) g(n) g(n)的常量倍。等价地,我们再对一个算法的最好情况运行时间给出一个下界。例如,插入排序的最好情况运行时间为 Ω ( n ) \Omega(n) Ω(n),这蕴涵着插入排序的运行时间为 Ω ( n ) \Omega(n) Ω(n)。
所以插入排序的运行时间介于 Ω ( n ) \Omega(n) Ω(n)和 O ( n ) O(n) O(n),因为它落入 n n n的线性函数与 n n n的二次函数之间的任何地方。而且,这两个界是尽可能渐近地紧确的:例如,插入排序的运行时间不是 Ω ( n ) \Omega(n) Ω(n),因为存在一个输入,对该输入,插入排序在 Θ ( n ) \Theta(n) Θ(n)时间内运行。然而,这与称插入排序的最坏情况运行时间为 Ω ( n 2 ) \Omega(n^2) Ω(n2)并不矛盾,因为存在一个输入,使得该算法需要 Ω ( n 2 ) \Omega(n^2) Ω(n2)的时间。
o o o记号
由 O O O记号提供的渐近上界可能是也可能不是渐近紧确的。界 2 n 2 = O ( n 2 ) 2n^2 = O(n^2) 2n2=O(n2)是渐近紧确的,但是界 2 n = O ( n 2 ) 2n = O(n^2) 2n=O(n2)却不是。我们使用 o o o记号来表示一个非渐近紧确的上界。形式化地定义 o ( g ( n ) ) o(g(n)) o(g(n))为以下集合:
o ( g ( n ) ) = { f ( n ) : ∀ c > 0 , ∃ n 0 > 0 , ∀ n ≥ n 0 , 0 ≤ f ( n ) ≤ c g ( n ) } o(g(n)) = \{ f(n):\forall \ c > 0, \exist \ n_0 >0,\forall n \geq n_0,0 \leq f(n) \leq cg(n) \} o(g(n))={f(n):∀ c>0,∃ n0>0,∀n≥n0,0≤f(n)≤cg(n)}
例如,
2
n
=
o
(
n
2
)
2n = o(n^2)
2n=o(n2),但是
2
n
2
≠
o
(
n
2
)
2n^2 \neq o(n^2)
2n2=o(n2)。
O
O
O记号与
o
o
o记号的定义类似。主要的区别是在
f
(
n
)
=
O
(
g
(
n
)
)
f(n) = O(g(n))
f(n)=O(g(n))中,界
0
≤
f
(
n
)
≤
c
g
(
n
)
0 \leq f(n) \leq cg(n)
0≤f(n)≤cg(n)对某个常量
c
>
0
c > 0
c>0成立,但在
f
(
n
)
=
o
(
g
(
n
)
)
f(n) = o(g(n))
f(n)=o(g(n)),界
0
≤
f
(
n
)
≤
c
g
(
n
)
0 \leq f(n) \leq cg(n)
0≤f(n)≤cg(n)对所有常量
c
>
0
c > 0
c>0成立。直观上,在
o
o
o记号中,当
n
n
n趋于无穷时,函数
f
(
n
)
f(n)
f(n)相对于
g
(
n
)
g(n)
g(n)来说变得微不足道了,即:
lim
n
→
+
∞
f
(
n
)
g
(
n
)
=
0
\lim_{n \to +\infty}\frac{f(n)}{g(n)} = 0
n→+∞limg(n)f(n)=0
ω \omega ω记号
ω \omega ω记号与 Ω \Omega Ω记号的关系类似于 o o o记号与 O O O记号的关系。我们使用 ω \omega ω记号来表示一个非渐近紧确的下界。它形式化定义是:
ω ( g ( n ) ) = { f ( n ) : ∀ c > 0 , ∃ n 0 > 0 , ∀ n ≥ n 0 , 0 ≤ c g ( n ) ≤ f ( n ) } \omega(g(n)) = \{ f(n):\forall \ c > 0, \exist \ n_0 >0,\forall n \geq n_0,0 \leq cg(n) \leq f(n) \} ω(g(n))={f(n):∀ c>0,∃ n0>0,∀n≥n0,0≤cg(n)≤f(n)}
然而,我们还可以用另一种方式定义
ω
\omega
ω记号:
f
(
n
)
∈
ω
(
g
(
n
)
)
⇔
g
(
n
)
∈
o
(
f
(
n
)
)
f(n) \in \omega(g(n)) \Leftrightarrow g(n) \in o(f(n))
f(n)∈ω(g(n))⇔g(n)∈o(f(n))
同样,关系
f
(
n
)
=
ω
(
g
(
n
)
)
f(n) = \omega(g(n))
f(n)=ω(g(n))也蕴含着:
lim
n
→
+
∞
f
(
n
)
g
(
n
)
=
∞
\lim_{n \to +\infty}\frac{f(n)}{g(n)} = \infty
n→+∞limg(n)f(n)=∞
也就是说,如果这个极限存在,那么当n趋于无穷时, f ( n ) f(n) f(n)相对于 g ( n ) g(n) g(n)来说变得任意大了。
等式和不等式中的渐近记号
我们已经看到渐近记号可以如何用于数学公式中。例如,在介绍 O O O记号记 n = O ( n 2 ) n = O(n^2) n=O(n2)。我们还可能写过 2 n 2 + 3 n + 1 = 2 n 2 + Θ ( n ) 2n^2 + 3n + 1 = 2n^2 + \Theta(n) 2n2+3n+1=2n2+Θ(n)。当渐近记号独立于等式或不等式的右边时,如在 n = O ( n 2 ) n = O(n^2) n=O(n2)中,我们已经定义等号意指集合的成员关系: n ∈ O ( n 2 ) n \in O(n^2) n∈O(n2)。然而,一般来说,当渐近记号出现在某个公式中时,我们将其解释为代表某个我们不关注名称的匿名函数。例如,公式 2 n 2 + 3 n + 1 = 2 n 2 + Θ ( n ) 2n^2 + 3n + 1 = 2n^2 + \Theta(n) 2n2+3n+1=2n2+Θ(n)意指 2 n 2 + 3 n + 1 = 2 n 2 + f ( n ) 2n^2 + 3n + 1 = 2n^2 + f(n) 2n2+3n+1=2n2+f(n),其中 f ( n ) f(n) f(n)是集合 Θ ( n ) \Theta(n) Θ(n)中的某个函数。在这个例子中,假设 f ( n ) = 3 n + 1 f(n) = 3n + 1 f(n)=3n+1,该函数确实在 Θ ( n ) \Theta(n) Θ(n)中。
按这种方式使用渐近记号可以帮助消除一个等式中无关紧要的细节与混乱。例如,在《分治策略(一):基础知识》中,我们把归并排序的最坏情况运行时间表示为递归式 2 T ( n 2 ) + Θ ( n ) 2T(\frac{n}{2}) + \Theta(n) 2T(2n)+Θ(n)。如果只对 T ( n ) T(n) T(n)的渐近行为感兴趣,那么没有必要准确说明所有低阶项,它们都被理解为包含在由项 Θ ( n ) \Theta(n) Θ(n)表示的匿名函数中。
一个表达式中匿名函数的数目可以理解为等于渐近记号出现的次数。例如,在表达式 ∑ O ( i ) \sum O(i) ∑O(i)中,只有一个匿名函数(一个 i i i的函数)。因此,这个表达式不同于 O ( 1 ) + O ( 2 ) + ⋯ + O ( n ) O(1) + O(2) + \cdots + O(n) O(1)+O(2)+⋯+O(n),实际上后者没有一个清晰的解释。
在某些例子中,渐近记号出现在等式的左边,例如: 2 n 2 + Θ ( n ) = Θ ( n 2 ) 2n^2 + \Theta(n) = \Theta(n^2) 2n2+Θ(n)=Θ(n2)。我们使用以下规则来解释这种等式:无论怎样选择等号左边的匿名函数,总有一种办法来选择等号右边的匿名函数使等式成立。因此,我们的例子意指对任意函数 f ( n ) ∈ Θ ( n ) f(n) \in \Theta(n) f(n)∈Θ(n),存在某个函数 g ( n ) ∈ Θ ( n 2 ) g(n) \in \Theta(n^2) g(n)∈Θ(n2),使得对所有的 n n n,有 2 n 2 + f ( n ) = g ( n ) 2n^2 + f(n) = g(n) 2n2+f(n)=g(n)。换句话说,等式右边比左边提供的细节更粗糙。
渐近记号的比较
实数的许多关系性质也适用于渐近比较。下面假定 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n)渐近为正。
传递性
f
(
n
)
=
Θ
(
g
(
n
)
)
and
g
(
n
)
=
Θ
(
h
(
n
)
)
⇒
f
(
n
)
=
Θ
(
h
(
n
)
)
f(n) = \Theta(g(n)) \ \text{and} \ g(n) = \Theta(h(n)) \quad \Rightarrow \quad f(n) = \Theta(h(n))
f(n)=Θ(g(n)) and g(n)=Θ(h(n))⇒f(n)=Θ(h(n))
f
(
n
)
=
O
(
g
(
n
)
)
and
g
(
n
)
=
O
(
h
(
n
)
)
⇒
f
(
n
)
=
O
(
h
(
n
)
)
f(n) = O(g(n)) \ \text{and} \ g(n) = O(h(n)) \quad \Rightarrow \quad f(n) = O(h(n))
f(n)=O(g(n)) and g(n)=O(h(n))⇒f(n)=O(h(n))
f
(
n
)
=
Ω
(
g
(
n
)
)
and
g
(
n
)
=
Ω
(
h
(
n
)
)
⇒
f
(
n
)
=
Ω
(
h
(
n
)
)
f(n) = \Omega(g(n)) \ \text{and} \ g(n) = \Omega(h(n)) \quad \Rightarrow \quad f(n) = \Omega(h(n))
f(n)=Ω(g(n)) and g(n)=Ω(h(n))⇒f(n)=Ω(h(n))
f
(
n
)
=
o
(
g
(
n
)
)
and
g
(
n
)
=
o
(
h
(
n
)
)
⇒
f
(
n
)
=
o
(
h
(
n
)
)
f(n) = o(g(n)) \ \text{and} \ g(n) = o(h(n)) \quad \Rightarrow \quad f(n) = o(h(n))
f(n)=o(g(n)) and g(n)=o(h(n))⇒f(n)=o(h(n))
f
(
n
)
=
ω
(
g
(
n
)
)
and
g
(
n
)
=
ω
(
h
(
n
)
)
⇒
f
(
n
)
=
ω
(
h
(
n
)
)
f(n) = \omega(g(n)) \ \text{and} \ g(n) = \omega(h(n)) \quad \Rightarrow \quad f(n) = \omega(h(n))
f(n)=ω(g(n)) and g(n)=ω(h(n))⇒f(n)=ω(h(n))
自反性
f
(
n
)
=
Θ
(
f
(
n
)
)
f(n) = \Theta(f(n))
f(n)=Θ(f(n))
f
(
n
)
=
O
(
f
(
n
)
)
f(n) = O(f(n))
f(n)=O(f(n))
f
(
n
)
=
Ω
(
f
(
n
)
)
f(n) = \Omega(f(n))
f(n)=Ω(f(n))
对称性
f
(
n
)
=
Θ
(
g
(
n
)
)
⇔
g
(
n
)
=
Θ
(
f
(
n
)
)
f(n) = \Theta(g(n)) \Leftrightarrow g(n) = \Theta(f(n))
f(n)=Θ(g(n))⇔g(n)=Θ(f(n))
f
(
n
)
=
O
(
g
(
n
)
)
⇔
g
(
n
)
=
Ω
(
f
(
n
)
)
f(n) = O(g(n)) \Leftrightarrow g(n) = \Omega(f(n))
f(n)=O(g(n))⇔g(n)=Ω(f(n))
f
(
n
)
=
o
(
g
(
n
)
)
⇔
g
(
n
)
=
ω
(
f
(
n
)
)
f(n) = o(g(n)) \Leftrightarrow g(n) = \omega(f(n))
f(n)=o(g(n))⇔g(n)=ω(f(n))
三分性
对任意两个实数 a a a和 b b b,下列三种情况恰有一种必须成立: a < b a < b a<b, a = b a = b a=b, a > b a > b a>b。虽然任意两个实数都可以进行比较,但不是所有函数都可渐近比较。也就是说,对两个函数 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n),也许 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n))和 f ( n ) = Ω ( g ( n ) ) f(n) =\Omega(g(n)) f(n)=Ω(g(n))都不成立。