package basic;
public class DivideConquer
{
/*
* 分治算法就是分而治之,就是把一个复杂的问题分成很多的相同或者相似的子问题,
* 然后再将子问题分解成更小的子问题...一直到最后的子问题可以简单地直接解决
* 原问题地解就是子问题的解的合并
*
* 分治算法的应用:
* 最经典的汉诺塔问题,归并排序,快速排序,傅里叶变换,循环赛日程表,最接近点问题
* 线性时间选择,棋盘覆盖,大整数乘法,二分搜索等等
*
* 分治算法有三步:
* 1.分解:将母问题分解成若干个规模小,互相独立,和母问题相似的子问题
* 2.求解:将母问题分解成可以简单求解的子问题后求解
* 3.合并:将子问题的求解进行合并得到答案
*
* 下面以汉诺塔为例,先聊一下汉诺塔传说:
* 汉诺塔问题源于印度一个古老传说的益智的玩具,大梵天创造了世界的时候做了三根金刚石柱子,
* 在第一根柱子上从下往上按照大小的顺序擂着64片黄金圆盘.大梵天命令婆罗门把圆盘按照大小
* 顺序重新移动摆放到另外一根柱子上,并且在小圆盘上面不能放大圆盘,
* 三根柱子之间一次只能移动一个盘
* 思路:
* 三根柱子分别是A,B,C
* 虽然要移动64个盘,但是我们可以简化,
* 一个盘:直接从A到C
* 两个盘:上面的先到B,然后下面的A到C,然后B到C
* 三个盘:上面的两个先到B,然后最下面那个A到C,然后B的两个到C
*/
public static void Hannotower(int count,char a,char b,char c)
{
if(count==1)
{
System.out.println("第"+count+"个盘从"+a+"-->"+c);
}
else
{
Hannotower(count-1, a, c, b);
System.out.println("第"+count+"个盘从"+a+"-->"+c);
Hannotower(count-1, b, a, c);
}
}
public static void main(String[] args)
{
Hannotower(20, 'a', 'b', 'c');
}
}
程序员必须会的基本算法3-分治算法(以经典的汉诺塔问题为例)
猜你喜欢
转载自blog.csdn.net/qq_43416157/article/details/104444016
今日推荐
周排行