当前位置: 首页 > article >正文

数据结构和算法——汉诺塔问题

前言

先讲个故事,传说古代印度有三根黄金柱,64个石盘,需要将石盘从第一根移动到第三根上,规定每次只能移动一片,并且小盘在放置时必须在大盘上。
当石盘移动完毕时,世界就会毁灭。

汉诺塔——递归

接下来我们用程序来模拟这个移动过程,并计算世界毁灭需要的时间。

这里使用的策略就是递归
我们将黄金柱编号为A,B,C,我们首先需要将A柱最底层的64号大石盘移动到C柱上,那么我们可以认为有一个大力士,将63号以及之前的石盘已经被放在了B柱上。B柱是辅助柱。这时,我们就可以轻松将A柱剩下的一个最大的64号石盘放到C柱上,此时我们完成了第一步。

同理,假设64号石盘已经被放在了C柱上,63号石盘此刻也需要被放在C柱上,我们也能认为,有一个大力士将62号以及之前的石盘已经被放在了B柱上。以此类推。
我们不用管大力士是如何做到的,我们每次只需要将最后一块相对最大的石盘放到C柱上就行了。这就是每一次移动石盘最终的目的。
所以,每次在C柱上能够正常进行叠放的最后一步都是,一个单独的石盘等着被放在C柱上,我们轻松的将64号,63号,62号…1号放到C柱上
而实际上,大力士是我们递归的自己,这个又该怎么理解呢?
用python写就是这样

def hanoiTower(n,source,auxiliary,target):# 如果就剩下最后一块,那么直接叠放到目标柱上,需要注意的是,目标柱并不是不变的,会变成辅助柱,因为搬运过程中,进入子递归,会把辅助柱当做目标柱,大力士需要先把63块之前的所有石盘放到辅助柱上# 每次迭代,都将最后一块设定为终极目标,搬完最后一块就表明最后一个小任务完成了if n==1:print(f"{n}号石盘搬运:{source}-->{target}")else:#大力士将n-1块石盘从源头柱放到辅助柱,这样最底层的石盘就暴露了出来# 将n-1个盘子从源柱移动到辅助柱(此时辅助柱成为子问题的目标柱)hanoiTower(n-1, source, target, auxiliary)print(f"{n}号石盘搬运:{source}-->{target}")# 大力士将n-1块石盘从辅助柱放到目标柱,就算之前的任务完成了# 将n-1个盘子从辅助柱移动到目标柱(此时源柱成为子问题的辅助柱)hanoiTower(n-1, auxiliary,source, target )
hanoiTower(3,"A","B","C")
1号石盘搬运:A-->C
2号石盘搬运:A-->B
1号石盘搬运:C-->B
3号石盘搬运:A-->C
1号石盘搬运:B-->A
2号石盘搬运:B-->C
1号石盘搬运:A-->C

计算时间复杂度,空间复杂度,距离世界毁灭剩余的时间

每次任务分解,都是两次移动n-1个盘子和一次移动单个盘子
因此T=2T(n-1)+1
根据实际情况可以将其展开,递归到第二次时T=2
(2T(n-2)+1)+1
递归第三次时T=2
(2*(2*T(n-3)+1))+1
一次类推展开,可以知道n=1时,就是递归结束的时候,此时T(1)=1
T=2^n-1
时间复杂度为O(2^n)

空间复杂度:
处理n个盘子时,递归调用链为n,n-1,n-2,n-3…1,最大深度所以为n,空间复杂度为O(n)

那么根据传说,算出来2^64时间长度为11698.8483亿年,这个时间说是宇宙末日,确实有可信度。
毕竟1万亿年以后的超人僧侣,1s就能抬起巨石将圆盘准确无误的放到C黄金柱上,本宇宙汉诺塔也新修建完毕,宇宙终于再次放起了烟花,大爆炸开始了。

相关文章:

数据结构和算法——汉诺塔问题

前言 先讲个故事,传说古代印度有三根黄金柱,64个石盘,需要将石盘从第一根移动到第三根上,规定每次只能移动一片,并且小盘在放置时必须在大盘上。 当石盘移动完毕时,世界就会毁灭。 汉诺塔——递归 接下来…...

【区块链安全 | 第二十四篇】单位和全局可用变量(二)

文章目录 单位和全局可用变量(Units and Globally Available Variables)特殊变量和函数1. 区块和交易属性2. ABI 编码和解码函数3. bytes 成员函数4. string 成员函数5. 错误处理6. 数学和加密函数7. 地址类型成员函数8. 与合约相关9. 类型信息 单位和全…...

C语言:指针数组、函数、二级指针

1.指针数组 指针数组是一个数组,数组中的每个元素都是指针。这些指针可以指向各种类型的数据,如整数、字符、结构体等,甚至可以指向其他数组或函数。 指针数组的声明格式通常为: 数据类型 *数组名[数组大小];其中,数…...

批量修改记事本文本文件编码,可以解决文本文件乱码问题

