分治法基本思想(汉诺塔问题 Tower of Hanoi)

2023-11-08

前言

分治法来源于孙子兵法谋攻篇中写道——十则围之,五则攻之,倍则战之,敌则能分支。讲述的是敌军对战时用兵的原则,如果有十倍的兵力围殴他,五倍的兵力仅供他,在兵力相当的情况下,应该考虑分而治之,各个击破,其体现出来的思想,称为分治法

基本思想

那么分治法的基本思想是什么呢?将一个难以直接解决的大问题,分割成一些规模较小的相同的问题,以便各个击破,分而治之。 通俗的来说就是大事化小,小事化了。大事不好解决,那么我们就把它分成若干个小事,小到什么程度呢?非常容易解决的时候。

适用的问题

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, 移动过程会使用到 c
                    hanoiTower(num - 1, a, c, b);
                    //2. 把最下边的盘 A->C
                    System.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

 */

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分治法基本思想(汉诺塔问题 Tower of Hanoi) 的相关文章

随机推荐

  • idea解决控制台中文乱码问题

    前言 IntelliJ IDEA 如果不进行配置的话 运行程序时控制台中文乱码问题会非常严重 严重影响我们对信息的获取和程序的跟踪 特总结以下 4 点用于解决控制台中文乱码问题 希望有助于大家 注意 下面根据我日常工作的经验总结 排序的先后
  • SpringBoot默认的JSON解析方案

    一 什么是JSON JSON JavaScript Object Notation 是一种基于JavaScript语法子集的开放标准数据交换格式 JSON是基于文本的 轻量级的 通常被认为易于读 写 好了 废话不多说 下面开始介绍如何在Sp
  • Java_.jar .war .ear 详解

    jar 全称 java archive 包含 class properties文件 是文件封装的最小单元 部署文件 application client xml 级别 小 war 全称 web archive 包含 Servlet JSP页
  • Tomcat和Weblogic的区别

    接触到两种Java的web服务器 做项目用的Tomcat 看视频看的是WebLogic Server WLS 都是web服务器 有什么区别和联系呢 一 先简单介绍一下这两种服务器 WebLogic是美国bea公司出品的一个applicati
  • webpack实战,手写loader和plugin

    序言 对于 webpack 来说 loader 和 plugin 可以算是需求程度最为广泛的配置项了 但是呢 单单止步于配置可能还不够 如果我们自己有时候想要 diy 一个需求 但是 webpack 又没有相关的 loader 和 plug
  • 移动端unet人像分割模型--1

    个人对移动端神经网络开发一直饶有兴致 去年腾讯开源了NCNN框架之后 一直都在关注 近期成功利用别人训练好的mtcnn和mobilefacenet模型制作了一个ios版本人脸识别swift版本demo 希望maskrcnn移植到ncnn 在
  • MySQL 数据库崩溃(crash)的常见原因和解决办法

    墨墨导读 本文来自墨天轮用户投稿 详述MySQL 数据库崩溃 crash 的常见原因和解决办法 希望对大家有帮助 数据技术嘉年华 十周年盛大开启 点我立即报名 大会以 自研 智能 新基建 云和数据促创新 生态融合新十年 为主题 相邀数据英雄
  • 使用Git Extensions简单入门Git

    前言 关于这个主题 之前我录了段视频教程 在本地看清晰度还可以 但传到优酷上就很不清晰了 即使是后来重制后还是一样不清晰 所以现在想整理成文字版 当然 大家还可以将我百度云上的视频下载下来观看 连同优酷的相关地址都附在文末了 正文 说到Gi
  • std::vector如何使用

    Vector被认为是一个容器 是因为它可以存放各种类型的对象 正因为这 有时候也被人叫动态数组 能够增加和压缩数据 为了使用vector 必须在头文件中包含如下代码 include
  • File , Folder 与 Directory

    Folder 和 Directory 在电脑上使用的区别 folder 文件夹 directory 目录 directory包含子目录 subdirectory 两着一般情况下可以混用 但是有些稍微的区别 Folder 里要么是子folde
  • JDBC详解

    前期准备 mysql下载安装 mysql下载链接 安装成功验证 cmd 命令行输入命令如下图 登录 远程连接别人的mysql 这里的 h127 0 0 1表示远程连接数据库所在计算机的ip 启动和关闭mysql服务 JDBC的概念和本质 概
  • upload-labs文件上传漏洞(Pass-01~Pass-21)

    目录 pass 1 js前端绕过 pass 2 MiMe绕过 pass 3 黑名单绕过 pass 04 htaccess文件上传 pass 05 pass 06 大小写绕过 pass 07 空格绕过 pass 08 windows特性加点绕
  • 自动化测试 - 如何自动提取手机短信验证码

    在自动化测试中 除了之前博客介绍的各种图形验证码 以及滑块验证外 经常会碰到当遇到有手机短信验证的问题 可能有人会想到 通常验证码有效期都会在一定的时间内 当再次测试时 可以把手机收到的验证码写在代码里 显然这方法好像可行 但却在整个测试中
  • Hadoop:HDFS--分布式文件存储系统

    目录 HDFS的基础架构 VMware虚拟机部署HDFS集群 HDFS集群启停命令 HDFS Shell操作 hadoop 命令体系 创建文件夹 mkdir 查看目录内容 ls 上传文件到hdfs put 查看HDFS文件内容 cat 下载
  • Python使用XPath解析HTML:从入门到精通

    引言 XPath是一种用于选择XML文档中节点的语言 它可以通过路径表达式来定位节点 由于HTML文档的结构与XML文档类似 XPath也可以用于解析HTML文档 Python是一种非常流行的编程语言 它提供了许多库用于解析HTML文档 本
  • VScode常见用法

    1 VScode中通过快捷键ctrl shift p 打开配置文件 2 VScode可以通过shift alt F进行代码格式化 3 自动保存 在设置按钮弹出的菜单中 选择 Settings 选项 此处是整个vscode的设置入口 打开 s
  • 数据结构学习系列之两个单向链表的合并

    两个单向链表的合并 创建两个单向链表p1和p2 合并p1和p2即可 代码如下 示例代码 int merge 2 link list node t p1 node t p2 if NULL p1 NULL p2 NULL p2 printf
  • OpenCV:模型训练与验证

    一 过拟合 欠拟合 1 概念 过拟合是指所选模型的复杂度比真模型更高 学习时选择的模型所包含的参数过多 对已经数据预测得很好 但是对未知数据预测得很差得现象 欠拟合是指所选模型得复杂度比真模型更低 学习时选择的模型所包含的参数过少 2 如何
  • 目标检测中PR曲线和mAP

    目标检测中的PR曲线绘制与mAP 1 基本概念 1 交并比 Intersection Over Union IOU 2 TP FP FN TN 3 查准率 查全率 4 AP mAP 2 PR曲线的绘制与mAP的计算 原文链接 目标检测中的m
  • 分治法基本思想(汉诺塔问题 Tower of Hanoi)

    文章目录 前言 基本思想 适用的问题 求解步骤 分治法要点 时间复杂性分析 举例 汉罗塔问题 Tower of Hanoi 问题描述 解决步骤 java代码 前言 分治法来源于孙子兵法谋攻篇中写道 十则围之 五则攻之 倍则战之 敌则能分支