分治策略时间复杂度分析(三)-用主方法求解递归式

分治策略时间复杂度分析(三)-用递归树方法求解递归式

 虽然以上两种方法都可以求解递归式,但是它们的缺点是比较复杂。所以我们提出第三种方法-主方法,这个方法可以快速求解,很容易地求解很多的递归式,通常不需要纸和笔的帮助。



前言

进行分治策略时间复杂度分析有三种方法,分别为

  • 1.用代入法求解递归式
  • 2.用递归树方法求解递归式
  • 3.用主方法求解递归式
     本篇文章介绍第三种方法,即用主方法来求解递归式。主方法为如下形式的递归式提供了一种“菜谱”式的求解方法:
    T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
     其中 a ≥ 1 , b ≥ 1 a\geq1,b\geq1 a1,b1是常数,f(n)是渐近正函数。这个递归式描述的是这样一种算法的运行时间:它将规模为n的问题分解为a个子问题,每个子问题规模为n/b,其中a和b都是正常数。a个子问题递归地进行求解,每个花费时间T(n/b)。函数f(n)包含了问题分解和子问题解合并的代价

一、主定理

  令 a ≥ 1 和 b > 1 a\geq1和b>1 a1b>1是常数,f(n)是一个函数,T(n)是定义在非负整数上的递归式:
T ( n ) = a T ( n / b ) = f ( n ) T(n)=aT(n/b)=f(n) T(n)=aT(n/b)=f(n)
其中,我们将n/b解释为 ⌊ n / b ⌋ 和 ⌈ n / b ⌉ \lfloor n/b\rfloor 和\lceil n/b\rceil n/bn/b。那么T(n)有如下的渐近界:

  1. 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0,有 f ( n ) = O ( n l o g b a − ϵ ) f(n)=O(n^{log_ba-\epsilon}) f(n)=O(nlogbaϵ),则 T ( n ) = Θ ( n l o g b a ) T(n)=\Theta(n^{log_ba}) T(n)=Θ(nlogba)
  2. f ( n ) = Θ ( n l o g b a ) f(n)=\Theta(n^{log_ba}) f(n)=Θ(nlogba),则 T ( n ) = Θ ( n l o g b a l g n ) T(n)=\Theta(n^{log_ba}lgn) T(n)=Θ(nlogbalgn)
  3. 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0,有 f ( n ) = Ω ( n l o g b a + ϵ ) f(n)=\Omega(n^{log_ba+\epsilon}) f(n)=Ω(nlogba+ϵ),且对某个常数c<1和所有足够大的n有 a f ( n / b ) ≤ c f ( n ) af(n/b)\leq cf(n) af(n/b)cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))
     在使用主定理之前,对于三种情况的每一种,我们将函数f(n)与函数 n l o g b a n^{log_ba} nlogba进行比较。直觉上,两个函数较大者决定了递归式的解,但是这种较大较小应该是多项式意义上的比较,而不是单纯的大小。
     同时呢,还要注意第三种情况实际上也是有前提的,不过对于大多数情况来看,第三种往往都会满足。

二、很值得注意的反例!

 主方法不能用于如下的递归式:
T ( n ) = 2 T ( n / 2 ) + n l g n T(n)=2T(n/2)+nlgn T(n)=2T(n/2)+nlgn
 虽然这个递归式看起来有恰当的形式:a=2,b=2,f(n)=nlgn,以及 n l o g b a = n nlog_b a=n nlogba=n。。你可能会错误地认为该情况适用于情况3,因为f(n)=nlgn渐近大于 n l o g b a = n n^{log_ba}=n nlogba=n。问题出在它并不是多项式意义上的大于。对于任意的正常数 ϵ \epsilon ϵ,比值 f ( n ) / n l o g b a = ( n l g n ) / n = l g n f(n)/n^{log_ba}=(nlgn)/n=lgn f(n)/nlogba=(nlgn)/n=lgn都渐近小于 n ϵ n^\epsilon nϵ。因此,该递归式落入了情况2和情况3之间的间隙,根本不好用!

总结

主方法法是求递归式的一个很实用的方法,我在此做一个笔记,也希望可以帮助到你!

参考文档: 《算法导论》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值