一边学算法,一边学c语言之分治法(二)
在学会了替换法之后,就可以看到它的局限性,因为它的使用需要经验积累,毕竟我们不能随便猜测一个解去证明,所以呢,还有主方法这种方法来解决一般的问题。
主方法提供了解如下形式的递归方程的一般方法:
其中,
为常数,算法将规模为n的问题划分成了a个子问题,每个所需要的时间为
。函数
表示划分子问题与组合子问题解的开销。例如,对于递归方程
,
每个子问题n/b未必为整数,但用代替它字上的向上取整和向下取整并不影响递归方程的渐进行为。
主方法依赖以下定理。这个定理也称为主定理。
定理:设,
为常数,
为一个函数。
由以下递归方程定义:
其中n为非负整数,则有如下的渐进界限:
(1)若对某些常数,有
,那么
。
(2)若,那么
。
(3)若对某些常数,有
,且对常数
与所有足够大的n,有
,那么
。
例1:
解 由递归方程可得,且
。因此,
,选取
,则
递归方程满足主定理的第一种情形,因此
例2:
解 由递归方程可得,,且
。因此,
,则
递归方程满足主定理的第二种情形,因此
例3:
解 由递归方程可得,,且
。因此,
。选取
,则
递归方程满足主定理的第三种情形。还需要证明,选
,则
成立,因此选择c,满足
,则