文章目录

  • 前言
  • 基本思想
  • 适用的问题
  • 求解步骤
  • 分治法要点
  • 时间复杂性分析
  • 举例-汉罗塔问题(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)相关推荐

  1. 汉诺塔(the Tower of Hanoi )

    问题 初始时,给定3根柱子A,B,C,N个大小不一的圆盘,这些圆盘从小到大排列在其中的一根柱子上,假设为A,现在要通过B,将这N个圆盘全部移动到C柱子上,每次只能移动一个,移动的过程中不许出现大盘子放 ...

  2. 汉诺塔(Tower of hanoi)

    汉诺塔游戏两种模式:传统模式(7关)和解密模式(13关) 最后一关10个盘子(需要移动1023次) 图标: [img]http://dl.iteye.com/upload/attachment/289 ...

  3. 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)

    文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...

  4. 汉诺塔(Tower of Hanoi)--------递归思路

    汉诺塔问题简介: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移到柱子C上,并且每次移动,同一根柱子上都只能是大盘子在下,小盘子在上,请 ...

  5. 汉诺塔问题(Towers of Hanoi)

    汉诺塔问题的思维方式很重要,正向和逆向都很容易绕晕,要从中间开始展开 显而易见,如图所示的情况是移动过程中必须的一步,而问题就可以分解为前半部分:如何将k-1个盘子从A->B及后半部分:如何将k ...

  6. HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)

    在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Towe ...

  7. 汉诺塔(Hanoi) ——递归思想

     汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.传说故事可以点这看. 汉诺塔问题是一个经典的数学难题,由 3 根柱子和多个半径不等的圆盘构成,如下图所示: 汉诺 ...

  8. 入门C语言第二话:函数(上)之锻体篇,带你玩转函数(内有汉诺塔,青蛙跳台阶等经典问题,建议收藏和分享)

    文章目录 前言 概念的引入 大纲 一.函数的定义 二.函数的分类 1.库函数 概念引入 库函数的分类 了解五步骤 例1: 1.介绍printf 2.头文件 3.所传参数及其类型 4.返回类型及其返回值 ...

  9. 汉诺塔细讲(内含邻近,循环。以及作者对汉诺塔,以及分治算法的小感悟,注释)

    小伙伴们大家好,今天是我第一次尝试去发文写作,有不好之处请多多包含. 什么是汉诺塔呢? 其实大家已经很熟悉他了(而且这是我的第一个递归题目) 注意:本章统一是将从第一根柱子转移到第三根柱子 汉诺塔(T ...

最新文章

  1. idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?
  2. Java小案例——使用双重for循环实现杨辉三角的输出
  3. C# WinForm 自定义控件,DataGridView背景透明,TabControl背景透明
  4. 如何将自己的代码放到github上
  5. Python 中如何解决 asyncio 文件描述符最大数量限制问题
  6. mysql修改用户密码1133_后台修改mysql用户密码后无法连接
  7. Golang 在十二赞的深度应用
  8. 模版 ----- 一维指数型枚举 排列型枚举 组合型枚举
  9. 接口自动化测试框架搭建(10、运行特定测试case,生成报告发送邮件)--python+HTMLTestRunnerCN+request+unittest+mock+db
  10. linux内核 精简 编译,精简LINUX内核配置及快速编译的方法收集
  11. IDC发布中国AI云服务市场报告 百度智能云排名第一
  12. Mission Planner中级应用(APM或PIX飞控)3——APM飞控安装双GPS测试 APM双GPS
  13. 金融银行软件测试超大型攻略,最受欢迎的金融银行大揭秘附面试题
  14. H3C交换机console口Xshell连接
  15. 中国农业大学计算机专业在陕西录取分数线,2017中国农业大学各省各专业录取分数线(8)...
  16. 解读加多宝的营销案例分析 1
  17. python实现12306自助刷票下单
  18. 如何使用纯 CSS(border-radius 和 clip)属性画出半圆
  19. 水洼数 DFS 蓝桥杯 java代码
  20. 关于搭建一个简易搭建网站的大概步骤

热门文章

  1. Flutter中实现视图、功能和样式代码的分离(使用mixin与扩展函数)
  2. 区块链 - 侠客岛:终于有人把区块链讲清楚了
  3. android微信自动化脚本,聊聊微信自动化的几种方案
  4. 解决Windows 10 空闲时CPU占用高,笔记本空闲时风扇声音大
  5. 【JavaScript设计模式】观察者模式
  6. matlab 滤波器群延时,Matlab群时延问题
  7. 基于最大相关最小冗余的特征选择方法MRMR
  8. 对于纪争光纪老师讲课的感想
  9. 《Head First Java》读后笔记
  10. 飞信通知api_网络通知API