數據結構和算法——漢諾塔問題

前言

先講個故事,傳說古代印度有三根黃金柱,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黃金柱上,本宇宙漢諾塔也新修建完畢,宇宙終于再次放起了煙花,大爆炸開始了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899752.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023年3月全國計算機等級考試真題(二級C語言)

😀 第1題 下列敘述中錯誤的是 A. 向量是線性結構 B. 非空線性結構中只有一個結點沒有前件 C. 非空線性結構中只有一個結點沒有后件 D. 只有一個根結點和一個葉子結點的結構必定是線性結構 概念澄清 首先,我們需要明確幾個關鍵概念&#xf…

Kafka簡單的性能調優

Kafka 的性能調優是一個系統性工程,需要從生產者、消費者、Broker 配置以及集群架構等多個層面進行綜合調整。以下是一些關鍵的性能調優策略: 一、生產者性能優化 批量發送 batch.size:控制消息批量的最大字節數,默認值為 16KB。…

微前端 - 以無界為例

一、微前端核心概念 微前端是一種將單體前端應用拆分為多個獨立子應用的架構模式,每個子應用可獨立開發、部署和運行,具備以下特點: 技術棧無關性:允許主應用和子應用使用不同框架(如 React Vue)。獨立部…

企業級日志分析平臺: ELK 集群搭建指南

前言:在當今數字化時代,數據已經成為企業決策的核心驅動力。無論是日志分析、用戶行為追蹤,還是實時監控和異常檢測,高效的數據處理和可視化能力都至關重要。ELK(Elasticsearch、Logstash、Kibana)作為全球…

1.2-WAF\CDN\OSS\反向代理\負載均衡

WAF:就是網站應用防火墻,有硬件類、軟件類、云WAF; 還有網站內置的WAF,內置的WAF就是直接嵌在代碼中的安全防護代碼 硬件類:Imperva、天清WAG 軟件:安全狗、D盾、云鎖 云:阿里云盾、騰訊云WA…

MybatisPlus(SpringBoot版)學習第四講:常用注解

目錄 1.TableName 1.1 問題 1.2 通過TableName解決問題 1.3 通過全局配置解決問題 2.TableId 2.1 問題 2.2 通過TableId解決問題 2.3 TableId的value屬性 2.4 TableId的type屬性 2.5 雪花算法 1.背景 2.數據庫分表 ①垂直分表 ②水平分表 1>主鍵自增 2>取…

第二屆計算機網絡和云計算國際會議(CNCC 2025)

重要信息 官網:www.iccncc.org 時間:2025年4月11-13日 地點:中國南昌 簡介 第二屆計算機網絡和云計算國際會議(CNCC 2025)將于2025年4月11-13日在中國南昌召開。圍繞“計算機網絡”與“云計算”展開研討&#xff…

【大模型基礎_毛玉仁】5.4 定位編輯法:ROME

目錄 5.4 定位編輯法:ROME5.4.1 知識存儲位置1)因果跟蹤實驗2)阻斷實驗 5.4.2 知識存儲機制5.4.3 精準知識編輯1)確定鍵向量2)優化值向量3)插入知識 5.4 定位編輯法:ROME 定位編輯:…

橫掃SQL面試——連續性登錄問題

橫掃SQL面試 📌 連續性登錄問題 在互聯網公司的SQL面試中,連續性問題堪稱“必考之王”。💻🔍 用戶連續登錄7天送優惠券🌟,服務器連續報警3次觸發熔斷??,圖書館連續3天人流破百開啟限流?” …

Spring AI Alibaba 對話記憶使用

一、對話記憶 (ChatMemory)簡介 1、對話記憶介紹 ”大模型的對話記憶”這一概念,根植于人工智能與自然語言處理領域,特別是針對具有深度學習能力的大型語言模型而言,它指的是模型在與用戶進行交互式對話過程中,能夠追蹤、理解并利…

vdi模式是什么

?VDI模式(Virtual Desktop Infrastructure)是一種基于服務器的計算模型,其核心思想是將所有計算和存儲資源集中在服務器上,用戶通過前端設備(如瘦客戶機)訪問服務器上的虛擬桌面?? VDI模式的工作原理 在…

【分布式】深入剖析 Sentinel 限流:原理、實現

在當今分布式系統盛行的時代,流量的劇增給系統穩定性帶來了巨大挑戰。Sentinel 作為一款強大的流量控制組件,在保障系統平穩運行方面發揮著關鍵作用。本文將深入探討 Sentinel 限流的原理、實現方案以及其優缺點,助力開發者更好地運用這一工具…

c#winform,倒鴨子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果

不廢話 直接上效果圖 C# winform 開發抖音的瀑布流字幕。 也是typemonkey插件字幕效果 或者咱再網上常說的倒鴨子字幕效果 主要功能 1,軟件可以自定義添加字幕內容 2,軟件可以添加字幕顯示的時間區間 3,可以自定義字幕顏色,可以隨…

Pycharm(八):字符串切片

一、字符串分片介紹 對操作的對象截取其中一部分的操作,比如想要獲取字符串“888666qq.com前面的qq號的時候就可以用切片。 字符串、列表、元組都支持切片操作。 語法:字符串變量名 [起始:結束:步長] 口訣:切片其實很簡單,只顧頭來…

圖片解釋git的底層工作原理

(圖片來源:自己畫的) 基于同一個commit創建新分支 (圖片來源:書籍《Linux運維之道》 ISBN 9787121461811) 在新分支上修改然后commit一次 (圖片來源:書籍《Linux運維之道》 ISBN 978…

leetcode994.腐爛的橘子

思路源自 【力扣hot100】【LeetCode 994】腐爛的橘子|多源BFS 這里圖中的腐爛的的橘子是同時對周圍進行腐化,所以采用多源bfs就能解決 多源bfs與單源bfs的區別就在于隊列取出時一輪是取出隊列當中的全部元素 class Solution {public int orangesRotti…

【華為OD技術面試真題 - 技術面】- Java面試題(15)

華為OD面試真題精選 專欄:華為OD面試真題精選 目錄: 2024華為OD面試手撕代碼真題目錄以及八股文真題目錄 介紹下TCP/UDP TCP(傳輸控制協議)和 UDP(用戶數據報協議) TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是兩種常見的傳輸層協議,主要…

?在 Fedora 系統下備份遠程 Windows SQL Server 數據庫的完整方案

?一、環境準備與工具安裝? ?1. 安裝 Microsoft SQL Server 命令行工具? Fedora 需安裝 mssql-tools 和 ODBC 驅動: # 添加 Microsoft 倉庫 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo# 安裝工具包 …

DeepSeek:巧用前沿AI技術,開啟智能未來新篇章

引言 近年來,人工智能(AI)技術迅猛發展,大模型成為全球科技競爭的核心賽道。在這場AI革命中,DeepSeek作為中國領先的大模型研發團隊,憑借其創新的技術架構、高效的訓練方法和廣泛的應用場景,迅…

R語言實現軌跡分析--traj和lcmm包體會

R語言實現軌跡分析–traj和lcmm包體會 軌跡分析是對重復測量數據的一種歸納,轉化為一種分類變量,比如手術后1~7天內的疼痛評分,可以形成術后急性痛軌跡。形成的軌跡作為一個分類變量,可以用于預測疾病的預后&#xff…