思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
三个步骤:分解、解决、合并。
分析分治算法:若问题规模足够小,如对某个常量,
,则求解需要常量时间。假设将原问题分解为
个子问题,每个子问题的规模为原问题的
(在许多分治算法中
)。分解时间
,合并时间
。
递归式:
求解递归式三种方法:
一、代入法:猜测一个界,然后用数学归纳法证明这个界是正确的。
二、递归树求解:将递归式转换为一棵树,其结点表示不同层次的递归调用产生的代价。然后采用边界和技术来求解递归式;
三、主定理:可求解形如如下公式的递归式的界:
其中;
一、代入法
1.猜测解的形式;
2.用数学归纳法求出解中的常数,并证明解是正确的。
可以用代入法为递归式建立上界或下界,或
。
二、递归树
在递归树中,每个结点表示一个单一子问题的代价,子问题对应某次递归函数的调用。将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和得到总代价。
递归树最合适用来生成好的猜测,然后用代入法来验证猜测是否正确。
三、主定理
理解:对于三种情况中的每一种都是用与
进行比较。直觉上,两者中的较大者决定了递归式的解。在第一种情况中,不仅仅是
小于
就够了,而是要多项式意义上的小于。即
渐进小于
要相差一个因子
(
)。在第三种情况中,也是多项式意义上的大于,而且满足“正则”条件
。注意:这三种情况并不是覆盖
的所有可能性,比如
虽然大于或小于但不是多项式意义上的大于或小于
(例如:
),以及
不满足正则条件,就不能使用主方法求解递归式。