浅谈 T(n) = a(n / b) + f(n)

主定理【master theorem】

本文部分参考《算法导论》。相关证明由于过于复杂,已略去。

前言

  • Θ\ThetaΘ 读作 theta,即等于。

  • OOO 读作 big-oh,即小于等于。

  • ooo 读作 small-oh,即小于。

  • Ω\OmegaΩ 读作 big omega,即大于等于。

  • ω\omegaω 读作 small omega,即大于。

  • T(n)T(n)T(n) 时间复杂度。

  • f(n)f(n)f(n) 关于 nnn 的函数。

  • f(x)f(x)f(x) 多项式大于 g(x)g(x)g(x),则存在实数 e>0e > 0e>0,使得 f(x)>g(x)×xef(x)>g (x) \times x^ef(x)>g(x)×xe

  • f(x)f(x)f(x) 渐进大于 g(x)g(x)g(x),则存在实数 c>0c > 0c>0kkk,使得对于任意 n>=kn >= kn>=kc×f(x)>=g(x)c\times f(x) >= g(x)c×f(x)>=g(x)

  • 对于 log⁡n\log nlogn,不需要弄清其具体的底数。原因在于 lim⁡n→∞log⁡xnlog⁡yn=ln⁡yln⁡x(x≠y)\lim \limits_{n \to \infty}\frac{\log_x n}{\log_y n} = \frac{\ln y}{\ln x}(x \not = y)nlimlogynlogxn=lnxlny(x=y)。即 log⁡\loglog 级别的渐进意义是一样的。

主定理

对于一个形如 T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f(n)T(n)=aT(bn)+f(n) 的式子(令 a≥1,b>1a \ge 1,b > 1a1,b>1 且为常数),有以下渐近界 :

