算法导论学习笔记[1] #20210709
lec 2
Lecture 2
Asymptotic Notation; Recurrences; Substitution, Master Method
之后若无说明,则对数都以2为底。
渐近记号
Q0:
O
O
O记号和
Θ
\Theta
Θ记号有何异同?
A0: 同:都考察某个常数
n
0
n_0
n0之后的行为。都有上界。
异:
f
(
n
)
=
O
(
g
(
n
)
)
f(n)=O(g(n))
f(n)=O(g(n))中
f
(
n
)
f(n)
f(n)下界是0而不是
c
1
g
(
n
)
(
c
1
>
0
)
c_1g(n)(c_1>0)
c1g(n)(c1>0),所以
f
,
g
f,g
f,g可能不同阶(具体地,
2
n
2
=
O
(
n
3
)
2n^2=O(n^3)
2n2=O(n3)但是
n
3
=
O
(
2
n
2
)
n^3=O(2n^2)
n3=O(2n2)不成立。这说明这样的“等号”一定程度上有些奇怪(bizarre))
注:更好的理解方式是认为
O
(
g
(
n
)
)
O(g(n))
O(g(n))是一个函数集合,并记
f
(
n
)
∈
O
(
g
(
n
)
)
f(n)\in O(g(n))
f(n)∈O(g(n)). “等号”不对称,确实不太好。
Q1: 解释
f
(
n
)
=
n
3
+
O
(
n
2
)
=
O
(
n
3
)
=
O
(
n
4
)
f(n)=n^3+O(n^2)= O(n^3)=O(n^4)
f(n)=n3+O(n2)=O(n3)=O(n4).
A1:
第一个等号相当于更加精确地描述
f
(
n
)
f(n)
f(n)的渐近行为,即减去
n
3
n^3
n3后剩余的误差项至多不超过
n
2
n^2
n2量级。
第二个等号:对于任意
h
(
n
)
=
O
(
n
2
)
h(n)=O(n^2)
h(n)=O(n2),有
n
3
+
h
(
n
)
=
O
(
n
3
)
n^3+h(n)=O(n^3)
n3+h(n)=O(n3). 这个等号其实相当于集合的包含于,它不对称。
注:认为
O
(
n
2
)
O(n^2)
O(n2)是一个集合更加方便。实际上,A set in a formula (left hand side) represents an anonymous function in the set. 即看到
O
(
n
2
)
O(n^2)
O(n2)就设想把它换成具体的一个
h
(
n
)
h(n)
h(n)满足
h
(
n
)
=
O
(
n
2
)
h(n)=O(n^2)
h(n)=O(n2). 课堂中将此与宏的替换类比。
第三个等号也是集合的包含于。注意包含于关系可以往一个方向传递,但不能反向。
Q2:
O
O
O,
Ω
\Omega
Ω,
Θ
\Theta
Θ有何联系?
A2:
O
(
g
(
n
)
)
∩
Ω
(
g
(
n
)
)
=
Θ
(
g
(
n
)
)
O(g(n))\cap \Omega(g(n))=\Theta(g(n))
O(g(n))∩Ω(g(n))=Θ(g(n))(都看成集合)
Q3:
Θ
\Theta
Θ和
O
O
O对应的集合有交集,这不令人满意。阐述“严格”不等对应的
o
(
g
(
n
)
)
o(g(n))
o(g(n))和
ω
(
g
(
n
)
)
\omega(g(n))
ω(g(n)).
A3:
o
(
g
(
n
)
)
=
{
f
(
n
)
∣
∀
c
>
0
,
∃
N
>
0
,
∀
n
>
N
,
f
(
n
)
<
c
g
(
n
)
}
o(g(n))=\{f(n)|\forall c>0,\exists N>0,\forall n>N,f(n)<cg(n)\}
o(g(n))={f(n)∣∀c>0,∃N>0,∀n>N,f(n)<cg(n)}.
ω
\omega
ω类似(反向)。
注意是任意
c
c
c而不是存在
c
c
c,否则其实不能体现渐近意义上的“严格不等”。
显然
Θ
,
o
,
ω
\Theta,o,\omega
Θ,o,ω对应的集合没有交集。(但它们的并显然不是全集)
注:
O
,
ω
O,\omega
O,ω对应的集合之并也不是全集。(思考:为什么?)
Solving recurrences
Q0:
T
(
n
)
=
4
T
(
n
/
2
)
+
n
,
T
(
1
)
=
Θ
(
1
)
T(n)=4T(n/2)+n,T(1)=\Theta(1)
T(n)=4T(n/2)+n,T(1)=Θ(1)中,根据
4
(
c
n
3
/
8
)
+
n
<
c
n
3
4 (cn^3/8)+n<cn^3
4(cn3/8)+n<cn3(
n
n
n大)可以说明()。
注意这里省略了归纳的起点,并忽略了取整等问题。
为什么同样是归纳,
1
=
O
(
1
)
,
2
=
1
+
1
=
O
(
1
)
+
1
=
O
(
1
)
,
3
=
2
+
1
=
O
(
1
)
+
1
⋯
,
n
=
O
(
1
)
+
1
=
O
(
1
)
1=O(1),2=1+1=O(1)+1=O(1),3=2+1=O(1)+1\cdots,n=O(1)+1=O(1)
1=O(1),2=1+1=O(1)+1=O(1),3=2+1=O(1)+1⋯,n=O(1)+1=O(1)就显得很奇怪?
A0:
T
(
n
)
=
O
(
n
3
)
T(n)=O(n^3)
T(n)=O(n3)
提示:在第二个例子中不存在一个对所有
n
n
n都一致的常数。故准确来说,对于某一确定的
n
0
n_0
n0有
n
0
=
O
(
1
)
n_0=O(1)
n0=O(1)没错,但对于函数
f
(
n
)
=
n
f(n)=n
f(n)=n就不能说
n
=
O
(
1
)
n=O(1)
n=O(1).
Q1: 利用递归树法猜测
T
(
n
)
=
4
T
(
n
/
2
)
+
n
T(n)=4T(n/2)+n
T(n)=4T(n/2)+n中
T
T
T的渐近行为,并做出证明(提示:
c
1
n
2
+
c
2
n
c_1n^2+c_2n
c1n2+c2n)
A1:
以此类推,得到
n
+
n
/
2
⋅
4
+
n
/
4
⋅
16
+
⋯
=
n
+
2
n
+
4
n
+
⋯
≈
2
l
o
g
n
n
=
n
2
n+n/2\cdot 4+n/4\cdot 16+\cdots=n+2n+4n+\cdots\approx 2^{logn}n=n^2
n+n/2⋅4+n/4⋅16+⋯=n+2n+4n+⋯≈2lognn=n2. 注意树有
l
o
g
n
logn
logn层。
猜测
T
(
n
)
=
O
(
n
2
)
T(n)=O(n^2)
T(n)=O(n2). 由于
T
(
n
)
≤
c
n
2
T(n)\le cn^2
T(n)≤cn2并不好归纳,故不妨采取
T
(
n
)
≤
c
1
n
2
+
c
2
n
T(n)\le c_1n^2+c_2n
T(n)≤c1n2+c2n归纳。实际上
c
2
c_2
c2是负的。
注:估计
Ω
(
n
2
)
\Omega(n^2)
Ω(n2)比较简单,直接
T
(
n
)
≥
c
n
2
T(n)\ge cn^2
T(n)≥cn2即可。
Q2: 接上,记
T
(
2
m
)
=
a
m
T(2^m)=a_m
T(2m)=am,你有什么想法?(回忆数列题的做法)
A2:
a
m
=
4
a
m
−
1
+
2
m
,
a
m
+
2
m
=
4
(
a
m
−
1
+
2
m
/
2
)
=
4
(
a
m
−
1
+
2
m
−
1
)
a_m=4a_{m-1}+2^m,a_m+2^m=4(a_{m-1}+2^m/2)=4(a_{m-1}+2^{m-1})
am=4am−1+2m,am+2m=4(am−1+2m/2)=4(am−1+2m−1),则
b
m
:
=
a
m
+
2
m
=
O
(
4
m
)
b_m:=a_m+2^m=O(4^m)
bm:=am+2m=O(4m). 这里配上
2
m
2^m
2m构造等比数列就是数列题的典型做法。
Q3: 对于
T
(
n
)
=
T
(
n
/
4
)
+
T
(
n
/
2
)
+
n
2
T(n)=T(n/4)+T(n/2)+n^2
T(n)=T(n/4)+T(n/2)+n2用递归树法猜测渐近行为。并用数学归纳法证明。
A3:
T
(
n
)
=
n
2
+
T
(
n
/
2
)
+
T
(
n
/
4
)
=
n
2
+
n
2
/
2
2
+
n
2
/
4
2
+
T
(
n
/
4
)
+
T
(
n
/
8
)
+
T
(
n
/
8
)
+
T
(
n
/
16
)
=
⋯
=
n
2
+
a
n
2
+
a
2
n
2
+
⋯
=
O
(
n
2
)
T(n)=n^2+T(n/2)+T(n/4)=n^2+n^2/2^2+n^2/4^2+T(n/4)+T(n/8)+T(n/8)+T(n/16)=\cdots=n^2+an^2+a^2n^2+\cdots=O(n^2)
T(n)=n2+T(n/2)+T(n/4)=n2+n2/22+n2/42+T(n/4)+T(n/8)+T(n/8)+T(n/16)=⋯=n2+an2+a2n2+⋯=O(n2). (容易证明出现几何级数)
树此处就不画了。注意递归树和不断用省略号写是一个意思。
为了严格证明(归纳),直接设
T
(
n
)
<
c
n
2
T(n)<cn^2
T(n)<cn2即可。
另一方面
Ω
(
n
2
)
\Omega(n^2)
Ω(n2)显然(
T
(
n
)
≥
n
2
T(n)\ge n^2
T(n)≥n2)。
Master method
Q0: 对于主方法,
T
(
n
)
+
a
T
(
n
/
b
)
+
f
(
n
)
T(n)+aT(n/b)+f(n)
T(n)+aT(n/b)+f(n)中的
a
,
b
,
f
a,b,f
a,b,f有何要求?为什么?
A0:
a
≥
1
,
b
>
1
,
f
a\ge 1,b>1,f
a≥1,b>1,f渐近地恒为正(即在
n
n
n足够大时
f
(
n
)
f(n)
f(n)为正)
f
(
n
)
f(n)
f(n)渐近地恒为正其实从数学的本质上讲不一定是必要的,只是为了方便做出的假设。当然,对于非恒正的函数我们需要扩展渐近记号的定义。并且
f
f
f不恒为正时就难以得出
Θ
\Theta
Θ而只可能得到
O
O
O. 实际算法中,
f
f
f常常指创建“子问题”,合并“子结果”的开销,一般来说是正的。
容易发现
f
f
f恒正递增时,对
0
<
a
<
1
0<a<1
0<a<1时只有两种情况:即
f
(
n
)
f(n)
f(n)有界时
T
(
n
)
=
O
(
1
)
T(n)=O(1)
T(n)=O(1),
f
(
n
)
f(n)
f(n)无界时
T
(
n
)
=
O
(
f
(
n
)
)
T(n)=O(f(n))
T(n)=O(f(n)). 这种情况相对来说比较平凡。且实际算法中
a
<
1
a<1
a<1难以有实际意义。
一旦
a
≥
1
a\ge 1
a≥1,设
f
(
n
)
f(n)
f(n)有正的下界,那么如果
b
≤
1
b\le 1
b≤1,则
T
(
n
)
T(n)
T(n)显然发散。在实际中,这也无法导出任何有意义的递归算法。
Q1: 主方法Case 1:
f
(
n
)
=
O
(
n
l
o
g
b
a
−
ϵ
)
f(n)=O(n^{log_b a-\epsilon})
f(n)=O(nlogba−ϵ),则
T
(
n
)
=
Θ
(
n
l
o
g
b
a
)
T(n)=\Theta(n^{log_b a})
T(n)=Θ(nlogba). 请举例说明
f
(
n
)
=
o
(
n
l
o
g
b
a
)
f(n)=o(n^{log_b a})
f(n)=o(nlogba)不一定可行的根源在哪里。
A1: (特别地找一个例子)考虑
T
(
n
)
=
T
(
n
/
2
)
+
f
(
n
)
T(n)=T(n/2)+f(n)
T(n)=T(n/2)+f(n)则
T
(
n
)
≈
∑
k
=
1
l
o
g
2
n
f
(
2
k
)
T(n)\approx\sum_{k=1}^{log_2n}f(2^k)
T(n)≈∑k=1log2nf(2k). 如果
f
(
n
)
=
1
f(n)=1
f(n)=1则求和发散,如果
f
(
n
)
=
n
0
−
ϵ
f(n)=n^{0-\epsilon}
f(n)=n0−ϵ则求和收敛(实际上这里得到的是收敛的等比级数)。
总之,
T
(
n
)
=
Θ
(
n
l
o
g
b
a
)
T(n)=\Theta(n^{log_b a})
T(n)=Θ(nlogba)是否成立的关键是正项级数的敛散性。这就容易看出其实
T
(
n
)
=
T
(
n
/
2
)
+
f
(
n
)
,
f
(
n
)
=
O
(
l
n
−
1
−
ϵ
n
)
T(n)=T(n/2)+f(n),f(n)=O(ln^{-1-\epsilon}n)
T(n)=T(n/2)+f(n),f(n)=O(ln−1−ϵn)也能推出
T
(
n
)
=
O
(
1
)
T(n)=O(1)
T(n)=O(1),但
T
(
n
)
=
T
(
n
/
2
)
+
f
(
n
)
,
f
(
n
)
=
O
(
l
n
−
1
n
)
=
o
(
1
)
T(n)=T(n/2)+f(n),f(n)=O(ln^{-1} n)=o(1)
T(n)=T(n/2)+f(n),f(n)=O(ln−1n)=o(1)显然就不行。
Q2: 回顾Q1,说出主方法Case 2:
f
(
n
)
=
Θ
(
n
l
o
g
b
a
l
o
g
k
n
)
,
k
≥
0
f(n)=\Theta(n^{log_b a}log^k n),k\ge 0
f(n)=Θ(nlogbalogkn),k≥0在考察
T
(
n
)
=
2
T
(
n
/
2
)
+
f
(
n
)
T(n)=2T(n/2)+f(n)
T(n)=2T(n/2)+f(n)时,相当于考察什么正项级数的渐近性质?
A2:
∑
i
=
0
l
o
g
n
n
(
l
o
g
n
−
i
)
k
\sum_{i=0}^{logn}n(logn-i)^k
∑i=0lognn(logn−i)k,在
n
n
n足够大时,显然
i
i
i较小的一部分(比如说一半)求和就起到了占常数比例的作用。具体地,
∑
i
=
0
l
o
g
n
n
(
l
o
g
n
−
i
)
k
>
∑
i
=
0
l
o
g
n
/
2
n
(
l
o
g
n
2
)
k
=
Θ
(
n
l
o
g
k
+
1
n
)
\sum_{i=0}^{logn}n(logn-i)^k>\sum_{i=0}^{logn/2} n(\frac{logn}2)^k=\Theta(nlog^{k+1}n)
∑i=0lognn(logn−i)k>∑i=0logn/2n(2logn)k=Θ(nlogk+1n).
Q3: 主方法Case 3:
f
(
n
)
=
Ω
(
n
l
o
g
b
a
+
ϵ
)
,
a
f
(
n
/
b
)
≤
c
f
(
n
)
,
c
<
1
f(n)=\Omega (n^{log_b a+\epsilon}),af(n/b)\le cf(n),c<1
f(n)=Ω(nlogba+ϵ),af(n/b)≤cf(n),c<1,则
T
(
n
)
=
Θ
(
f
(
n
)
)
T(n)=\Theta(f(n))
T(n)=Θ(f(n)). regularity condition即
a
f
(
n
/
b
)
≤
c
f
(
n
)
,
c
<
1
af(n/b)\le cf(n),c<1
af(n/b)≤cf(n),c<1用在了什么地方?
A3: 一共有不超过
1
+
c
+
c
2
+
⋯
+
c
l
o
g
b
n
1+c+c^2+\cdots+c^{log_b n}
1+c+c2+⋯+clogbn个(有限个)
f
(
n
)
f(n)
f(n),则
T
(
n
)
T(n)
T(n)中除去递归出口外所有开销之和与
f
(
n
)
f(n)
f(n)同量级。
注:不严格地说,如果画出递归树,那么主方法的Case 1, 2, 3分别对应着开销集中在叶子、开销平均分摊、开销集中在根结点。实际意义分别是计算开销集中在递归出口、分散在计算全过程、集中在最大的“归并”。
注:稍微严格地,前一段所说的“集中”其实指的是开销有一常数比例部分集中在叶子。课程中强调"The weight increases geometrically from the root to the leaves. The leaves hold a constant fraction of the total weight."
Q4: 接上,递归出口那部分的开销怎么办?
A4:
T
(
n
)
=
a
T
(
n
/
b
)
+
f
(
n
)
=
a
2
T
(
n
/
b
2
)
+
⋯
=
⋯
T(n)=aT(n/b)+f(n)=a^2T(n/b^2)+\cdots=\cdots
T(n)=aT(n/b)+f(n)=a2T(n/b2)+⋯=⋯,最后递归出口对应的开销项应该是
a
l
o
g
b
n
=
n
l
o
g
b
a
a^{log_bn}=n^{log_b a}
alogbn=nlogba量级。
注:这能看出其实主方法Case 3的条件
f
(
n
)
=
Ω
(
n
l
o
g
b
a
+
ϵ
)
f(n)=\Omega(n^{log_b a+\epsilon})
f(n)=Ω(nlogba+ϵ)可以弱化为
f
(
n
)
=
Ω
(
n
l
o
g
b
a
)
f(n)=\Omega(n^{log_b a})
f(n)=Ω(nlogba).
Q5: regularity condition实际上和
Θ
(
n
l
o
g
b
a
+
ϵ
)
,
Θ
(
n
l
o
g
b
a
)
\Theta(n^{log_b a+\epsilon}),\Theta(n^{log_b a})
Θ(nlogba+ϵ),Θ(nlogba)间具有一定的密切联系。请简要说明。
A5: 如果
f
(
n
)
=
Θ
(
n
l
o
g
b
a
+
ϵ
)
,
ϵ
≥
0
f(n)=\Theta(n^{log_b a+\epsilon}),\epsilon\ge 0
f(n)=Θ(nlogba+ϵ),ϵ≥0,则随着
k
k
k增大,由
Θ
\Theta
Θ的定义容易得
f
(
n
)
a
k
f
(
n
/
b
k
)
=
Θ
(
b
k
ϵ
)
\frac{f(n)}{a^kf(n/b^k)}=\Theta(b^{k\epsilon})
akf(n/bk)f(n)=Θ(bkϵ).(对于足够大的一切
n
n
n,关于
k
k
k的渐近行为都如此。注意这不是关于
n
n
n的渐近行为)
再考察regularity condition的一个必要条件是
f
(
n
)
a
k
f
(
n
/
b
k
)
=
Ω
(
c
−
k
)
\frac{f(n)}{a^kf(n/b^k)}=\Omega(c^{-k})
akf(n/bk)f(n)=Ω(c−k),这就知道了
f
(
n
)
=
Θ
(
n
l
o
g
b
a
)
f(n)=\Theta(n^{log_b a})
f(n)=Θ(nlogba)能推出regularity condition一定不成立。
而
f
(
n
)
=
Θ
(
n
l
o
g
b
a
+
ϵ
)
f(n)=\Theta(n^{log_b a+\epsilon})
f(n)=Θ(nlogba+ϵ)的情况,可以考虑
c
1
n
l
o
g
b
a
+
ϵ
=
f
m
(
n
)
≤
f
(
n
)
≤
f
M
(
n
)
=
c
2
n
l
o
g
b
a
+
ϵ
c_1n^{log_b a+\epsilon}=f_m(n)\le f(n)\le f_M(n)=c_2n^{log_b a+\epsilon}
c1nlogba+ϵ=fm(n)≤f(n)≤fM(n)=c2nlogba+ϵ,并令
T
m
(
n
)
=
a
T
m
(
n
/
b
)
+
f
m
(
n
)
,
T
M
(
n
)
=
a
T
M
(
n
/
b
)
+
f
M
(
n
)
T_m(n)=aT_m(n/b)+f_m(n),T_M(n)=aT_M(n/b)+f_M(n)
Tm(n)=aTm(n/b)+fm(n),TM(n)=aTM(n/b)+fM(n),根据
f
f
f和
T
T
T间某种意义上的“单调”关系,我们只需考察
T
m
T_m
Tm和
T
M
T_M
TM的渐近行为,于是就能得到其实
f
(
n
)
=
Θ
(
n
l
o
g
b
a
+
ϵ
)
f(n)=\Theta(n^{log_b a+\epsilon})
f(n)=Θ(nlogba+ϵ)就足以单独作为主定理Case 3的条件。(注意是
Θ
\Theta
Θ而不是
Ω
\Omega
Ω)
注:对比
Θ
(
b
k
ϵ
)
,
ϵ
>
0
\Theta(b^{k\epsilon}),\epsilon>0
Θ(bkϵ),ϵ>0和
Ω
(
c
−
k
)
\Omega(c^{-k})
Ω(c−k),我们可以发现
Θ
(
n
l
o
g
b
a
+
ϵ
)
\Theta(n^{log_ba+\epsilon})
Θ(nlogba+ϵ)其实就是大尺度平均意义下的regularity condition.
Q6: 如果
f
(
n
)
=
ω
(
n
l
o
g
b
a
+
ϵ
)
f(n)=\omega(n^{log_b a+\epsilon})
f(n)=ω(nlogba+ϵ)那么
f
(
n
)
f(n)
f(n)可能不满足regularity condition吗?
A6: 可能。比如
f
f
f不单调的情况。反例是平凡的。