一、分治算法的介绍

  1. 分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或 相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题 的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变 换)……

  2. 分治算法可以求解的一些经典问题
     二分搜索
     大整数乘法
     棋盘覆盖
     合并排序
     快速排序
     线性时间选择
     最接近点对问题
     循环赛日程表
     汉诺塔

二、分治算法的基本步骤

分治算法在每一层递归上都有三个步骤

  1. 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题

  2. 解决:若子问题规模较小而且容易被解决就直接解决,否则就递归的解决每个子问题

  3. 合并:将各个子问题的解合并为原问题的解

三、分治算法的设计模式

三、分治算法的最佳实践–汉诺塔

1 汉诺塔的传说

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金 刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小 顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

假如每秒钟一次,共需多长时间呢?移完这些金片需要 5845.54 亿年以上,太阳系的预期寿命据说也就是数百 亿年。真的过了 5845.54 亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

2 汉诺塔游戏的思路分析

如果是一个盘,则应该是A=>C

如果是大于等于两个盘子,我们总是可以看做是两个盘子:最下面的盘子和上面所有的盘子

先把最上面的盘子从A=>C

然后将最下面的盘子从A=>C

把B塔的所有盘子从B=>C

四、代码实现

package cn.zzw.algorithm.Hanoitower;public class hanoiTower {public static void main(String[] args) {hanoiTower(2,'A','B','C');}//使用分治算法解决汉诺塔的移动/**** @param num 表示有几个盘子* @param a 表示塔1* @param b 表示塔2(中间的柱子一般表示需要借助的那个塔)* @param c 表示塔3*/public static void hanoiTower(int num,char a,char b,char c){//如果只有一个盘子if (num==1){System.out.println("第1个盘子从"+a+"=>"+c);}else{//如果是大于两个盘子,我们总是看做是两个盘:最下边的一个盘和上面所有盘//1.把最上面所有的盘子从A=>B,移动过程中需要用到ChanoiTower(num-1,a,c,b);//2.把最下面的盘子从A=>CSystem.out.println("第"+num+"个盘子从"+a+"=>"+c);//3.把B塔的所有盘子从B=>C,移动过程中需要用到a塔hanoiTower(num-1,b,a,c);}}
}

五、测试结果

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54102:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.Hanoitower.hanoiTower
第1个盘子从A=>C
第2个盘子从A=>B
第1个盘子从C=>B
第3个盘子从A=>C
第1个盘子从B=>A
第2个盘子从B=>C
第1个盘子从A=>C
第4个盘子从A=>B
第1个盘子从C=>B
第2个盘子从C=>A
第1个盘子从B=>A
第3个盘子从C=>B
第1个盘子从A=>C
第2个盘子从A=>B
第1个盘子从C=>B
第5个盘子从A=>C
第1个盘子从B=>A
第2个盘子从B=>C
第1个盘子从A=>C
第3个盘子从B=>A
第1个盘子从C=>B
第2个盘子从C=>A
第1个盘子从B=>A
第4个盘子从B=>C
第1个盘子从A=>C
第2个盘子从A=>B
第1个盘子从C=>B
第3个盘子从A=>C
第1个盘子从B=>A
第2个盘子从B=>C
第1个盘子从A=>CProcess finished with exit code 0

三十三、分治算法---汉诺塔问题相关推荐

  1. 分治算法——汉诺塔(HanoiTower)

    分治算法--汉诺塔 介绍 分治算法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题···直到最后子 ...

  2. 分治算法(汉诺塔游戏)

    分治算法 分治算法就是将原问题分解成n个规模较小,并且结构与原问题相似的子问题,再去递归地解决这些子问题,然后这些子问题,然后再合并其结果,就可以得到原问题的解. 分治算法的递归实现,每一层递归都会涉 ...

  3. 分治算法---汉诺塔

    思路分析 代码实现 package com.atguigu.dac;public class Hanoitower {public static void main(String[] args) {h ...

  4. 二分查找、分治算法——汉诺塔问题

    一.二分查找算法(非递归) 1)二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后在进行查找 2)二分查找算法的运行时间为对数时间,即查找到需要的目标位置最多只需要log以2为 ...

  5. hanoi java_java算法汉诺塔(hanoi)

    [实例简介]java算法汉诺塔(hanoi) [核心代码] public class Hanoi { /** * Hanoi塔问题 */ public static void main(String[ ...

  6. 算法 汉诺塔-java详解

    第一次看到这个算法时,很懵逼,是在栈那里.想了半天没想到半点跟栈有关系的解法.最后看了答案,是用的递归.但是看了答案还是很懵逼,下面就是博主自己对汉诺塔的一些了解. 有三根木桩,第一根上有n个盘子,最 ...

  7. 数据结构与算法 汉诺塔问题和列车车厢重排问题

    1. 汉诺塔问题: (a)通过递归的方式解决:https://blog.csdn.net/zj1131190425/article/details/85156570 // 汉诺塔问题: 递归解决方案 ...

  8. NYIST汉诺塔(一)(三)问题以及汉诺塔的路径实现

    首先,什么是汉诺塔?如题,简单的介绍一下:在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地 ...

  9. 玩游戏写算法——汉诺塔

    玩了个汉诺塔的flash游戏,总结下算法 四五层就不说了,太长,4层要15步,每步一截屏就刷死了,其实要想归纳出规律,最好还是玩四五层看看,多了才出规律. 上小下大,一个压一个,想把最底下的第 n 个 ...

最新文章

  1. CAN总线基础(二)——CAN总线物理层介绍(总线电压详解)
  2. Web服务器常用端口
  3. linux格式化ext4分区工具,linux学习笔记-磁盘分区、格式化与挂载
  4. 一文讲清,MySQL中的二级索引
  5. 外媒推荐:科技创业者必看的十部经典电影
  6. TensorFlow 基本使用
  7. ROS入门笔记(十二):动作编程 (C++)
  8. while 常见程序逻辑
  9. Android源代码编译——编译
  10. 图形数字化工具 - getData
  11. java applet的方法_Java Applet的常用方法
  12. sudo chmod 755 ....指令分析
  13. 使用for循环编写反方向正直角三角形
  14. 荣耀v40pro和华为nova8pro哪个好?
  15. 训练日记2019.11.13 冬至日
  16. 2017第三届美亚杯全国电子数据取证大赛个人赛wp
  17. 单片机流星灯_51单片机流星灯c语言源程序
  18. objective-c常见类型%z
  19. 卷积神经网络系列之softmax loss对输入的求导推导
  20. MySQL中如何为查询的数据添加自增序号、顺序呢

热门文章

  1. VMware9.0安装Ubuntu出现Software virtualization is incompatible 问题的解决
  2. java中源代码的类_java中源代码功能了解
  3. 电压放大倍数公式运放_【专题2:电子工程师 之 硬件】 之 【43.运算放大器详解e 运算放大器虚短和虚断】...
  4. 干货 | 第六期课程回顾遗传病基因检测和解读
  5. 在线作图|如何绘制一个好看的堆叠柱状图
  6. R语言与数据分析(12)向量
  7. 76项!海南省崖州湾种子实验室揭榜挂帅项目立项结果公示
  8. Microbiome:宏基因组揭示冻土带、温带草原和热带土壤抗性的特征
  9. 2019微生物组—宏基因组分析技术研讨会第六期
  10. oracle增量 mysql_是否有任何mysql / Oracle函数给予增量号。基于另一列相似值的一列?...