算法思想
一般的分治算法Divide-and-Conquer的伪码如下:
Divide-and-Conquer(P)
- if |P|≤c then S(P) //问题规模小于c,停止递归
- divide P into P1,P2, … ,Pk
- for i=1 to k do
- yi←Divide-and-Conquer(Pi) //递归求解每个子问题
- return Merge(y1,y2, … ,yk) //把子问题的解进行综合
改进分治算法的途径
- 通过代数变换减少子问题的个数(较难实现)
- 利用预处理减少递归内部的计算量
典型应用
- 快速排序算法
- 选择问题
- 选最大/最小
- 选第二大
- 选第k大
- 选中位数
- n-1次多项式在全体2n次方根上的求值
补充
二分答案的使用要求:
- 答案在一个固定的区间内
- 难以通过搜索来找到符合要求的值, 但给定一个值你可以很快的判断它是不是符合要求
- 可行解对于区间要符合单调性, 因为有序才能二分嘛
- 递归策略(分而治之、减而治之)