{T(n)=Θ(nlog⁡ba) If ∃ε>0,f(n)=O(nlog⁡ba−ε)T(n)=Θ(nlog⁡balog⁡n) If f(n)=Θ(nlog⁡ba)T(n)=Θ(f(n)) If ∃ε>0,f(n)=Ω(nlog⁡ba+ε) and If ∀n→∞,∃c<1, aT(nb)≤cf(n) \begin{cases} T(n) = \Theta (n^{\log_b a}) \text{ If }\exists \varepsilon > 0,f(n) = O(n^{\log_b a - \varepsilon})\\\\ T(n) = \Theta (n^{\log_b a}\log n) \text{ If }f(n) = \Theta(n^{\log_b a})\\\\ T(n) = \Theta (f(n)) \text{ If } \exists \varepsilon > 0,f(n) = \Omega(n^{\log_b a + \varepsilon}) \text{ and If } \forall n \to \infty,\exists c < 1, \ aT(\frac{n}{b}) \le cf(n)\\ \end{cases} T(n)=Θ(nlogba) If ε>0,f(n)=O(nlogbaε)T(n)=Θ(nlogbalogn) If f(n)=Θ(nlogba)T(n)=Θ(f(n)) If ε>0,f(n)=Ω(nlogba+ε) and If n,c<1, aT(bn)cf(n)

简单的,我们可以描述成以下情况:

T(n)={O(nd),d>log⁡baO(ndlog⁡n),d=log⁡baO(nlog⁡ba),d<log⁡ba T(n)= \begin{cases} O(n^d),d > \log_b a\\\\ O(n^d \log n),d = \log_b a\\\\ O(n^{\log_b a}),d < \log_b a\\ \end{cases} T(n)=O(nd),d>logbaO(ndlogn),d=logbaO(nlogba),d<logba

例题

  1. T(n)=2T(n2)+nT(n) = 2T(\frac{n}{2}) + nT(n)=2T(2n)+n

∵b=2,a=2,f(n)=Θ(nlog⁡22)=1∴T(n)=Θ(nlog⁡n) \because b = 2,a = 2,f(n) = \Theta(n^{\log_2 2}) = 1\\ \therefore T(n) = \Theta(n \log n)\\ b=2,a=2,f(n)=Θ(nlog22)=1T(n)=Θ(nlogn)

  1. T(n)=9T(n3)+nT(n) = 9T(\frac{n}{3}) + nT(n)=9T(3n)+n

∵b=3,a=9,f(n)=n∵Θ(nlog⁡ba)=Θ(n2),f(n)=O(nlog⁡39−ε)=O(n2) If ε=1∴T(n)=Θ(n2) \because b = 3,a = 9,f(n) = n\\ \because \Theta (n^{\log_b a}) = \Theta (n^2),f(n) = O(n^{\log_3 9 - \varepsilon})= O(n^2) \textit{ If }\varepsilon = 1\\ \therefore T(n) = \Theta(n^2)\\ b=3,a=9,f(n)=nΘ(nlogba)=Θ(n2),f(n)=O(nlog39ε)=O(n2) If ε=1T(n)=Θ(n2)

  1. T(n)=3T(n4)+nlog⁡nT(n) = 3T(\frac{n}{4}) + n \log nT(n)=3T(4n)+nlogn

∵b=4,a=3,f(n)=nlog⁡n∵Θ(nlog⁡ba)=O(n0.793),f(n)=Ω(nlog⁡ba)=Ω(nlog⁡43+ε) If ε≈0.2∵n→∞,aT(nb)≤cf(n) If c=34∴T(n)=Θ(nlog⁡n) \because b = 4,a = 3,f(n) = n \log n\\ \because \Theta (n^{\log_b a}) = O (n^{0.793}),f(n) = \Omega(n^{\log_b a}) = \Omega(n^{\log_4 3 + \varepsilon})\textit{ If }\varepsilon \thickapprox 0.2\\ \because n \to \infty,aT(\frac{n}{b}) \le cf(n) \textit{ If } c = \frac{3}{4}\\ \therefore T(n) = \Theta(n \log n)\\ b=4,a=3,f(n)=nlognΘ(nlogba)=O(n0.793),f(n)=Ω(nlogba)=Ω(nlog43+ε) If ε0.2n,aT(bn)cf(n) If c=43T(n)=Θ(nlogn)

  1. T(n)=2T(n2)+nlog⁡nT(n) = 2T(\frac{n}{2}) + n \log nT(n)=2T(2n)+nlogn

可以求出 b=2,a=2,f(n)=nlog⁡n,Θ(nlog⁡ba)=O(n)b = 2,a = 2,f(n) = n \log n,\Theta (n^{\log_b a}) = O (n)b=2,a=2,f(n)=nlogn,Θ(nlogba)=O(n)。看似是主定理的第三种情况,但是发现 f(n)nlog⁡ba=log⁡n<nε(ε>0)\frac{f(n)}{n^{\log_b a}} = \log n < n^\varepsilon(\varepsilon > 0)nlogbaf(n)=logn<nε(ε>0),也就是 log⁡n=o(nε)\log n = o(n^\varepsilon)logn=o(nε),即两者不同阶。

故只能采取递归树的方式解决,将叶子节点与非叶子节点分开计算最后答案是 Θ(2log⁡n)+Θ(n∑i=1log⁡n1)=Θ(n)+Θ(nlog⁡n(1+log⁡n)2)≈O(nlog⁡2n)\Theta(2^{\log n}) + \Theta(n \sum_{i = 1}^{\log n} 1) = \Theta(n) + \Theta(n\frac{\log n(1 + \log n)}{2}) \thickapprox O(n \log^2 n)Θ(2logn)+Θ(ni=1logn1)=Θ(n)+Θ(n2logn(1+logn))O(nlog2n)

总结

  • 其中第一情况要求的小于是多项式意义下的小于,也就是 f(n)f(n)f(n) 渐近小于 nlog⁡ban^{\log_b a}nlogba,即相差一个因子 nεn^\varepsilonnε,其中 ε\varepsilonε 是一个大于 000 的常数。第三种情况同理,但多了一个“正则”的条件。

  • T(n)=Θ(nlog⁡blog⁡k+1n) If f(n)=Θ(nlog⁡balog⁡kn),k≥1T(n) = \Theta (n^{\log_b}\log^{k + 1} n) \text{ If }f(n) = \Theta(n^{\log_b a} \log^k n),k \ge 1T(n)=Θ(nlogblogk+1n) If f(n)=Θ(nlogbalogkn),k1

  • 主定理并不能覆盖所有的情况,但是可以通过递归树的方式求解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值