算法课不定期心得整理——一些递归式的求解心得

做作业遇到了一些有关递归树和主方法的使用,因为没有答案,苦苦思索了两天,幸而得到了灵感,对这两个方法的使用也似乎深入了一些,于是小有成就,想把解题过程记录下来,以供来者一起求索。

{递归树}

T(n)=nT(n)+n

看到 n 可能会想到使用代换,如令 s=n 然后再用 s2=n 来替换 n ,然后将原式化为T(s2)=sT(s)+s2 来求解,但是很难得到一个很紧确的假设。而且替换法需要同时求得紧确上界和下界,比较繁琐。

而递归树则能提供一个很清晰明白的解答,下图是递归式的演化过程。

图1 $T(n) = \sqrt n T(\sqrt n) + n$ 的递归树

从上图可以看出,根节点的代价为 n , 它有 n 个子女,每个子女的代价是 n 或者写成 n1/2 ,每个子女又各有 n 个子女,每个子女的代价是 n 或者写成 n1/4 。在深度 i 时,每个节点的代价为 n1/2i 。当达到叶子节点时,由于每个叶子节点的代价都是 Θ(1) ,所以存在一个常数 d 使 n1/2i=d 时,说明达到了叶子节点,且得到深度为 i=lglogdn 。将每层的代价相加可以得到每层的代价为 n 。最后将每层的代价与树高相乘,得到 T(n)=Θ(nlglogdn)= (nlglgn)

{主方法的理解}

关于主函数的判别,利用高数的理解办法就是 nlogba 是否是 f(n) ϵ 阶无穷大(或者无穷小),就是求

limxnlogbanϵf(n)=limxnlogbaϵf(n)=c
是否成立,以及 ϵ 的取值。

接下来我们就对方法的三种情况进行解释:

CASE 1 : 若对某常数 ϵ>0 ,有 f(n)=O(nlogbaϵ) ,则 T(n)=Θ(nlogba)

这里就可以用求极限的方式证明

limxnlogbaf(n)=limxnϵ

ϵ>0 时,原极限趋向无穷,就是说 nlogba f(n) ϵ 阶无穷大,因此也就可以得到 T(n)=Θ(nlogba)

例如 T(n)=3T(n/2)+nlgn

a=3,b=2 得到 nlogba=nlog23

limxnlog23nlgn=limxnlog231lgn()=limx(log231)nlog2321n=limx(log231)nlog231

这里甚至可以得到 ϵ=log231>0 ,使 f(n)=O(nlogbaϵ) ,因此有 T(n)=Θ(nlog23)

CASE 2 : 若 f(n)=Θ(nlogbaϵ) ,则 T(n)=Θ(nlogbalgn)

这个情况比较简单,只需用求极限的方式证明

limxnlogbaϵf(n)=c

即证明 ϵ=0 ,或者说 nlogba f(n) 是同阶无穷小(无穷大),就可以得到 T(n)=Θ(nlogbalgn)

CASE 3 : 若对某常数 ϵ>0 ,有 f(n)=Ω(nlogba+ϵ) ,且对常数 c<1 与所有足够大的 n ,有af(n/b)cf(n) ,则 T(n)=Θ(f(n))

这里就可以用求极限的方式证明

limxnlogbaf(n)=limxnϵ

ϵ<0 时,且对常数 c<1 与所有足够大的 n ,有af(n/b)cf(n) ,可以得到 T(n)=Θ(f(n))

例如 T(n)=3T(n/4)+nlgn

a=3,b=4 得到 nlogba=nlog43

limxnlog43nlgn=limxnlog431lgn=limx(log431)nlog4321n=limx(log431)nlog431

这里可以得到 ϵ=log431<0 ,但是为了符合定理中 f(n)=O(nlogba+ϵ) 的表述,我们这里还是取 ϵ 的绝对值,即令 ϵ=1log43>0 使 f(n)=O(nlogba+ϵ) 。又因为

af(n/b)=3n4lgn4=3n4lgn3n4lg43n4lgn=cnlgn

其中 c=3/4<1 。因此有 T(n)=Θ(nlgn)

CASE GAP

我们知道主方法的两个情况之间是存在“缝隙(gap)”的,也就是说当极限 limxnlogbaf(n) 不能得到一个常数或者形如 nϵ 的结果时,主方法就不再适用了。

例如 T(n)=2T(n/2)+nlgn

a=2,b=2 得到 nlogba=nlog22=n ,然后有

limxnnlgn=limx1lgn

显然 1lgn 既不是一个常数也不是一个形如 nϵ 的结果,因此也就不满足任何一种情况了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值