理论介绍
分治算法在日常的编程中经常被使用,观其名知:“分而治之”,将一个复杂的问题分为多个相同或者相似的子问题,在将子问题划分为更小的子问题,直至最后的子问题可以简单的直接求解,子问题的解合并即为原问题的解。
经典运用
1.汉诺塔
2.合并排序
3.快速排序
4.棋盘覆盖
5.循环赛日程表
6.二分搜索
7.最接近点对问题等等…
分治算法的基本步骤
分治算法在每一次递归上都有三个步骤
(1)分解:将原问题分解为若干个规模较小且相互独立、与原问题形式相同的子问题
(2)解决:若子问题规模较小且容易解决则直接解决,否则递归地解决各个子问题。
(3)合并:将各个子问题的解合并为原问题的解
实际演示(汉诺塔问题)
要求:(1)将A塔上的所有圆盘移动到C塔。
(2)小圆盘上不能放大圆盘
(3)在三根柱子之间一次只能移动一个圆盘
## 代码实现(Java)
package com.zq.ten_Algorithms;
public class HanoTa {
public static void main(String[] args) {
move(5, 'A', 'B', 'C');
}
static int times=1;
//利用分治算法移动盘子
public static void move(int num,char a,char b,char c) {
if (num==1) {
System.out.println("第"+(times++)+"次"+"由"+a+"移动到"+c);
}else {
//当盘数大于等于2时,总是将所有的盘看做是两个盘:一个是最下面的盘under,另一个为除最下面之外所有的盘top
//1.利用塔C,将top的盘由A移动到B,
move(num-1, a, c, b);
//2.把最下面的盘under由A移动到C
System.out.println("第"+(times++)+"次"+"由"+a+"移动到"+c);
//3.利用塔A,将B塔上所有的盘,由B移动到C
move(num-1, b, a, c);
}
}
}
结果