对于文本文件来说,通常都可以设置不同的编码格式,每一种不同的编码格式支持的字符都可能是不一样的。因此当编码格式出现错误的时候,文本文件可能会出现乱码的问题。如何将文本文件的编码由一种格式变为另外一种格式呢?如果文件出…...

亚马逊云科技提供完全托管的DeepSeek-R1模型

近日,亚马逊云科技宣布在Amazon Bedrock上线完全托管的DeepSeek-R1模型。DeepSeek是首个登陆Amazon Bedrock的国产大模型,自今年1月底推出以来,已有数千客户使用Amazon Bedrock的自定义模型导入功能部署了DeepSeek-R1模型。 DeepSeek在过去几…...

Kafka简要介绍与快速入门示例

1、什么是Kafka? Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 Kafka是一个分布式消息队列。Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer&…...

线程池自顶向下

在一些场景下,线程会被频繁创建和销毁,但他们却始终在完成相似的任务 这个场景下我们回去引入一个线程池的概念 可以简单总结为: 任务提交 → 核心线程执行 → 任务队列缓存 → 非核心线程执行 → 拒绝策略处理。 话不多说先看一个简单的…...

利用 Chrome devTools Source Override 实现JS逆向破解案例

之前讲解 Chrome 一大强势技术 override 时,给的案例貌似没有给大家留下多深的印象 浏览器本地替换(local overrides)快速定位前端样式问题的案例详解(也是hook js的手段)_浏览器的 overrides 替换功能-CSDN博客 其实…...

Springboot 中使用 List<Integer> 与 JSONArray 处理 JSON 数组的性能与实践

深入对比&#xff1a;Springboot 中使用 List 与 JSONArray 处理 JSON 数组的性能与实践 引言 在现代 Web 开发中&#xff0c;处理 JSON 格式的数据是常见需求。当面对 POST 请求中的 JSON 数组时&#xff0c;开发者常需在 List<Integer> 和 JSONArray 两种方案间抉择。…...

容器C++ ——STL常用容器

string容器 string构造函数 #include<iostream> using namespace std; #include<string.h> void test01() {string s1;//默认构造const char* str "hello world";string s2(str);//传入char*cout << "s2" << s2 << endl;s…...

npu踩坑记录

之前使用qwen系列模型在ascend 910a卡进行了一些生成任务, 贴出踩坑过程也许对遇到类似问题的同学有帮助: ) 目录 千问 qwq32环境配置 代码部署 生成内容清洗 已生成内容清洗 生成过程优化 Failed to initialize the HCCP process问题 assistant 的历史回答丢失 推理执…...

Linux信号——信号的产生(1)

注&#xff1a;信号vs信号量&#xff1a;两者没有任何关系&#xff01; 信号是什么&#xff1f; Linux系统提供的&#xff0c;让用户&#xff08;进程&#xff09;给其他进程发送异步信息的一种方式。 进程看待信号的方式&#xff1a; 1.信号在没有发生的时候&#xff0c;进…...

【机器学习】——机器学习思考总结

摘要 这篇文章深入探讨了机器学习中的数据相关问题&#xff0c;重点分析了神经网络&#xff08;DNN&#xff09;的学习机制&#xff0c;包括层级特征提取、非线性激活函数、反向传播和梯度下降等关键机制。同时&#xff0c;文章还讨论了数据集大小的标准、机器学习训练数据量的…...

html处理Base文件流

处理步骤 从服务返回的字符串中提取文件流数据&#xff0c;可能是Base64或二进制。将数据转换为Blob对象。创建对象URL。创建<a>元素&#xff0c;设置href和download属性。触发点击事件以下载文件。删除缓存数据 代码 // 假设这是从服务返回的Base64字符串&#xff08…...

力扣每日一题:2712——使所有字符相等的最小成本

使所有字符相等的最小成本 题目示例示例1示例2 题解这些话乍一看可能看不懂&#xff0c;但是多读两遍就明白了。很神奇的解法&#xff0c;像魔术一样。 题目 给你一个下标从 0 开始、长度为 n 的二进制字符串 s &#xff0c;你可以对其执行两种操作&#xff1a; 选中一个下标…...

在MFC中使用Qt(六):深入了解QMfcApp

前言 此前系列文章回顾&#xff1a; 在MFC中使用Qt&#xff08;一&#xff09;&#xff1a;玩腻了MFC&#xff0c;试试在MFC中使用Qt&#xff01;&#xff08;手动配置编译Qt&#xff09; 在MFC中使用Qt&#xff08;二&#xff09;&#xff1a;实现Qt文件的自动编译流程 在M…...

JMeter进行分布式压测

从机&#xff1a; 1、确认防火墙是否关闭&#xff1b; 2、打开网络设置&#xff0c;关闭多余端口&#xff1b;&#xff08;避免远程访问不到&#xff09; 3、打开JMeter/bin 目录底下的jmeter.properties&#xff1b; remove_hosts设置当前访问地址&#xff0c;192.XXXXX&…...

