算法导论学习笔记[1] #20210709

算法导论学习笔记[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
T(n/2)
T(n/2)
T(n/2)
T(n/2)
n
n/2
T(n/4)
T(n/4)
T(n/4)
T(n/4)
T(n/2)
T(n/2)
T(n/2)

以此类推,得到 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/24+n/416+=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=4am1+2m,am+2m=4(am1+2m/2)=4(am1+2m1),则 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 a1,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 a1,设 f ( n ) f(n) f(n)有正的下界,那么如果 b ≤ 1 b\le 1 b1,则 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(ln1ϵ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(ln1n)=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),k0在考察 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(logni)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(logni)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)=Ω(ck),这就知道了 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}) Ω(ck),我们可以发现 Θ ( 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不单调的情况。反例是平凡的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值