【从零学习经典算法系列】分治与递归2——主方法

上一篇介绍了分治思想与求解递归表达式初步,但是像递归树方法和替换法都有自己明显的缺点,那有没有什么更好的方法呢?

这一篇我就主方法(master method)给出介绍和证明,相信之前不了解该方法的同学通过本篇博客的介绍之后,能有一种醍醐灌顶的感觉,能对递归表达式的求解方法有一个形象的认识和理解。

1、主定理

主方法给出求解形如T(n) = aT(n/b) + f(n)的递归表达式的定理性方法,这里常数a>=1,b>1,f(n)是一个渐进趋正的函数(存在n0,当n>n0,有f(n)>0)。

递归式T(n) = aT(n/b) + f(n)描述了将规模为n的问题划分为a个子问题的算法的运行时间,每个子问题规模为n/b,a和b是正整数。a个子问题被分别递归地求解,时间各为T(n/b)。划分原问题和合并答案的代价由函数f(n)描述。

*主定理:设a>=1,b>1为常数,f(n)是一个函数,T(n)由递归式T(n) = aT(n/b) + f(n)对非负整数定义。那么T(n)可能有如下的渐进界,

《【从零学习经典算法系列】分治与递归2——主方法》

2、主定理的形象解释

首先我们将抽象的递归式进行展开,看看效果如何。

《【从零学习经典算法系列】分治与递归2——主方法》

然后给出递归式T(n) = aT(n/b) + f(n)的递归树图形:

《【从零学习经典算法系列】分治与递归2——主方法》

图1 主定理的思想

case 1情况下,递归树的每层成本从根向下呈几何级数增长,成本在叶节点一层达到最高,即最后一次递归是整个过程中成本最高的一次,故其占主导地位。所以递归分治的总成本在渐进趋势上和叶子层的成本一样。

case 2情况下,递归树每层的成本在渐进趋势上一样,即每层都是n^logb(a)。由于有logb(n)层,因此总成本为每层的成本乘以logb(n)。

case 3情况下,递归树每层成本呈几何级数递减,树根一层的成本占主导地位。因此,总成本就是树根层的成本。

3、主定理的证明

case 1由所有叶结点的代价决定

《【从零学习经典算法系列】分治与递归2——主方法》


case 2 树的代价均匀地分布在各层上

《【从零学习经典算法系列】分治与递归2——主方法》

case 3 由根结点的代价决定

《【从零学习经典算法系列】分治与递归2——主方法》

特别说明:f代表的是分治策略中的分解(成子问题)和合并(子问题)的成本。由于f(n)的渐进增长趋势>Θ(n^logb(a)),所以该分治策略的分解和合并成本高于子问题的解决成本。而如果在这种情况要获得解,分解和合并的成本应该逐级下降;否则,分解和合并成本随着分解的推进将呈现发散趋势,这样总成本有可能不会收敛。那么这种分治策略就显得没有意义了。

而如果分解与合并成本逐级下降,则意味着函数f满足af(n/b)<=cf(n),其中c<1。因此,解为T(n)=Θ(f(n))。


小结:

以上我们介绍的主方法只考虑n被b^i整除的情况,至于不能整除的情况需要应用数学技巧来解决下取整函数和上取整函数的处理问题。

下一小节,我将就分治策略的应用举几个典型的实例,进一步理解分治思想。


转载请标明出处,原文地址:http://blog.csdn.net/jasonding1354/article/details/37690027


参考资料:

《算法之道(第2版)》,邹恒明著,机械工业出版社

《算法导论(原书第2版)》,机械工业出版社

麻省理工学院公开课:算法导论

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/jasonding1354/article/details/37690027
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