分治法基本思想(汉诺塔问题 Tower of Hanoi)
文章目录
- 前言
- 基本思想
- 适用的问题
- 求解步骤
- 分治法要点
- 时间复杂性分析
- 举例-汉罗塔问题(Tower of Hanoi)
- 问题描述
- 解决步骤
- java代码
前言
分治法来源于孙子兵法谋攻篇中写道——十则围之,五则攻之,倍则战之,敌则能分支。讲述的是敌军对战时用兵的原则,如果有十倍的兵力围殴他,五倍的兵力仅供他,在兵力相当的情况下,应该考虑分而治之,各个击破,其体现出来的思想,称为分治法
基本思想
那么分治法的基本思想是什么呢?将一个难以直接解决的大问题,分割成一些规模较小的相同的问题,以便各个击破,分而治之。 通俗的来说就是大事化小,小事化了。大事不好解决,那么我们就把它分成若干个小事,小到什么程度呢?非常容易解决的时候。
适用的问题
1、该问题可以分解为若干个规模较小的相同问题。
2、该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
3、该问题的规模缩小到一定的程度的时候容易解决。
4、利用该问题分解出的子问题的解可以合并俄日该问题的解。
求解步骤
1、分解: 把原问题分解为若干个规模较小,相互独立,与原问题相同的子问题
2、求解:若子问题规模较小且容易被解决则直接解,否则在继续分解为更小的问题,知道容易解决。
3、合并:将已经求解的各个子问题的解,逐步合并为原问题的解。
分治法要点
1、分几个?子问题规模多大?
2、子问题如何求解?
3、合并原问题的解?
4、分析时间复杂性
最好使子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。
时间复杂性分析
从分支法的代码中可以看出,分治法解决问题P(n)时,边界条件为n-0=1,此时问题的规模足够小,求解P(1)的时间耗费为O(1),在一般的情况下,将规模为n的大问题,分解为k个规模为n/m的子问题进行求解。将P(n)分解以及合并成原问题的时间为f(n)。中间for循环k次,解决每个子问题的时间复杂性为T(n/m),那么解决k个子问题所需要的时间为kT(n/m)
分治法解规模为n的问题最坏时间复杂性函数T(n)满足:
举例-汉罗塔问题(Tower of Hanoi)
问题描述
传说在婆罗门庙里有三座钻石宝塔塔台A,B和C,在A上有n=64个金盘,每一个都比下面的略小一点。那么如何通过柱子b将所有盘子挪到柱子C上?
移动要求:
1、一次只能移动一个金盘。
2、移动过程中大金盘不能放在小金盘上面。
解决步骤
第一步:将(n-1)个盘子从A搬到B(借助C)
第二步:将A宝塔中,最低端的大盘子从A搬到C
第三步将B上的(n-1)盘子,借助A移动到C
边界条件n=1的时候,将这一个盘子直接从A移动到C,一次移动时间记为1,否则的话执行以下三部:
1、用C做过渡,将A上的(n-1)个盘子移动到B上。
2、将A上最后一个盘子直接移动到C上。
3、用A柱做过渡,将B柱上的(n-1)个盘子移到C上。
java代码
package com.Xiang;public class Hanoi {public static void main(String[] args) {hanoiTower(4, 'A', 'B', 'C');}//汉诺塔的移动的方法//使用分治算法public static void hanoiTower(int num, char a, char b, char c) {//如果只有一个盘if(num == 1) {System.out.println("第1个盘从 " + a + "->" + c);} else {//如果我们有 n >= 2 情况,我们总是可以看做是两个盘 1.最下边的一个盘 2. 上面的所有盘//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);}}}
/** 第1个盘从 A->B
第2个盘从 A->C
第1个盘从 B->C
第3个盘从 A->B
第1个盘从 C->A
第2个盘从 C->B
第1个盘从 A->B
第4个盘从 A->C
第1个盘从 B->C
第2个盘从 B->A
第1个盘从 C->A
第3个盘从 B->C
第1个盘从 A->B
第2个盘从 A->C
第1个盘从 B->C*/
分治法基本思想(汉诺塔问题 Tower of Hanoi)相关推荐
- 汉诺塔(the Tower of Hanoi )
问题 初始时,给定3根柱子A,B,C,N个大小不一的圆盘,这些圆盘从小到大排列在其中的一根柱子上,假设为A,现在要通过B,将这N个圆盘全部移动到C柱子上,每次只能移动一个,移动的过程中不许出现大盘子放 ...
- 汉诺塔(Tower of hanoi)
汉诺塔游戏两种模式:传统模式(7关)和解密模式(13关) 最后一关10个盘子(需要移动1023次) 图标: [img]http://dl.iteye.com/upload/attachment/289 ...
- 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)
文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...
- 汉诺塔(Tower of Hanoi)--------递归思路
汉诺塔问题简介: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移到柱子C上,并且每次移动,同一根柱子上都只能是大盘子在下,小盘子在上,请 ...
- 汉诺塔问题(Towers of Hanoi)
汉诺塔问题的思维方式很重要,正向和逆向都很容易绕晕,要从中间开始展开 显而易见,如图所示的情况是移动过程中必须的一步,而问题就可以分解为前半部分:如何将k-1个盘子从A->B及后半部分:如何将k ...
- HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)
在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Towe ...
- 汉诺塔(Hanoi) ——递归思想
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.传说故事可以点这看. 汉诺塔问题是一个经典的数学难题,由 3 根柱子和多个半径不等的圆盘构成,如下图所示: 汉诺 ...
- 入门C语言第二话:函数(上)之锻体篇,带你玩转函数(内有汉诺塔,青蛙跳台阶等经典问题,建议收藏和分享)
文章目录 前言 概念的引入 大纲 一.函数的定义 二.函数的分类 1.库函数 概念引入 库函数的分类 了解五步骤 例1: 1.介绍printf 2.头文件 3.所传参数及其类型 4.返回类型及其返回值 ...
- 汉诺塔细讲(内含邻近,循环。以及作者对汉诺塔,以及分治算法的小感悟,注释)
小伙伴们大家好,今天是我第一次尝试去发文写作,有不好之处请多多包含. 什么是汉诺塔呢? 其实大家已经很熟悉他了(而且这是我的第一个递归题目) 注意:本章统一是将从第一根柱子转移到第三根柱子 汉诺塔(T ...
最新文章
- idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?
- Java小案例——使用双重for循环实现杨辉三角的输出
- C# WinForm 自定义控件,DataGridView背景透明,TabControl背景透明
- 如何将自己的代码放到github上
- Python 中如何解决 asyncio 文件描述符最大数量限制问题
- mysql修改用户密码1133_后台修改mysql用户密码后无法连接
- Golang 在十二赞的深度应用
- 模版 ----- 一维指数型枚举 排列型枚举 组合型枚举
- 接口自动化测试框架搭建(10、运行特定测试case,生成报告发送邮件)--python+HTMLTestRunnerCN+request+unittest+mock+db
- linux内核 精简 编译,精简LINUX内核配置及快速编译的方法收集
- IDC发布中国AI云服务市场报告 百度智能云排名第一
- Mission Planner中级应用(APM或PIX飞控)3——APM飞控安装双GPS测试 APM双GPS
- 金融银行软件测试超大型攻略,最受欢迎的金融银行大揭秘附面试题
- H3C交换机console口Xshell连接
- 中国农业大学计算机专业在陕西录取分数线,2017中国农业大学各省各专业录取分数线(8)...
- 解读加多宝的营销案例分析 1
- python实现12306自助刷票下单
- 如何使用纯 CSS(border-radius 和 clip)属性画出半圆
- 水洼数 DFS 蓝桥杯 java代码
- 关于搭建一个简易搭建网站的大概步骤