主定理 master theorem

如果有如下递归推倒式

T(n)=aT(nb)+f(n) T ( n ) = a T ( n b ) + f ( n )

n>0 n > 0 , 根据 a a , b, f(n) f ( n ) 分析算法复杂度


首先我们可以理解一下 a a , b, n n , f(n)的含义

  • n n : 问题规模
  • nb: 子问题规模
  • a a : 子问题数量
  • f(n): 递推以外额外的工作量

我们先看一个简单的例子, T(n)=i=1ni T ( n ) = ∑ i = 1 n ⁡ i , 如果把它写成上面的递归推导式, 满足 T(n)=aT(na) T ( n ) = a T ( n a ) 更详细地表示:

i=1100i=i=110i+i=1120i+...+i=91100i ∑ i = 1 100 ⁡ i = ∑ i = 1 10 ⁡ i + ∑ i = 11 20 ⁡ i + . . . + ∑ i = 91 100 ⁡ i

每个子问题规模是原问题的 110 1 10 , 但是子问题数量也变成了10倍


如果不考虑 f(n) f ( n ) T(n)=aT(nb) T ( n ) = a T ( n b ) , 我们考虑下a和b之间的大小,

  • 如果 a=b a = b , 采用递归后总问题规模不变
  • 如果 a<b a < b , 采用递归后总问题规模变小
  • 如果 a>b a > b , 采用递归后总问题规模变大

这个指标可以用 logab log b a 来衡量


k=lognb k = log b n 展开递推式:

T(n)=akT(1)+j=0k1ajf(nbj) T ( n ) = a k T ( 1 ) + ∑ j = 0 k − 1 ⁡ a j f ( n b j )

只考虑 f(n) f ( n ) 为多项式的情况,设 f(n)=cnd f ( n ) = c n d
T(n)=akT(1)+cj=0k1aj(nbj)d T ( n ) = a k T ( 1 ) + c ∑ j = 0 k − 1 ⁡ a j ( n b j ) d


f(n)=cnd f ( n ) = c n d 设定的基础上, 考虑一种特殊情况, logab=d l o g b a = d , 即 a=bd a = b d

T(n)=bdkT(1)+cj=0k1bdj(nbj)d T ( n ) = b d k T ( 1 ) + c ∑ j = 0 k − 1 ⁡ b d j ( n b j ) d

T(n)=bdkT(1)+cj=0k1nd T ( n ) = b d k T ( 1 ) + c ∑ j = 0 k − 1 ⁡ n d

T(n)=bdlognbT(1)+cknd T ( n ) = b d l o g b n T ( 1 ) + c k n d

T(n)=ndT(1)+cndlognb T ( n ) = n d T ( 1 ) + c n d l o g b n

T(n)=ndT(1)+clgbndlgn T ( n ) = n d T ( 1 ) + c lg ⁡ b n d lg ⁡ n

所以 T(n)=Θ(ndlgn) T ( n ) = Θ ( n d lg ⁡ n )


f(n)=cnd f ( n ) = c n d 设定的基础上, 对一般情况, 展开表达式:

T(n)=akT(1)+cj=0k1aj(nbj)d T ( n ) = a k T ( 1 ) + c ∑ j = 0 k − 1 ⁡ a j ( n b j ) d

T(n)=akT(1)+cj=0k1nd(abd)j T ( n ) = a k T ( 1 ) + c ∑ j = 0 k − 1 ⁡ n d ( a b d ) j

利用等比数列求和公式可以得到
T(n)=akT(1)+cndabd(abd)k11abd1 T ( n ) = a k T ( 1 ) + c n d a b d ( a b d ) k − 1 − 1 a b d − 1

T(n)=ak(T(1)+bdabd)+cndbdabd T ( n ) = a k ( T ( 1 ) + b d a − b d ) + c n d b d a − b d

T(n)=(T(1)+bdabd)nlogab+cbdabdnd T ( n ) = ( T ( 1 ) + b d a − b d ) n l o g b a + c b d a − b d n d

可以看到 T(n)=max(O(nd),O(nlogab)) T ( n ) = m a x ( O ( n d ) , O ( n l o g b a ) )

  • logab<d log b a < d : T(n)=O(nd) T ( n ) = O ( n d )
  • logab=d log b a = d : T(n)=O(ndlgn) T ( n ) = O ( n d lg ⁡ n )
  • logab>d log b a > d : T(n)=O(nlogab) T ( n ) = O ( n l o g b a )

更一般的情况请看维基百科页面 Master theorem


回到例子 T(n)=i=1ni T ( n ) = ∑ i = 1 n ⁡ i ,它可以表示为 T(n)=aT(na) T ( n ) = a T ( n a ) ,所以它的复杂度为 O(nlogaa)=O(n) O ( n log a a ) = O ( n )
再如快速排序,它可以表示为 T(n)=2T(n2)+O(n) T ( n ) = 2 T ( n 2 ) + O ( n ) 所以它的复杂度为 nlgn n lg ⁡ n

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值