做作业遇到了一些有关递归树和主方法的使用,因为没有答案,苦苦思索了两天,幸而得到了灵感,对这两个方法的使用也似乎深入了一些,于是小有成就,想把解题过程记录下来,以供来者一起求索。
{递归树}
T(n)=n√T(n√)+n
看到
n√
可能会想到使用代换,如令
s=n√
然后再用
s2=n
来替换
n
,然后将原式化为
而递归树则能提供一个很清晰明白的解答,下图是递归式的演化过程。
从上图可以看出,根节点的代价为
n
, 它有
{主方法的理解}
关于主函数的判别,利用高数的理解办法就是 nlogba 是否是 f(n) 的 ϵ 阶无穷大(或者无穷小),就是求
接下来我们就对方法的三种情况进行解释:
CASE 1 : 若对某常数 ϵ>0 ,有 f(n)=O(nlogba−ϵ) ,则 T(n)=Θ(nlogba) ;
这里就可以用求极限的方式证明
当 ϵ>0 时,原极限趋向无穷,就是说 nlogba 是 f(n) 的 ϵ 阶无穷大,因此也就可以得到 T(n)=Θ(nlogba) 。
例如 T(n)=3T(n/2)+nlgn
由 a=3,b=2 得到 nlogba=nlog23
这里甚至可以得到 ϵ=log23−1>0 ,使 f(n)=O(nlogba−ϵ) ,因此有 T(n)=Θ(nlog23) 。
CASE 2 : 若 f(n)=Θ(nlogba−ϵ) ,则 T(n)=Θ(nlogbalgn) ;
这个情况比较简单,只需用求极限的方式证明
即证明 ϵ=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))
;
这里就可以用求极限的方式证明
当 ϵ<0 时,且对常数 c<1 与所有足够大的 n ,有
例如 T(n)=3T(n/4)+nlgn
由 a=3,b=4 得到 nlogba=nlog43
这里可以得到
ϵ=log43−1<0
,但是为了符合定理中
f(n)=O(nlogba+ϵ)
的表述,我们这里还是取
ϵ
的绝对值,即令
ϵ=1−log43>0
使
f(n)=O(nlogba+ϵ)
。又因为
其中 c=3/4<1 。因此有 T(n)=Θ(nlgn) 。
CASE GAP
我们知道主方法的两个情况之间是存在“缝隙(gap)”的,也就是说当极限 limx→∞nlogbaf(n) 不能得到一个常数或者形如 nϵ 的结果时,主方法就不再适用了。
例如 T(n)=2T(n/2)+nlgn
由 a=2,b=2 得到 nlogba=nlog22=n ,然后有
显然 1lgn 既不是一个常数也不是一个形如 nϵ 的结果,因此也就不满足任何一种情况了。