Python实现音频数字水印方法

数字水印技术可以将隐藏信息嵌入到音频文件中而不明显影响音频质量。下面我将介绍几种在Python中实现音频数字水印的方法。 方法一&#xff1a;LSB (最低有效位) 水印 import numpy as np from scipy.io import wavfile def embed_watermark_lsb(audio_path, watermark, ou…...

快速入手-基于Django-rest-framework的第三方认证插件(SimpleJWT)权限认证扩展返回用户等其他信息(十一)

1、修改serializer.py&#xff0c;增加自定义类 # 自定义用户登录token等返回信息 class MyTokenObtainPair(TokenObtainPairView): def post(self, request, *args, **kwargs): serializer self.get_serializer(datarequest.data) try: serializer.is_valid(raise_exceptio…...

关于IP免实名的那些事

IP技术已成为个人与企业保护隐私、提升网络效率的重要工具。其核心原理是通过中介服务器转发用户请求&#xff0c;隐藏真实IP地址&#xff0c;从而实现匿名访问、突破地域限制等目标。而“免实名”代理IP的出现&#xff0c;进一步简化了使用流程&#xff0c;用户无需提交身份信…...

【SQL性能优化】预编译SQL:从注入防御到性能飞跃

&#x1f525; 开篇&#xff1a;直面SQL的"阿喀琉斯之踵" 假设你正在开发电商系统&#x1f6d2;&#xff0c;当用户搜索商品时&#xff1a; -- 普通SQL拼接&#xff08;危险&#xff01;&#xff09; String sql "SELECT * FROM products WHERE name "…...

Spring容器从启动到关闭的注解使用顺序及说明

Spring容器从启动到关闭的注解使用顺序及说明 1. 容器启动阶段 注解&#xff1a;Configuration、ComponentScan 作用&#xff1a; Configuration&#xff1a;标记配置类&#xff0c;声明Spring应用上下文的配置源。ComponentScan&#xff1a;扫描指定包下的组件&#xff08;B…...

UVM概念面试题100问

1-10:UVM概述 Q1: 什么是UVM? A1: UVM是Universal Verification Methodology的缩写,它是由Accellera标准化的一种用于IC验证的方法学。它提供了一个基类库(BCL),包含通用工具如组件层次结构、事务级模型(TLM)和配置数据库等,使用户能够创建结构化、可重用的验证环境。 Q2:…...

SQL Server从安装到入门一文掌握应用能力。

本篇文章主要讲解,SQL Server的安装教程及入门使用的基础知识,通过本篇文章你可以快速掌握SQL Server的建库、建表、增加、查询、删除、修改等基本数据库操作能力。 作者:任聪聪 日期:2025年3月31日 一、SQL Server 介绍: SQL Server 是微软旗下的一款主流且优质的数据库…...

力扣HOT100之矩阵:54. 螺旋矩阵

这道题之前在代码随想录里刷过类似的&#xff0c;还有印象&#xff0c;我就按照当初代码随想录的思路做了一下&#xff0c;结果怎么都做不对&#xff0c;因为按照代码随想录的边界条件设置&#xff0c;当行数和列数都为奇数时&#xff0c;最后一个元素无法被添加到数组中&#…...

5.1 WPF路由事件以及文本样式

一、路由事件 WPF中存在一种路由事件&#xff08;routed event&#xff09;&#xff0c;该事件将发送到包含该控件所在层次的所有控件&#xff0c;如果不希望继续向更高的方向传递&#xff0c;只要设置e.Handled true即可。 这种从本控件-->父控件->父的父控件的事件&am…...

Python数据可视化-第1章-数据可视化与matplotlib

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第1章 数据可视化与matplotlib 本文主要介绍了什么是数据集可视化&#xff0c;数据可视化的目的&#xff0c;常见的数据可视化方式…...

Flutter敏感词过滤实战:基于AC自动机的高效解决方案

Flutter敏感词过滤实战&#xff1a;基于AC自动机的高效解决方案 在社交、直播、论坛等UGC场景中&#xff0c;敏感词过滤是保障平台安全的关键防线。本文将深入解析基于AC自动机的Flutter敏感词过滤实现方案&#xff0c;通过原理剖析实战代码性能对比&#xff0c;带你打造毫秒级…...

20250331-vue-组件事件1触发与监听事件

触发与监听事件 1 在组件的模板表达式中&#xff0c;可以直接使用 $emit 方法触发自定义事件(例如&#xff1a;在 v-on 的处理函数中)&#xff1a; 子组件代码 <template><button click"$emit(someEvent)">点击</button> </template><…...

Odoo/OpenERP 和 psql 命令行的快速参考总结

Odoo/OpenERP 和 psql 命令行的快速参考总结 psql 命令行选项 选项意义-a从脚本中响应所有输入-A取消表数据输出的对齐模式-c <查询>仅运行一个简单的查询&#xff0c;然后退出-d <数据库名>指定连接的数据库名&#xff08;默认为当前登录用户名&#xff09;-e回显…...