如果一个问题当它的规模缩小的时候,问题性质不变,并且问题的规模最小的时候简单可解,就可以采用divide-and-conquer 方法。
divide-and-conquer 分以下4步进行:
攻克: 如果问题足够小,可以直接给出答案
分解: 把问题分解成同样性质的几个子问题
递归:递归调用本算法来解决子问题
合并:把解决好的子问题合在一起,组成原有问题的答案
# 假设问题为p,问题的数据集为A,规模为N
# 解决下标从R到N的所有问题
divide-and-conquer-p(A,R, N)
#攻克:问题足够小
if R to N is small enough
return Answer
#分解:把p分成m个子问题
(N1, N2, ..., Nm) = divide-p(A,R,N)
#递归: 解决m个子问题
Answer_N1 = divide-and-conquer-p(A, R, N1)
Answer_N2 = divide-and-conquer-p(A, N1+1, N2)
...;
Answer_N = divide-and-conquer-p(A, Nm+1, N)
#合并:综合m个子问题的答案,给出整个问题的答案
return combine-p(Answer_N1, Answer_N2,..., Answer_N)
例 1: