递归式求解-主方法

来源:互联网 发布:mac软件为什么无法删除 编辑:程序博客网 时间:2024/05/22 20:27

http://pytlab.org/2017/09/10/%E9%80%92%E5%BD%92%E5%BC%8F%E6%B1%82%E8%A7%A3-%E4%B8%BB%E6%96%B9%E6%B3%95/

本文对递归式求解中很重要的主方法进行介绍总结。

主方法

主方法为如下形式的递归式提供了一种”菜谱式”的求解方法:

T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)

其中a1,b>1a≥1,b>1是常数,f(n)f(n)是渐进正数。

上式描述了这样的一个算法运行时间: 他将原问题的规模为nn的问题划分为aa个小的子问题,每个子问题的规模为原来的1b1baa个子问题递归的进行求解,每个花费时间为T(n/b)T(n/b)。子问题合并的代价为f(n)f(n)

主定理

这里我将书上的定义直接贴上来了。

主方法依赖主定理:

a1a≥1b>1b>1是常数,f(n)f(n)是一个函数,T(n)T(n)是定义在非负整数上的递归式:

T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)

其中我们将忽略舍入问题n/bn/b解释为n/b⌊n/b⌋n/b⌈n/b⌉, 那么T(n)T(n)有如下渐进界:

  1. 若对某个常数ϵ>0ϵ>0f(n)=O(nlogbaϵ)f(n)=O(nlogb⁡a−ϵ)T(n)=Θ(nlogba)T(n)=Θ(nlogb⁡a)
  2. f(n)=Θ(nlogba)f(n)=Θ(nlogb⁡a), 则T(n)=Θ(nbalgn)T(n)=Θ(nbalgn)
  3. 若对某个常数ϵ>0ϵ>0f(n)=Ω(nlogba+ϵ)f(n)=Ω(nlogba+ϵ), 且对某个常数c<1c<1和所有足够大的nny有af(n/b)cf(n)af(n/b)≤cf(n), 则T(n)=Θ(f(n))T(n)=Θ(f(n))

主定理的直观理解

主定理其实主要是比较两个函数f(n)f(n)nlogbanlogb⁡a, 其中较大的那个决定最终递归式的渐近解。

  1. nlogba>f(n)nlogb⁡a>f(n), 则就是情况1, 解就直接是T(n)=Θ(nlogba)T(n)=Θ(nlogb⁡a)
  2. nlogba=f(n)nlogb⁡a=f(n), 则就是情况2, 解就需要在f(n)f(n)的基础上乘上个对数因子lgnlgnT(n)=Θ(nlogbalgn)T(n)=Θ(nlogb⁡algn)
  3. nlogba<f(n)nlogb⁡a<f(n), 则就是情况3, 解为T(n)=Θ(f(n))T(n)=Θ(f(n))

主定理的细节理解

多项式意义上大于

主定理中,除了渐进大于(小于)以外,还有一个重要的概念就是多项式意义的大于(小于)(polynomially larger/smaller)

多项式大于意味着函数的比值会渐进的落在两个多项式之间。f(n)f(n)多项式意义上大于g(n)g(n),当且仅当存在两个广义的多项式(分数指数也是可以的)p(n),q(n)p(n),q(n)使得如下不等式渐进成立:

p(n)f(n)g(n)<q(n)p(n)≤f(n)g(n)<q(n)

例如对于两个函数n2n2nlgnnlgn, 我们有n2nlgn=nlgnn2nlgn=nlgn,

n13nlgnnn13≤nlgn≤n

则函数n2n2多项式意义上大于nlgnnlgn.

主定理中的细节

除了像上一部分那样有个大致的“大于”,“小于”的直观理解外,我们要理解定义中的具体细节,其实就是多项式大于/小于的应用。

  1. 第一种情况中,我们需要f(n)f(n)多项式意义上小于nlogbanlogb⁡a, 即f(n)f(n)渐进小于nlogbaϵnlogb⁡a−ϵ。 f(n)f(n)必须渐近小于nlogbanlogb⁡a, 同时要相差一个因子nϵ, 其中ϵϵ是大于0的常数。
  2. 第二种情况中,除了多项式意义上的大于以外,而且还要满足“正则”条件af(n/b)cf(n)af(n/b)≤cf(n)

但是主方法中的三种情况并不能覆盖所有此形式的情况。情况1和情况2之间有一定的间隙,即f(n)f(n)渐近小于nlogbanlogb⁡ad但不是多项式意义上的小于。同样的情况2和情况3也有类似的间隙。如果f(n)f(n)满足的条件正好落在间隙中,或者不满足情况3中的“正则”条件,就不能通过主方法来求解了。

例如求解如下递归式的时候:

T(n)=2T(n/2)+nlgnT(n)=2T(n/2)+nlgn

我们按照主方法,a=2,b=2,f(n)=nlgna=2,b=2,f(n)=nlgn

nlogba=nlog22=nnlogb⁡a=nlog2⁡2=n

我们可以看到f(n)=nlgnf(n)=nlgn 渐近大于 nlogba=nnlogb⁡a=n, 但是我们需要的是多项式意义上的大于即

nlgn>nnϵ,ϵ>0nlgn>n⋅nϵ,ϵ>0

但是对于任意ϵ>0ϵ>0都无法满足lgnlgn渐近大于nϵ, 于是它并不是多项式意义上的大于,此递归式无法使用主方法来求解。

使用主方法的例子

对于矩阵乘法的Strassen方法递归式:

T(n)=7T(n/2)+Θ(n2)T(n)=7T(n/2)+Θ(n2)

a=7,b=2,f(n)=Θ(n2)a=7,b=2,f(n)=Θ(n2), 因此nlogba=nlog27nlogb⁡a=nlog2⁡7, 由于2.8<lg7<2.812.8<lg7<2.81, 对于ϵ=0.8ϵ=0.8, 就有f(n)=Θ(n2)f(n)=Θ(n2)多项式意义上大于O(nlg7)O(nlg7), 于是我们便可以得到最终的解为:

T(n)=Θ(nlg7)



原创粉丝点击