笔记
通常我们分析一个算法,不用去关心它的精确运行时间,而是要研究它的渐近效率。
“
“
“渐近
”
”
”在这里的意思是,当输入规模足够大时,并且输入规模趋向于
∞
∞
∞时,算法运行时间的增长能体现出某种明显的规律性,即算法的运行时间按照某种特定的规律随输入规模的变大而增长。
在第2章中,我们介绍了两种排序算法:插入排序和归并排序,它们的渐近运行时间分别为
Θ
(
n
2
)
Θ(n^2)
Θ(n2)和
Θ
(
n
l
g
n
)
Θ(n{\rm lg}n)
Θ(nlgn)。这说明,当输入规模足够大时,插入排序的运行时间比归并排序运行时间增长要快。一旦输入规模足够大,归并排序在运行效率上将战胜插入排序。
本节介绍几种渐近记号,可以用来描述算法的渐近运行时间。
(1)
Θ
Θ
Θ记号
定义:给定一个函数
g
(
n
)
g(n)
g(n),用
Θ
(
g
(
n
)
)
Θ(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
)
}
Θ(g(n)) = \{ f(n):存在正常量c_1、c_2和n_0,使得对所有n ≥ n_0,有0 ≤ c_1g(n) ≤ f(n) ≤ c_2g(n) \}
Θ(g(n))={f(n):存在正常量c1、c2和n0,使得对所有n≥n0,有0≤c1g(n)≤f(n)≤c2g(n)}
准确来说
Θ
(
g
(
n
)
)
Θ(g(n))
Θ(g(n))是一个集合。但我们习惯用
“
f
(
n
)
=
Θ
(
g
(
n
)
)
”
“f(n) = Θ(g(n))”
“f(n)=Θ(g(n))”表示函数
f
(
n
)
f(n)
f(n)属于集合
Θ
(
g
(
n
)
)
Θ(g(n))
Θ(g(n))。
f
(
n
)
=
Θ
(
g
(
n
)
)
f(n) = Θ(g(n))
f(n)=Θ(g(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)之间。也就是说,当
n
n
n足够大时,
f
(
n
)
f(n)
f(n)与
g
(
n
)
g(n)
g(n)的比值是在一个有限正实数范围内的。这个比值可能随
n
n
n的变化而有所不同,但是只要
n
n
n足够大,不管
n
n
n为多少,这个比值总是在有限正实数范围
[
c
1
,
c
2
]
[c_1, c_2]
[c1,c2]内。我们称
g
(
n
)
g(n)
g(n)是
f
(
n
)
f(n)
f(n)的一个渐近紧确界,也就是说
g
(
n
)
g(n)
g(n)既可以表示
f
(
n
)
f(n)
f(n)的渐近上界,也可以表示
f
(
n
)
f(n)
f(n)的渐近下界,区别就是上界和下界所乘的常量因子
c
1
c_1
c1和
c
2
c_2
c2不同。
下面举一个例子,用上面的定义来证明
1
2
n
2
−
3
n
=
Θ
(
n
2
)
\frac{1}{2}n^2-3n=Θ(n^2)
21n2−3n=Θ(n2)。根据
Θ
Θ
Θ记号的定义,我们需要找到正常量
c
1
c_1
c1、
c
2
c_2
c2和
n
0
n_0
n0,使得对所有
n
≥
n
0
n ≥ n_0
n≥n0,有
c
1
n
2
≤
1
2
n
2
−
3
n
≤
c
2
n
2
c_1 n^2≤\frac{1}{2}n^2-3n≤c_2 n^2
c1n2≤21n2−3n≤c2n2
将上式除以
n
2
n^2
n2,得到
c
1
≤
1
2
−
3
n
≤
c
2
c_1≤\frac{1}{2}-\frac{3}{n}≤c_2
c1≤21−n3≤c2
通过选择任意常量
c
2
≥
1
/
2
c_2 ≥ 1/2
c2≥1/2,可以使右边的不等式对任何
n
≥
1
n ≥ 1
n≥1成立。同样,通过选择
c
1
≤
1
/
14
c_1 ≤ 1/14
c1≤1/14,可以使得左边的不等式对任何
n
≥
7
n ≥ 7
n≥7成立。因此,选择
c
1
≤
1
/
14
、
c
2
≥
1
/
2
和
n
≥
7
c_1 ≤ 1/14、c_2 ≥ 1/2和n ≥ 7
c1≤1/14、c2≥1/2和n≥7,可以使得以上不等式成立,故
1
2
n
2
−
3
n
=
Θ
(
n
2
)
\frac{1}{2}n^2-3n=Θ(n^2)
21n2−3n=Θ(n2)得证。
(2)
O
{\rm O}
O记号
与
Θ
Θ
Θ记号不同,
O
{\rm O}
O记号只给出函数的渐近上界。
定义:给定一个函数
g
(
n
)
g(n)
g(n),用
O
(
g
(
n
)
)
{\rm O}(g(n))
O(g(n))来表示以下函数的集合:
O
(
g
(
n
)
)
=
{
f
(
n
)
:
存
在
正
常
量
c
和
n
0
,
使
得
对
所
有
n
≥
n
0
,
有
0
≤
f
(
n
)
≤
c
g
(
n
)
}
{\rm O}(g(n)) = \{ f(n):存在正常量c和n_0,使得对所有n ≥ n_0,有0 ≤ f(n) ≤ cg(n) \}
O(g(n))={f(n):存在正常量c和n0,使得对所有n≥n0,有0≤f(n)≤cg(n)}
如果
f
(
n
)
=
O
(
g
(
n
)
)
f(n) = {\rm O}(g(n))
f(n)=O(g(n)),说明当
n
n
n足够大时,
f
(
n
)
f(n)
f(n)与
g
(
n
)
g(n)
g(n)的比值总是不超过一个正常量
c
c
c。显然,
f
(
n
)
=
Θ
(
g
(
n
)
)
f(n) = Θ(g(n))
f(n)=Θ(g(n))蕴含了
f
(
n
)
=
O
(
g
(
n
)
)
f(n) = {\rm O}(g(n))
f(n)=O(g(n))。
(3)
Ω
Ω
Ω记号
Ω
Ω
Ω记号只给出函数的渐近下界。
定义:给定一个函数
g
(
n
)
g(n)
g(n),用
Ω
(
g
(
n
)
)
Ω(g(n))
Ω(g(n))来表示以下函数的集合:
Ω
(
g
(
n
)
)
=
{
f
(
n
)
:
存
在
正
常
量
c
和
n
0
,
使
得
对
所
有
n
≥
n
0
,
有
0
≤
c
g
(
n
)
≤
f
(
n
)
}
Ω(g(n)) = \{ f(n):存在正常量c和n_0,使得对所有n ≥ n_0,有0 ≤ cg(n) ≤ f(n) \}
Ω(g(n))={f(n):存在正常量c和n0,使得对所有n≥n0,有0≤cg(n)≤f(n)}
如果
f
(
n
)
=
Ω
(
g
(
n
)
)
f(n) = Ω(g(n))
f(n)=Ω(g(n)),说明当
n
n
n足够大时,
f
(
n
)
f(n)
f(n)与
g
(
n
)
g(n)
g(n)的比值总是不小于一个正常量
c
c
c。显然,
f
(
n
)
=
Θ
(
g
(
n
)
)
f(n) = Θ(g(n))
f(n)=Θ(g(n))也蕴含了
f
(
n
)
=
Ω
(
g
(
n
)
)
f(n) = Ω(g(n))
f(n)=Ω(g(n))。
(4)
o
{\rm o}
o记号
o
{\rm o}
o记号用来表示函数的一个非渐近紧确的上界。
定义:给定一个函数
g
(
n
)
g(n)
g(n),用
o
(
g
(
n
)
)
{\rm o}(g(n))
o(g(n))来表示以下函数的集合:
o
(
g
(
n
)
)
=
{
f
(
n
)
:
对
任
意
正
常
量
c
,
存
在
n
0
>
0
,
使
得
对
所
有
n
≥
n
0
,
有
0
≤
f
(
n
)
<
c
g
(
n
)
}
{\rm o}(g(n)) = \{ f(n):对任意正常量c,存在n_0 > 0,使得对所有n ≥ n_0,有0 ≤ f(n) < cg(n) \}
o(g(n))={f(n):对任意正常量c,存在n0>0,使得对所有n≥n0,有0≤f(n)<cg(n)}
对比
O
(
g
(
n
)
)
{\rm O}(g(n))
O(g(n))的定义可以看到,
O
(
g
(
n
)
)
{\rm O}(g(n))
O(g(n))要求
f
(
n
)
≤
c
g
(
n
)
f(n) ≤ cg(n)
f(n)≤cg(n),而
o
(
g
(
n
)
)
{\rm o}(g(n))
o(g(n))要求
f
(
n
)
<
c
g
(
n
)
f(n) < cg(n)
f(n)<cg(n),并且对任意
c
>
0
c>0
c>0都能满足。因此,
o
{\rm o}
o记号给出的上界不是渐近紧确的,而
O
{\rm O}
O记号给出的上界有可能是渐近紧确的。
还可以用极限来定义
o
{\rm o}
o记号:如果
l
i
m
n
→
∞
f
(
n
)
g
(
n
)
=
0
lim_{n→∞}\frac{f(n)}{g(n)}=0
limn→∞g(n)f(n)=0,那么
f
(
n
)
=
o
(
g
(
n
)
)
f(n) = {\rm o}(g(n))
f(n)=o(g(n))。
(4)
ω
ω
ω记号
ω
ω
ω记号用来表示函数的一个非渐近紧确的下界。
定义:给定一个函数
g
(
n
)
g(n)
g(n),用
ω
(
g
(
n
)
)
ω(g(n))
ω(g(n))来表示以下函数的集合:
ω
(
g
(
n
)
)
=
{
f
(
n
)
:
对
任
意
正
常
量
c
,
存
在
n
0
>
0
,
使
得
对
所
有
n
≥
n
0
,
有
0
≤
c
g
(
n
)
<
f
(
n
)
}
ω(g(n)) = \{ f(n):对任意正常量c,存在n_0 > 0,使得对所有n ≥ n_0,有0 ≤ cg(n) < f(n) \}
ω(g(n))={f(n):对任意正常量c,存在n0>0,使得对所有n≥n0,有0≤cg(n)<f(n)}
对比
Ω
(
g
(
n
)
)
Ω(g(n))
Ω(g(n))的定义可以看到,
Ω
(
g
(
n
)
)
Ω(g(n))
Ω(g(n))要求
c
g
(
n
)
≤
f
(
n
)
cg(n) ≤ f(n)
cg(n)≤f(n),而
ω
(
g
(
n
)
)
ω(g(n))
ω(g(n))要求
c
g
(
n
)
<
f
(
n
)
cg(n) < f(n)
cg(n)<f(n),并且对任意
c
>
0
c>0
c>0都能满足。因此,
ω
ω
ω记号给出的下界不是渐近紧确的,而
Ω
Ω
Ω记号给出的下界有可能是渐近紧确的。
同样可以用极限来定义
ω
ω
ω记号:如果
l
i
m
n
→
∞
g
(
n
)
f
(
n
)
=
0
lim_{n→∞}\frac{g(n)}{f(n)}=0
limn→∞f(n)g(n)=0,那么
f
(
n
)
=
ω
(
g
(
n
)
)
f(n) = ω(g(n))
f(n)=ω(g(n))。
通常在算法分析中,
Θ
Θ
Θ、
O
{\rm O}
O和
Ω
Ω
Ω记号用得相对多一些,而
o
{\rm o}
o和
ω
ω
ω记号相对少用。我们分析算法,自然更希望得到算法的渐近紧确界。下图直观展示了
Θ
Θ
Θ、
O
{\rm O}
O和
Ω
Ω
Ω记号的意义。
下面给出了渐近记号的一些性质。
① 传递性
f
(
n
)
=
Θ
(
g
(
n
)
)
且
g
(
n
)
=
Θ
(
h
(
n
)
)
⇒
f
(
n
)
=
Θ
(
h
(
n
)
)
f(n) = Θ(g(n))且g(n) = Θ(h(n)) ⇒ f(n) = Θ(h(n))
f(n)=Θ(g(n))且g(n)=Θ(h(n)) ⇒ f(n)=Θ(h(n))
f
(
n
)
=
O
(
g
(
n
)
)
且
g
(
n
)
=
O
(
h
(
n
)
)
⇒
f
(
n
)
=
O
(
h
(
n
)
)
f(n) = {\rm O}(g(n))且g(n) = {\rm O}(h(n)) ⇒ f(n) = {\rm O}(h(n))
f(n)=O(g(n))且g(n)=O(h(n)) ⇒ f(n)=O(h(n))
f
(
n
)
=
Ω
(
g
(
n
)
)
且
g
(
n
)
=
Ω
(
h
(
n
)
)
⇒
f
(
n
)
=
Ω
(
h
(
n
)
)
f(n) = Ω(g(n))且g(n) = Ω(h(n)) ⇒ f(n) = Ω(h(n))
f(n)=Ω(g(n))且g(n)=Ω(h(n)) ⇒ f(n)=Ω(h(n))
f
(
n
)
=
o
(
g
(
n
)
)
且
g
(
n
)
=
o
(
h
(
n
)
)
⇒
f
(
n
)
=
o
(
h
(
n
)
)
f(n) = {\rm o}(g(n))且g(n) = {\rm o}(h(n)) ⇒ f(n) = {\rm o}(h(n))
f(n)=o(g(n))且g(n)=o(h(n)) ⇒ f(n)=o(h(n))
f
(
n
)
=
ω
(
g
(
n
)
)
且
g
(
n
)
=
Ω
(
h
(
n
)
)
⇒
f
(
n
)
=
ω
(
h
(
n
)
)
f(n) = ω(g(n))且g(n) = Ω(h(n)) ⇒ f(n) = ω(h(n))
f(n)=ω(g(n))且g(n)=Ω(h(n)) ⇒ f(n)=ω(h(n))
② 自反性
f
(
n
)
=
Θ
(
f
(
n
)
)
f(n) = Θ(f(n))
f(n)=Θ(f(n))
f
(
n
)
=
O
(
f
(
n
)
)
f(n) = {\rm O}(f(n))
f(n)=O(f(n))
f
(
n
)
=
Ω
(
f
(
n
)
)
f(n) = Ω(f(n))
f(n)=Ω(f(n))
③ 对称性
f
(
n
)
=
Θ
(
g
(
n
)
)
⇔
g
(
n
)
=
Θ
(
f
(
n
)
)
f(n) = Θ(g(n)) ⇔ g(n) = Θ(f(n))
f(n)=Θ(g(n)) ⇔ g(n)=Θ(f(n))
④ 转置对称性
f
(
n
)
=
O
(
g
(
n
)
)
⇔
g
(
n
)
=
Ω
(
f
(
n
)
)
f(n) = {\rm O}(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) = {\rm o}(g(n)) ⇔ g(n) = ω(f(n))
f(n)=o(g(n)) ⇔ g(n)=ω(f(n))
还有一个性质比较重要,即
f
(
n
)
=
Θ
(
g
(
n
)
)
⇔
f
(
n
)
=
O
(
g
(
n
)
)
且
f
(
n
)
=
Ω
(
g
(
n
)
)
f(n) = Θ(g(n)) ⇔ f(n) = {\rm O}(g(n))且f(n) = Ω(g(n))
f(n)=Θ(g(n)) ⇔ f(n)=O(g(n))且f(n)=Ω(g(n))
练习
3.1-1 假设
f
(
n
)
f(n)
f(n)与
g
(
n
)
g(n)
g(n)都是渐近非负函数。使用
Θ
Θ
Θ记号的基本定义来证明
m
a
x
(
f
(
n
)
,
g
(
n
)
)
=
Θ
(
f
(
n
)
+
g
(
n
)
)
{\rm max}(f(n), g(n)) = Θ(f(n) + g(n))
max(f(n),g(n))=Θ(f(n)+g(n))。
解
由于
f
(
n
)
f(n)
f(n)和
g
(
n
)
g(n)
g(n)都是渐近非负函数,所以存在一个
n
0
n_0
n0,使得对所有
n
≥
n
0
n ≥ n_0
n≥n0,有
f
(
n
)
≥
0
f(n) ≥ 0
f(n)≥0和
g
(
n
)
≥
0
g(n) ≥ 0
g(n)≥0。
取
c
1
=
1
/
2
c_1 = 1/2
c1=1/2,当
n
≥
n
0
n ≥ n_0
n≥n0时,如果
f
(
n
)
≥
g
(
n
)
f(n) ≥ g(n)
f(n)≥g(n),则
m
a
x
(
f
(
n
)
,
g
(
n
)
)
=
f
(
n
)
≥
(
f
(
n
)
+
g
(
n
)
)
/
2
=
c
1
(
f
(
n
)
+
g
(
n
)
)
{\rm max}(f(n), g(n)) = f(n) ≥ (f(n) + g(n)) / 2 = c_1 (f(n) + g(n))
max(f(n),g(n))=f(n)≥(f(n)+g(n))/2=c1(f(n)+g(n))。如果
f
(
n
)
<
g
(
n
)
f(n) < g(n)
f(n)<g(n),同理可证
m
a
x
(
f
(
n
)
,
g
(
n
)
)
≥
c
1
(
f
(
n
)
+
g
(
n
)
)
{\rm max}(f(n), g(n)) ≥ c_1 (f(n) + g(n))
max(f(n),g(n))≥c1(f(n)+g(n))。
取
c
2
=
1
c_2 = 1
c2=1,当
n
≥
n
0
n ≥ n_0
n≥n0时,如果
f
(
n
)
≥
g
(
n
)
f(n) ≥ g(n)
f(n)≥g(n),则
m
a
x
(
f
(
n
)
,
g
(
n
)
)
=
f
(
n
)
≤
f
(
n
)
+
g
(
n
)
=
c
2
(
f
(
n
)
+
g
(
n
)
)
{\rm max}(f(n), g(n)) = f(n) ≤ f(n) + g(n) = c_2 (f(n) + g(n))
max(f(n),g(n))=f(n)≤f(n)+g(n)=c2(f(n)+g(n))。如果
f
(
n
)
<
g
(
n
)
f(n) < g(n)
f(n)<g(n),同理可证
m
a
x
(
f
(
n
)
,
g
(
n
)
)
≤
c
2
(
f
(
n
)
+
g
(
n
)
)
{\rm max}(f(n), g(n)) ≤ c_2 (f(n) + g(n))
max(f(n),g(n))≤c2(f(n)+g(n))。
综上所述,选取一个足够大的
n
0
n_0
n0,并且取
c
1
=
1
/
2
c_1 = 1/2
c1=1/2和
c
2
=
1
c_2 = 1
c2=1,当
n
≥
n
0
n ≥ n_0
n≥n0时,
0
≤
c
1
(
f
(
n
)
+
g
(
n
)
)
≤
m
a
x
(
f
(
n
)
,
g
(
n
)
)
≤
c
2
(
f
(
n
)
+
g
(
n
)
)
0 ≤ c_1 (f(n) + g(n)) ≤ {\rm max}(f(n), g(n)) ≤ c_2 (f(n) + g(n))
0≤c1(f(n)+g(n))≤max(f(n),g(n))≤c2(f(n)+g(n))成立,所以
m
a
x
(
f
(
n
)
,
g
(
n
)
)
=
Θ
(
f
(
n
)
+
g
(
n
)
)
{\rm max}(f(n), g(n)) = Θ(f(n) + g(n))
max(f(n),g(n))=Θ(f(n)+g(n))。
3.1-2 证明:对任意实常量
a
a
a和
b
b
b,其中
b
>
0
b > 0
b>0,有
(
n
+
a
)
b
=
Θ
(
n
b
)
(n+a)^b = Θ(n^b)
(n+a)b=Θ(nb)。
解
(
n
+
a
)
b
=
Θ
(
n
b
)
(n+a)^b = Θ(n^b)
(n+a)b=Θ(nb)意味着存在
c
1
>
0
c_1 > 0
c1>0、
c
2
>
0
c_2 > 0
c2>0和
n
0
>
0
n_0 > 0
n0>0,使得对所有
n
≥
n
0
n ≥ n_0
n≥n0,有
0
≤
c
1
n
b
≤
(
n
+
a
)
b
≤
c
2
n
b
0 ≤ c_1n^b ≤ (n+a)^b ≤ c_2n^b
0≤c1nb≤(n+a)b≤c2nb。
(1) 先证明不等式
(
n
+
a
)
b
≥
c
1
n
b
(n+a)^b ≥ c_1n^b
(n+a)b≥c1nb。将不等式两边都除以
n
b
n^b
nb,有
(
1
+
a
n
)
b
≥
c
1
⇔
1
+
a
n
≥
c
1
1
/
b
⇔
a
n
≥
c
1
1
/
b
−
1
(1+\frac{a}{n})^b≥c_1 ⇔ 1+\frac{a}{n}≥{c_1}^{1/b} ⇔ \frac{a}{n}≥{c_1}^{1/b}-1
(1+na)b≥c1 ⇔ 1+na≥c11/b ⇔ na≥c11/b−1
取任意
0
<
c
1
<
1
0 < c_1 < 1
0<c1<1,由于
b
>
0
b > 0
b>0,故
0
<
c
1
1
/
b
<
1
0<{c_1}^{1/b}<1
0<c11/b<1,所以
c
1
1
/
b
−
1
<
0
{c_1}^{1/b}-1<0
c11/b−1<0。于是上面的不等式可以变换为
n
≥
a
(
c
1
1
/
b
−
1
)
n≥\frac{a}{({c_1}^{1/b}-1)}
n≥(c11/b−1)a。
这意味着任取
0
<
c
1
<
1
0 < c_1 < 1
0<c1<1,都可以找到一个大于或等于
a
(
c
1
1
/
b
−
1
)
\frac{a}{({c_1}^{1/b}-1)}
(c11/b−1)a的
n
0
n_0
n0,使得对所有
n
≥
n
0
n ≥ n_0
n≥n0,有
(
n
+
a
)
b
≥
c
1
n
b
(n+a)^b ≥ c_1n^b
(n+a)b≥c1nb都成立。
(2) 用同样的方法可证明,取任意
c
2
>
1
c_2 > 1
c2>1,都可以找到一个大于或等于
a
(
c
2
1
/
b
−
1
)
\frac{a}{({c_2}^{1/b}-1)}
(c21/b−1)a的
n
0
n_0
n0,使得对所有
n
≥
n
0
n ≥ n_0
n≥n0,有
(
n
+
a
)
b
≤
c
2
n
b
(n+a)^b ≤ c_2n^b
(n+a)b≤c2nb都成立。
综上所述,
(
n
+
a
)
b
=
Θ
(
n
b
)
(n+a)^b = Θ(n^b)
(n+a)b=Θ(nb)是成立的。
3.1-3 解释为什么
“
“
“算法
A
A
A的运行时间至少是
O
(
n
2
)
”
O(n^2)”
O(n2)”这一表述是无意义的。
略
3.1-4
2
n
+
1
=
O
(
2
n
)
2^{n+1} = {\rm O}(2^n)
2n+1=O(2n)成立吗?
2
2
n
=
O
(
2
n
)
2^{2n} = {\rm O}(2^n)
22n=O(2n)成立吗?
解
取任意
c
≥
2
c ≥ 2
c≥2,对任意
n
>
0
n > 0
n>0,都有
2
n
+
1
=
2
∙
2
n
≤
c
∙
2
n
2^{n+1} = 2∙2^n ≤ c∙2^n
2n+1=2∙2n≤c∙2n。故
2
n
+
1
=
O
(
2
n
)
2^{n+1} = {\rm O}(2^n)
2n+1=O(2n)成立。
而
2
2
n
=
(
2
n
)
2
=
2
n
∙
2
n
2^{2n} = (2^n)^2 = 2^n∙2^n
22n=(2n)2=2n∙2n,无论取多大的正常量
c
c
c,当
n
n
n足够大时,
2
n
∙
2
n
2^n∙2^n
2n∙2n都会超过
c
∙
2
n
c∙2^n
c∙2n。因此,
2
2
n
≤
c
∙
2
n
2^{2n} ≤ c∙2^n
22n≤c∙2n并不是渐近成立的,故
2
2
n
=
O
(
2
n
)
2^{2n} = O(2^n)
22n=O(2n)不成立。
3.1-5 证明定理3.1。
略
3.1-6 证明:一个算法的运行时间为
Θ
(
g
(
n
)
)
Θ(g(n))
Θ(g(n))当且仅当其最坏情况运行时间为
O
(
g
(
n
)
)
{\rm O}(g(n))
O(g(n)),且其最好情况运行时间为
Ω
(
g
(
n
)
)
Ω(g(n))
Ω(g(n))。
略
3.1-7 证明:
o
(
g
(
n
)
)
∩
ω
(
g
(
n
)
)
{\rm o}(g(n)) ∩ ω(g(n))
o(g(n))∩ω(g(n))为空集。
解
采用反证法。假如存在这样的函数
f
(
n
)
f(n)
f(n),满足
f
(
n
)
∈
o
(
g
(
n
)
)
∩
ω
(
g
(
n
)
)
f(n) ∈ {\rm o}(g(n)) ∩ ω(g(n))
f(n)∈o(g(n))∩ω(g(n))。
f
(
n
)
∈
o
(
g
(
n
)
)
f(n) ∈ {\rm o}(g(n))
f(n)∈o(g(n))说明对任意正常量
c
>
0
c > 0
c>0,存在常量
n
1
>
0
n_1 > 0
n1>0,使得对所有
n
≥
n
1
n ≥ n_1
n≥n1,有
f
(
n
)
<
c
g
(
n
)
f(n) < cg(n)
f(n)<cg(n)。
而
f
(
n
)
∈
ω
(
g
(
n
)
)
f(n) ∈ ω(g(n))
f(n)∈ω(g(n))说明对任意正常量
c
>
0
c > 0
c>0,存在常量
n
2
>
0
n_2 > 0
n2>0,使得对所有
n
≥
n
2
n ≥ n_2
n≥n2,有
f
(
n
)
>
c
g
(
n
)
f(n) > cg(n)
f(n)>cg(n)。
当
n
≥
m
a
x
{
n
1
,
n
2
}
n ≥ {\rm max}\{n_1, n_2\}
n≥max{n1,n2}时,既有
f
(
n
)
<
c
g
(
n
)
f(n) < cg(n)
f(n)<cg(n),又有
f
(
n
)
>
c
g
(
n
)
f(n) > cg(n)
f(n)>cg(n),这是矛盾的。因此不存在这样的函数
f
(
n
)
f(n)
f(n),满足
f
(
n
)
∈
o
(
g
(
n
)
)
∩
ω
(
g
(
n
)
)
f(n) ∈ {\rm o}(g(n)) ∩ ω(g(n))
f(n)∈o(g(n))∩ω(g(n))。故
o
(
g
(
n
)
)
∩
ω
(
g
(
n
)
)
{\rm o}(g(n)) ∩ ω(g(n))
o(g(n))∩ω(g(n))为空集。
3.1-8 可以扩展我们的记号到有两个参数
n
n
n和
m
m
m的情形,其中的
n
n
n和
m
m
m可以按不同速率独立地趋于无穷。对于给定的函数
g
(
n
,
m
)
g(n, m)
g(n,m),用
O
(
g
(
n
,
m
)
)
{\rm O}(g(n, m))
O(g(n,m))来表示以下函数集:
O
(
g
(
n
,
m
)
)
=
{
f
(
n
,
m
)
:
存
在
正
常
量
c
、
n
0
和
m
0
,
使
得
对
所
有
n
≥
n
0
或
m
≥
m
0
,
有
0
≤
f
(
n
,
m
)
≤
c
g
(
n
,
m
)
}
{\rm O}(g(n, m)) = \{ f(n, m):存在正常量c、n_0和m_0,使得对所有n ≥ n_0或m ≥ m_0,有0 ≤ f(n, m) ≤ cg(n, m) \}
O(g(n,m))={f(n,m):存在正常量c、n0和m0,使得对所有n≥n0或m≥m0,有0≤f(n,m)≤cg(n,m)}
对
Ω
(
g
(
n
,
m
)
)
Ω(g(n, m))
Ω(g(n,m))和
Θ
(
g
(
n
,
m
)
)
Θ(g(n, m))
Θ(g(n,m))给出相应的定义。
解
Ω
(
g
(
n
,
m
)
)
=
{
f
(
n
,
m
)
:
存
在
正
常
量
c
、
n
0
和
m
0
,
使
得
对
所
有
n
≥
n
0
或
m
≥
m
0
,
有
0
≤
c
g
(
n
,
m
)
≤
f
(
n
,
m
)
}
。
Ω(g(n, m)) = \{ f(n, m):存在正常量c、n_0和m_0,使得对所有n ≥ n_0或m ≥ m_0,有0 ≤ cg(n, m) ≤ f(n, m) \}。
Ω(g(n,m))={f(n,m):存在正常量c、n0和m0,使得对所有n≥n0或m≥m0,有0≤cg(n,m)≤f(n,m)}。
Θ
(
g
(
n
,
m
)
)
=
{
f
(
n
,
m
)
:
存
在
正
常
量
c
1
、
c
2
、
n
0
和
m
0
,
使
得
对
所
有
n
≥
n
0
或
m
≥
m
0
,
有
0
≤
c
1
g
(
n
,
m
)
≤
f
(
n
,
m
)
≤
c
2
g
(
n
,
m
)
}
。
Θ(g(n, m)) = \{ f(n, m):存在正常量c_1、c_2、n_0和m_0,使得对所有n ≥ n_0或m ≥ m_0,有0 ≤ c_1g(n, m) ≤ f(n, m) ≤ c_2g(n, m) \}。
Θ(g(n,m))={f(n,m):存在正常量c1、c2、n0和m0,使得对所有n≥n0或m≥m0,有0≤c1g(n,m)≤f(n,m)≤c2g(n,m)}。