渐近记号、函数与运行时间
Θ 记 号 \Theta记号 Θ记号
对一个给定的函数
g
(
n
)
g(n)
g(n),用
Θ
(
g
(
n
)
)
\Theta(g(n))
Θ(g(n))来表示一下函数的集合:
Θ
(
g
(
n
)
)
=
{
f
(
n
)
:
存
在
正
常
量
c
1
、
c
2
和
n
0
,
使
得
对
所
有
n
≥
n
0
,
有
0
≤
c
1
g
(
n
)
≤
f
(
n
)
≤
c
2
g
(
n
)
}
\Theta(g(n))=\{f(n):存在正常量c_1、c_2和n_0,\\ 使得对所有n\geq n_0,有0\leq c_1g(n)\leq f(n)\leq c_2g(n)\}
Θ(g(n))={f(n):存在正常量c1、c2和n0,使得对所有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))以表达相同的概念。
下图给出了函数 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\geq 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)非负。因此,函数 g ( n ) g(n) g(n)本身必为渐近非负,否则集合 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))为空。所以我们假设用渐近记号中的函数都渐近非负。
O O O记号
Θ
\Theta
Θ记号渐近地给出一个函数的上界跟下界。当只有一个渐近上界时,使用
O
O
O记号。
Θ
(
g
(
n
)
)
=
{
f
(
n
)
:
存
在
正
常
量
c
和
n
0
,
使
得
对
所
有
n
≥
n
0
,
有
0
≤
f
(
n
)
≤
c
g
(
n
)
}
\Theta(g(n))=\{f(n):存在正常量c和n_0,\\ 使得对所有n\geq n_0,有0\leq f(n)\leq cg(n)\}
Θ(g(n))={f(n):存在正常量c和n0,使得对所有n≥n0,有0≤f(n)≤cg(n)}
Ω \Omega Ω记号
正如
O
O
O记号提供了一个函数的渐近上界,
Ω
\Omega
Ω记号提供了渐近下界。
Ω
(
g
(
n
)
)
=
{
f
(
n
)
:
存
在
正
常
量
c
和
n
0
,
使
得
对
所
有
n
≥
n
0
,
有
0
≤
c
g
(
n
)
≤
f
(
n
)
}
\Omega(g(n))=\{f(n):存在正常量c和n_0,\\ 使得对所有n\geq n_0,有0\leq cg(n)\leq f(n)\}
Ω(g(n))={f(n):存在正常量c和n0,使得对所有n≥n0,有0≤cg(n)≤f(n)}
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 ) ) = { f ( n ) : 存 在 正 常 量 c > 0 , 存 在 常 量 n 0 > 0 , 使 得 对 所 有 n ≥ n 0 , 有 0 ≤ f ( n ) < c g ( n ) } o(g(n))=\{f(n):存在正常量c>0,存在常量n_0>0,\\ 使得对所有n\geq n_0,有0\leq f(n)<cg(n)\} o(g(n))={f(n):存在正常量c>0,存在常量n0>0,使得对所有n≥n0,有0≤f(n)<cg(n)}
ω \omega ω记号
使用 ω \omega ω记号来表示一个非渐近紧确的下界。
ω ( g ( n ) ) = { f ( n ) : 存 在 正 常 量 c > 0 , 存 在 常 量 n 0 > 0 , 使 得 对 所 有 n ≥ n 0 , 有 0 ≤ c g ( n ) < f ( n ) } \omega(g(n))=\{f(n):存在正常量c>0,存在常量n_0>0,\\ 使得对所有n\geq n_0,有0\leq cg(n)<f(n)\} ω(g(n))={f(n):存在正常量c>0,存在常量n0>0,使得对所有n≥n0,有0≤cg(n)<f(n)}
渐近记号的性质
传递性:
如: f ( n ) = Θ ( g ( n ) ) 且 g ( n ) = Θ ( h ( n ) ) 蕴 含 f ( n ) = Θ ( h ( n ) ) f(n)=\Theta(g(n))\ \ \ 且\ \ \ g(n)=\Theta(h(n))\ \ \ 蕴含\ \ \ f(n)=\Theta(h(n)) f(n)=Θ(g(n)) 且 g(n)=Θ(h(n)) 蕴含 f(n)=Θ(h(n))
其他的也具体有此性质。
自反性:
如: f ( n ) = Θ ( f ( n ) ) f(n)=\Theta(f(n)) f(n)=Θ(f(n))
其他的也具体有此性质。
对称性:
f
(
n
)
=
Θ
(
g
(
n
)
)
当
且
仅
当
g
(
n
)
=
Θ
(
f
(
n
)
)
f(n)=\Theta(g(n))\ \ 当且仅当\ \ 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 ) ) 当 且 仅 当 g ( n ) = ω ( f ( n ) ) f(n)=O(g(n))\ \ 当且仅当\ \ g(n)=\Omega(f(n)) \\ f(n)=o(g(n))\ \ 当且仅当\ \ g(n)=\omega(f(n)) f(n)=O(g(n)) 当且仅当 g(n)=Ω(f(n))f(n)=o(g(n)) 当且仅当 g(n)=ω(f(n))
因为这些性质对渐近记号成立,所以可以在两个函数
f
f
f和
g
g
g的渐近比较和两个实数
a
a
a和
b
b
b的比较之间做一种类比。
f
(
n
)
=
O
(
g
(
n
)
)
类
似
于
a
≤
b
f
(
n
)
=
Ω
(
g
(
n
)
)
类
似
于
a
≥
b
f
(
n
)
=
Θ
(
g
(
n
)
)
类
似
于
a
=
b
f
(
n
)
=
o
(
g
(
n
)
)
类
似
于
a
<
b
f
(
n
)
=
ω
(
g
(
n
)
)
类
似
于
a
>
b
\begin{aligned} &f(n) = O(g(n))\ \ 类似于\ \ a\leq b\\ &f(n) = \Omega(g(n))\ \ 类似于\ \ a\geq b\\ &f(n) = \Theta(g(n))\ \ 类似于\ \ a=b\\ &f(n) = o(g(n))\ \ 类似于\ \ a<b\\ &f(n) = \omega(g(n))\ \ 类似于\ \ a>b\\ \end{aligned}
f(n)=O(g(n)) 类似于 a≤bf(n)=Ω(g(n)) 类似于 a≥bf(n)=Θ(g(n)) 类似于 a=bf(n)=o(g(n)) 类似于 a<bf(n)=ω(g(n)) 类似于 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))都不成立。例如我们不能使用渐近记号来比较函数
n
n
n和
n
1
+
s
i
n
n
n^{1+sin\ n}
n1+sin n,因为
n
1
+
s
i
n
n
n^{1+sin\ n}
n1+sin n中的幂值在0跟2之间摆动,取介于两者之间的所有值。
对于渐近记号的理解
对于插入排序,可以有插入排序的最坏情况运行时间为 Θ ( n 2 ) \Theta(n^2) Θ(n2)或 O ( n 2 ) O(n^2) O(n2)、 Ω ( n 2 ) \Omega(n^2) Ω(n2);插入排序的最好情况运行时间为 Θ ( n ) \Theta(n) Θ(n)或 O ( n ) O(n) O(n)、 Ω ( n ) \Omega(n) Ω(n),甚至是 o ( n 2 ) o(n^2) o(n2)。
对于归并排序,可以有归并排序的最坏情况运行时间为 Θ ( n l g n ) \Theta(nlgn) Θ(nlgn)或 O ( n l g n ) O(nlgn) O(nlgn)、 Ω ( n l g n ) \Omega(nlgn) Ω(nlgn);归并排序的最好情况运行时间为 Θ ( n l g n ) \Theta(nlgn) Θ(nlgn)或 O ( n l g n ) O(nlgn) O(nlgn)、 Ω ( n l g n ) \Omega(nlgn) Ω(nlgn)。
如果描述某个算法的运行时间为 Θ ( n 2 ) \Theta(n^2) Θ(n2),蕴含着该算法的最好情况的运行时间与最坏情况的运行时间都为 Θ ( n 2 ) \Theta(n^2) Θ(n2)。
如果描述某个算法的运行时间为 O ( n 2 ) O(n^2) O(n2),蕴含着该算法的最坏情况运行时间为 O ( n 2 ) O(n^2) O(n2)。
如果描述某个算法的运行时间为
Ω
(
n
2
)
\Omega(n^2)
Ω(n2),蕴含着该算法的最好情况运行时间为
Ω
(
n
2
)
\Omega(n^2)
Ω(n2)。
0.5 ∗ ( f ( n ) + g ( n ) ) ≤ m a x ( g ( n ) , g ( n ) ) ≤ ( f ( n ) + g ( n ) ) 0.5*(f(n)+g(n)) \leq max(g(n),g(n)) \leq (f(n)+g(n)) 0.5∗(f(n)+g(n))≤max(g(n),g(n))≤(f(n)+g(n))
当 n ≥ ∣ a ∣ n\geq |a| n≥∣a∣,有 ( n + a ) b ≤ ( 2 n ) b (n+a)^b\leq (2n)^b (n+a)b≤(2n)b,所以存在 c = 2 b c=2^b c=2b, n 0 = ∣ a ∣ n_0=|a| n0=∣a∣,当 n ≥ n 0 n\geq n_0 n≥n0时,有 0 ≤ ( n + a ) b ≤ c ( n b ) 0\leq (n+a)^b\leq c(n^b) 0≤(n+a)b≤c(nb),所以 ( n + a ) b = O ( n b ) (n+a)^b=O(n^b) (n+a)b=O(nb)。
当 n ≥ 2 ∣ a ∣ n\geq 2 |a| n≥2∣a∣,有 ( n + a ) b ≥ ( n / 2 ) b (n+a)^b\geq (n/2)^b (n+a)b≥(n/2)b,所以存在 c = ( 1 / 2 ) b c=(1/2)^b c=(1/2)b, n 0 = 2 ∣ a ∣ n_0=2|a| n0=2∣a∣,当 n ≥ n 0 n\geq n_0 n≥n0时,有 0 ≤ c ( n b ) ≤ ( n + a ) b 0\leq c(n^b)\leq (n+a)^b 0≤c(nb)≤(n+a)b,所以 ( n + a ) b = Ω ( n b ) (n+a)^b=\Omega(n^b) (n+a)b=Ω(nb)。
所以 ( n + a ) b = Θ ( n b ) (n+a)^b=\Theta(n^b) (n+a)b=Θ(nb)。
因为形容一个算法的运行时间是 O ( n 2 ) O(n^2) O(n2),也就意味着在 n ≥ 某 个 n 0 n\geq 某个n_0 n≥某个n0时,该算法在[ 0 , c n 2 0,cn^2 0,cn2]的范围内,所以也就是用 O O O记号来形容一个算法的运行时间时,蕴涵着的是该算法的最坏情况运行时间,而至少的意思是该算法的最好情况运行时间,二者是相冲突的。
2
n
+
1
=
2
∗
2
n
2^n+1=2*2^n
2n+1=2∗2n,所以
2
n
+
1
=
Θ
(
2
n
)
2^n+1=\Theta(2^n)
2n+1=Θ(2n),所以
2
n
=
O
(
n
2
)
2^n=O(n^2)
2n=O(n2)。
2
2
n
=
2
n
∗
2
n
2^{2n}=2^n*2^n
22n=2n∗2n,可以看到并没有常数
c
c
c可以使
2
2
n
≤
c
∗
2
n
2^{2n}\leq c*2^n
22n≤c∗2n。
因为 f ( n ) = Θ ( g ( n ) ) f(n)=\Theta(g(n)) f(n)=Θ(g(n)),所以存在正常量 c 1 , c 2 , n 0 c_1,c_2,n_0 c1,c2,n0,使得对所有 n ≥ n 0 n\geq n_0 n≥n0,有 0 ≤ c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) 0 \leq c_1g(n) \leq f(n) \leq c_2g(n) 0≤c1g(n)≤f(n)≤c2g(n),那么有正常量 c 2 , n 0 c_2,n_0 c2,n0,使得对所有 n ≥ n 0 n\geq n_0 n≥n0,有 0 ≤ f ( n ) ≤ c 2 g ( n ) 0 \leq f(n) \leq c_2g(n) 0≤f(n)≤c2g(n);有正常量 c 1 , n 0 c_1,n_0 c1,n0,使得对所有 n ≥ n 0 n\geq n_0 n≥n0,有 0 ≤ c 1 g ( n ) ≤ f ( n ) 0 \leq c_1g(n) \leq f(n) 0≤c1g(n)≤f(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)),所以存在正常量
c
2
,
n
1
c_2,n_1
c2,n1,使得对所有
n
≥
n
1
n\geq n_1
n≥n1,有
0
≤
f
(
n
)
≤
c
2
g
(
n
)
0 \leq f(n) \leq c_2g(n)
0≤f(n)≤c2g(n);存在正常量
c
1
,
n
2
c_1,n_2
c1,n2,使得对所有
n
≥
n
2
n\geq n_2
n≥n2,有
0
≤
c
1
g
(
n
)
≤
f
(
n
)
0 \leq c_1g(n) \leq f(n)
0≤c1g(n)≤f(n)。那么就有正常量
c
1
,
c
2
,
n
0
c_1,c_2,n_0
c1,c2,n0,其中
n
0
=
m
a
x
(
n
1
,
n
2
)
n_0=max(n_1,n_2)
n0=max(n1,n2),使得对所有
n
≥
n
0
n\geq n_0
n≥n0,有
0
≤
c
1
g
(
n
)
≤
f
(
n
)
≤
c
2
g
(
n
)
0 \leq c_1g(n) \leq f(n) \leq c_2g(n)
0≤c1g(n)≤f(n)≤c2g(n)。
略。
如果
o
(
g
(
n
)
)
∩
ω
(
g
(
n
)
)
o(g(n))\cap \omega(g(n))
o(g(n))∩ω(g(n)),则存在
f
(
n
)
=
o
(
g
(
n
)
)
且
f
(
n
)
=
ω
(
g
(
n
)
)
f(n)=o(g(n))且f(n)=\omega(g(n))
f(n)=o(g(n))且f(n)=ω(g(n)),所以有:
0
=
lim
n
→
∞
f
(
n
)
g
(
n
)
=
∞
0=\lim_{n \to \infty} \frac {f(n)}{g(n)} = \infty
0=n→∞limg(n)f(n)=∞
所以
o
(
g
(
n
)
)
∩
ω
(
g
(
n
)
)
o(g(n))\cap \omega(g(n))
o(g(n))∩ω(g(n))空集。
略。