【墨鳌】【Master Method】

Master Method

  • 分治递归,是我们常用的程序设计思想,如何衡量一个递归算法设计的好坏呢?
  • 这就使得我们得去思考:递归算法的复杂度如何计算

Master Method 是这样描述的:

T(n)=kT(n/m)+f(n),f(n)=nd

T(n){O(nd)k<mdO(ndlogmn)k=mdO(nlogmk)k>md

递归树

f(n)

f(n/m)

......

f(n/m)

f(n/m^i)

f(n/m^i)

f(n/m^i)

f(n/m^i)

f(n/m^i)

f(n/m^i)

f(n/m^i)

f(n/m^i)

f(n/m^i)

  • 第一层:1

  • 第二层:k

  • 第三层:k2

  • i+1 层:ki

考虑叶子节点 f(n/mi)=1n=mii=logmn

推导过程

f(n)=nd, i=logmnT(n)=Σf=f(n)+[kf(n/m)]+[k2f(n/m2)]++[kif(n/mi)]=(nd)[1+kmd+(kmd)2++(kmd)i]

中括号内,为等比数列求和,公比 q 分类讨论

S=1+kmd+(kmd)2+...+(kmd)i,q=kmd

考虑 i+

  1. when q=1, S=i+1=i

  2. when q<1, S=11q

  3. when q>1, S=qi

T(n)=ndS 分三类讨论:

  1. q=1k=mdT(n)=ndi=ndlogmn=O(ndlogmn)
  2. q<1k<mdT(n)=nd11q=Cnd=O(nd)
  3. q>1k>mdT(n)=ndqi=nd(kmd)(logmn)=O(nlogmk)()

() 推导:

nd(kmd)(logmn)

=ndklog  mn(md)log  mn

=ndklog  mn(mlog  mn)d

=ndklog  mnnd

=klog mn

=klog  knlog  km

=(klogkn)1log k m

=nlogmk

练习题

master method

T(n){O(nd)k<mdO(ndlogmn)k=mdO(nlogmk)k>md

1.T(n)=T(n/3)+n

k=1,m=3,d=1k<mdT(n)=O(nd)=Θ(n)

2.T(n)=T(2n/3)+1

k=1,m=3/2,n=0k=mdT(n)=O(ndlogmn)=Θ(logn)

3.T(n)=4T(n/2)+n

k=4,m=2,d=1k>mdT(n)=O(nlogmk)=Θ(n2)

4.T(n)=2T(n/2)+n

k=2,m=2,n=1k=mdT(n)=O(ndlogmn)=Θ(nlogn)

posted @   墨鳌  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2017-04-07 计算几何-点与多边形的位置判断-zoj1081Points Within
点击右上角即可分享
微信分享提示