设开始时,问题的规模为
n
,之后被分解为两个子问题,子问题的规模分别n1
和n2
。
令T(n)
表示对规模为n时问题求解的时间,则规模分别为n1
和n2
的子问题的求解时间可表示为T(n1)
和T(n2)
。
一般地,T(n)
和T(n1)
、T(n2)
的关系可表示为:T(n) =T(n1)+T(n2)+f(n)
,其中f(n)
是指除子问题递归求解以外的、其它必要处理所花费的时间。
三种常用的递归式求解方法:
基本思想:
先猜测解的形式,然后用数学归纳法求出解中的常数,并证明解是正确的。
此时,用猜测的解作为归纳假设,在推论证明时作为较小值代入函数,然后证明推论的正确性。
步骤:
例题:
在使用代换法求解递归式时,只需要考虑当n足够大时猜测解的正确性,对于边界条件一般不需要考虑。
化简递归式时,最后T(n)
的形式应该与猜测解的形式完全相同。
另一个例题:
证明:T(n)=T(⌈n/2⌉)+1**的解为 O(lgn).
T(n)≤clg(⌈n/2⌉−a)+1
≤clg((n+1)/2−a)+1
=clg((n+1−2a)/2)+1
=clg(n+1−2a)−clg2+1 (c≥1)
≤clg(n+1−2a) (a≥1)
≤clg(n−a)
例题:
设S(m) = T(2m),得以下形式递归式:S(m)<=2S(m/2)+m
注意:此时右侧余项m不能变为logm,因为对S(m)的代换只是改变了函数的形式,而m本身没有被换元。
反应递归的执行过程。每个节点表示一个单一子问题的代价,子问题对应某次递归调用,根节点代表顶层调用的代价,子节点分别代表各层递归调用的代价。
利用树的性质,获取对递归式解的猜测,然后用代换法或其它方法加以验证。
例题:
T(n)
的演化过程:
扩展直到递归的最底层,得到如下形式的递归树:
完全扩展的递归树,高度为log-4-n(共log-4-n+1层)。
代价计算:
注意:此时获得的
T(n)
的解只是一个猜测,需要通过代换法进行验证。
如果递归式有如下形式,在满足一定的条件下,可以用主方法直接给出渐近界:
T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
其中,a、b是常数,且a≥1,b>1;f(n)是一个渐近正的函数。
求解递推关系式() = 16 (4) + 2
解:a=16,b=4,f(n)=n2
logba=2,f(n)=n2=nlogba
∴T(n)=Θ(n2logn)
注意上述两种情况的比较。