IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 从汉诺塔看分治算法、人工递归过程 -> 正文阅读

[数据结构与算法]从汉诺塔看分治算法、人工递归过程

作者:token keyword

分治算法基本介绍

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

分治算法的基本步骤

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

  1. 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
  2. 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题。
  3. 合并:将各个子问题的解合并为原问题的解。

汉诺塔—分治思想

将A全部移动到C,一次只能移动一个, 且大的盘子不能在小的上面。

在这里插入图片描述

  • 想象只有一个盘子就是从A到C
  • 如果两个盘子先A到B、再A到C、再B到C
  • 如果三个盘子先把两个移动到B、再把最大的移动到C、再把B上的两个移动到C

以三个盘子为例:

第一步 : 将A上的俩个盘子借助C移动到B上
在这里插入图片描述
第二步:将A上的一个盘子移动到C
在这里插入图片描述
第三步:将B上的俩个盘子借助A移动到C上

在这里插入图片描述
可以总结出规律

  • 如果是有一个盘, A->C (就一步骤, A 移动到 C)
  • 如果我们有 n >= 2 个盘的情况,我们总是可以看做是两部分盘 【1、最下边的一个盘 ,2、上面的所有盘】
    • 先把最上面的盘 A->B
    • 把最下边的盘 A->C
    • 把B塔的所有盘 从 B->C

分治算法,划分子问题。子问题需要和父问题具有相同的性质。

父问题(A,C)拆分成子问题

伪代码:
在这里插入图片描述

汉诺塔—代码实现

/**
 * @ClassName HanoiTower
 * @author: shouanzh
 * @Description 汉诺塔(分治算法)
 * @date 2022/5/23 20:01
 */
public class HanoiTower {

    public static void main(String[] args) {
        hanoiTower('X', 'Y', 'Z',3);
    }


    /**
     * 汉诺塔(分治算法)
     * @param x   第一根柱子 x
     * @param y   第二根柱子 y
     * @param z   第三根柱子 z
     * @param num 圆盘数量
     * x、y、z 还可以理解为:x挪到z上去,通过y
     */
    public static void hanoiTower(char x, char y, char z, int num) {

        // 如果是有一个盘, X->Z (就一步, X 移动到 Z)
        if (num == 1) {
            move(x, z);
        } else {
            // 如果我们有 num >= 2 情况, 我们总是可以看做是两部分 【1.最下边的一个盘, 2. 上面的所有盘】
            // 1、将n-1个盘子由X经过Z移动到Y
            // 传参: x,y,z 后俩个交换位置 x,z,y  方便记忆
            hanoiTower(x, z, y, num - 1);
            // 2、移动最下边的盘 X->Z
            move(x, z);
            // 3、剩下的n-1盘子由Y经过X移动到Z
            // 传参: x,y,z 前俩个交换位置 y,x,z  方便记忆
            hanoiTower(y, x, z, num - 1);
        }

    }

    /**
     * 移动
     */
    private static void move(char x, char z) {
        System.out.println("move: " + x + "--->" + z);
    }

}

三个盘子的移动步骤

move: X--->Z
move: X--->Y
move: Z--->Y
move: X--->Z
move: Y--->X
move: Y--->Z
move: X--->Z

人工递归过程

在这里插入图片描述
🥳

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:26:10  更:2022-06-01 15:26:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 16:23:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码