目录
1.简介
分而治之(Divide and Conquer),分割问题、各个击破。将一个大问题,分割成许多小问题。如果小问题还是很难,就继续分割成更小的问题,直到问题变得容易解决。
2.算法模式
divide_and_conquer (原问题)
{
/* Divide */
先将原问题分割成许多小问题;
/* Conquer */
递归调用,求得子问题的解;
解答1 = divide_and_conquer (子问题1 );
解答2 = divide_and_conquer (子问题2 );
......
/* Combine */
用小问题的解答,算出原问题的解答;
原问题解答=解答1 +解答2 + ......;
return 原问题解答;
}
// 伪代码
Object divide_and_conquer(Object n) {
if (canSolve(n)) return conquer();
List subs = divide();
List subanses = new ArrayList();
for (Object sub: subs) {
Object subans = divide_and_conquer(sub);
subanses.add(subans);
}
return combine(subanses);
}
List divide(){
return null;
}
Object conquer() {
return null;
}
Object combine(List subanses) {
return null;
}
boolean canSolve(Object n) {
return false;
}
3.样例
3.1 合并排序法( Merge Sort )
Divide 阶段:数组分割成两半。 Conquer 阶段:两个子数组各自递归Merge Sort 。 |