Master Method
- 分治递归,是我们常用的程序设计思想,如何衡量一个递归算法设计的好坏呢?
- 这就使得我们得去思考:递归算法的复杂度如何计算
Master Method 是这样描述的:
T(n)=kT(n/m)+f(n),f(n)=nd
T(n)∈⎧⎪⎨⎪⎩O(nd)k<mdO(nd⋅logmn)k=mdO(nlogmk)k>md
递归树
-
第一层:1 个
-
第二层:k 个
-
第三层:k2 个
-
第 i+1 层:ki个
考虑叶子节点 f(n/mi)=1⟹n=mi⟺i=logmn
推导过程
∵f(n)=nd, i=logmn∴T(n)=Σf=f(n)+[k⋅f(n/m)]+[k2⋅f(n/m2)]+⋯+[ki⋅f(n/mi)]=(nd)[1+kmd+(kmd)2+⋯+(kmd)i]
中括号内,为等比数列求和,公比 q 分类讨论
S=1+kmd+(kmd)2+...+(kmd)i,q=kmd
考虑 i→+∞
-
when q=1, S=i+1=i
-
when q<1, S=11−q
-
when q>1, S=qi
∴T(n)=nd⋅S 分三类讨论:
- q=1⟺k=mdT(n)=nd⋅i=nd⋅logmn=O(nd⋅logmn)
- q<1⟺k<mdT(n)=nd⋅11−q=C⋅nd=O(nd)
- q>1⟺k>mdT(n)=nd⋅qi=nd⋅(kmd)(logmn)=O(nlogmk)(∗)
(∗) 推导:
nd⋅(kmd)(logmn)
=nd⋅klog mn(md)log mn
=nd⋅klog mn(mlog mn)d
=nd⋅klog mnnd
=klog mn
=klog knlog km
=(klogkn)1log k m
=nlogmk
练习题
master method
T(n)∈⎧⎪⎨⎪⎩O(nd)k<mdO(nd⋅logmn)k=mdO(nlogmk)k>md
1.T(n)=T(n/3)+n
k=1,m=3,d=1⟹k<mdT(n)=O(nd)=Θ(n)
2.T(n)=T(2n/3)+1
k=1,m=3/2,n=0⟹k=mdT(n)=O(ndlogmn)=Θ(logn)
3.T(n)=4T(n/2)+n
k=4,m=2,d=1⟹k>mdT(n)=O(nlogmk)=Θ(n2)
4.T(n)=2T(n/2)+n
k=2,m=2,n=1⟹k=mdT(n)=O(ndlogmn)=Θ(nlogn)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2017-04-07 计算几何-点与多边形的位置判断-zoj1081Points Within