數據結構:漢諾塔問題的遞歸求解和分析

遞歸方法求解該類問題,是一種簡單的思維方法,通常比使用迭代方法更簡單。但是,遞歸方法也有劣勢。此處以典型的漢諾塔問題(Tower of Hanoi)為例給予說明。

漢諾塔是根據一個傳說形成的數學問題,最早是由法國數學家愛德華·盧卡斯提出。

有三根桿子 A,B,C 。A 桿上有 N 個 ( N > 1 ) (N>1) (N>1) 穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至 C 桿:

  1. 每次只能移動一個圓盤;
  2. 大盤不能疊在小盤上面。

問:如何移動?最少要移動多少次?

下面鏈接是一個漢諾塔問題的交互操作程序,讀者可以通過操作,嘗試解決此問題。https://www.mathsisfun.com/games/towerofhanoi.html

漢諾塔問題,以及之前遇到過的階乘、斐波那契數列等,都是分治思想的典型應用。

對于漢諾塔問題,解決方法如下,如圖 5.1.1 所示。

在這里插入圖片描述

圖 5.1.1 漢諾塔問題的求解過程

假設 A 柱上最初的盤子總數為 n n n

  • n = 1 n=1 n=1 時,只要將編號為 1 的圓盤從 A 直接移至 C 上即可。
  • 否則,執行如下三步:
    1. 用 C 柱做過渡,將 A 柱上的 ( n ? 1 ) (n-1) (n?1) 個盤子移到 B 柱上;
    2. 將 A 柱上最后一個盤子直接移到 C 柱上;
    3. 用 A 柱做過渡,將 B 柱上的 ( n ? 1 ) (n-1) (n?1) 個盤子移到 C 柱上。

由上述求解過程可知,漢諾塔問題符合分治算法的遞歸求解要求。

【算法步驟】

  1. 如果 n = 1 n=1 n=1 ,則直接將編號為 1 的圓盤從 A 移到 C,遞歸結束。
  2. 否則:
    • 遞歸,將 A 上編號為 1 至 n ? 1 n-1 n?1 的圓盤移到 B,C 做輔助塔;
    • 直接將編號為 n 的圓盤從 A 移到 C;
    • 遞歸,將 B 上編號為 1 至 n ? 1 n-1 n?1 的圓盤移到 C,A 做輔助塔。

【算法描述】

//定義搬動操作函數 move(A, n, C) ,將編號為 n 的圓盤
// 從 A 移到 C。
//用全局變量 m 對搬動次數計數
int m = 0;
void move(char A, int n, char C){cout << ++m <<"," << n << "," << A << "," << C << endl;
}void Hanoi(int n, char A, char B, char C){//將 A 上的 n 個圓盤移到 C 上,B 做輔助塔if (n == 1) move(A, 1, C); //將編號為 1 的圓盤從 A 移到 Celse {Hanoi(n-1, A, C, B); //將 A 上不編號為 1 至 n-1 的圓盤移到 B ,C 做輔助塔move(A, n, C);  //編號為 n 的圓盤從 A 移到 CHanoi(n-1, B, A, C); //將 B 上編號為 1 至 n-1 的圓盤移到 C,A 做輔助塔}
}

【算法分析】

假設圓盤數量為 n n n 時,移動圓盤的時間復雜度為 T ( n ) T(n) T(n) ;圓盤數量為 ( n ? 1 ) (n-1) (n?1) 時時間復雜度 T ( n ? 1 ) T(n-1) T(n?1) 。根據算法,要將 n ? 1 n-1 n?1 個圓盤從 A 移到 B(借助 C),然后將這些圓盤從 B 移到 C(借助 A)。再加上將編號為 n 的圓盤從 A 移到 C 所花費的常數時間(用 c c c 表示)則得到遞推公式:
T ( n ) = 2 T ( n ? 1 ) + c T(n)=2T(n-1)+c T(n)=2T(n?1)+c
根據遞推公式,有:
T ( n ) = 2 T ( n ? 1 ) + c = 2 [ 2 T ( n ? 2 ) + c ] + c = 2 2 T ( n ? 2 ) + [ 2 + 1 ] c = 2 2 [ 2 T ( n ? 3 ) + c ] + [ 2 + 1 ] c = 2 3 T ( n ? 3 ) + [ 2 2 + 2 + 1 ] c ? = 2 n ? 1 T ( 1 ) + [ 2 n ? 2 + ? + 2 0 ] c \begin{split} T(n)&=2T(n-1)+c=2[2T(n-2)+c]+c \\&=2^2T(n-2)+[2+1]c=2^2[2T(n-3)+c]+[2+1]c \\&=2^3T(n-3)+[2^2+2+1]c \\&~\vdots \\&=2^{n-1}T(1)+[2^{n-2}+\cdots+2^0]c \end{split} T(n)?=2T(n?1)+c=2[2T(n?2)+c]+c=22T(n?2)+[2+1]c=22[2T(n?3)+c]+[2+1]c=23T(n?3)+[22+2+1]c??=2n?1T(1)+[2n?2+?+20]c?
顯然 T ( 1 ) = c T(1)=c T(1)=c

上述漢諾塔問題算法的時間復雜度是 O ( 2 n ) O(2^n) O(2n) ,即指數階的時間復雜度。

在第 2 章(因為本文是我編寫的《數據結構》考研復習講義中的節選,所以,讀者在閱讀的時候,如果遇到類似的表述,勿要深究)已經研究過這種指數階時間復雜度,在一般情況下, 無法用于解決實際問題,不是一個有效的算法。

對于漢諾塔問題的時間復雜度分析,也可以通過計算移動盤子的次數得到,借用前面給出的交互演示程序和算法,可知:

圓盤數量 n n n移動圓盤次數
1 1 = 2 1 ? 1 1=2^1-1 1=21?1
2 3 = 2 2 ? 1 3=2^2-1 3=22?1
3 7 = 2 3 ? 1 7=2^3-1 7=23?1
? \vdots ? ? \vdots ?
n 2 n ? 1 2^{n}-1 2n?1

因此時間復雜度為 O ( 2 n ) O(2^n) O(2n)

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

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

相關文章

3.27學習總結 算法題

自己用c語言做的&#xff0c;不盡如意 后面看了題解&#xff0c;用的是c&#xff0c;其中string 變量和字符串拼接感覺比c方便好多&#xff0c;可以用更少的代碼實現更好的效果&#xff0c;打算之后去學習c&#xff0c;用c寫算法。 遞歸&#xff0c;不斷輸入字符&#xff0c;…

vue 圖片放大到全局

背景&#xff1a; 在vue項目中&#xff0c;el-image組件圖片組件用于展示圖片&#xff0c;組件自帶的屬性preview-teleported&#xff0c;設置為true可以控制圖片放大到全局 實現效果&#xff1a; 核心代碼&#xff1a; //圖片地址&#xff1a;BASEUrl /file/ item.file //這…

【商城實戰(75)】數據分析指標體系搭建:從0到1的技術指南

【商城實戰】專欄重磅來襲&#xff01;這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建&#xff0c;運用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用戶、商品、訂單等核心模塊開發&#xff0c;再到性能優化、安全加固、多端適配&#xf…

seatunnel配置mysql2hive

SeaTunnel安裝教程 # 執行流程 # 下載&#xff0c;解壓 # https://mirrors.aliyun.com/apache/seatunnel/2.3.8/?spma2c6h.25603864.0.0.2e2d3f665eBj1E # https://blog.csdn.net/taogumo/article/details/143608532 tar -zxvf apache-seatunnel-2.3.8-bin.tar.gz -C /opt/mo…

SSH項目負載均衡中的Session一致性解決方案?

SSH項目負載均衡中的Session一致性解決方案? 1. 粘性會話&#xff08;Session Sticky&#xff09;?2. Session復制&#xff08;集群同步&#xff09;?3. 集中式Session存儲?4. 客戶端存儲&#xff08;Cookie加密&#xff09;?方案選型建議?注意事項? 1. 粘性會話&#x…

MySQL 表連接(內連接與外連接)

&#x1f3dd;?專欄&#xff1a;Mysql_貓咪-9527的博客-CSDN博客 &#x1f305;主頁&#xff1a;貓咪-9527-CSDN博客 “欲窮千里目&#xff0c;更上一層樓。會當凌絕頂&#xff0c;一覽眾山小。” 目錄 1、表連接的核心概念 1.1 為什么需要表連接&#xff1f; 2、內連接&a…

解鎖Spring Boot異步編程:讓你的應用“飛“起來!

引言&#xff1a;從點餐說起 &#x1f354; 想象你在快餐店點餐&#xff1a; 同步模式&#xff1a;排隊等餐&#xff0c;隊伍越來越長&#xff08;就像卡死的服務器&#xff09;異步模式&#xff1a;拿號后去旁邊坐著等&#xff08;服務員喊號通知你&#xff09; 今天我們就…

做一個有天有地的css及html畫的旋轉陰陽魚

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>天地陰陽</title><style>/* 重置默認樣…

ngx_http_core_main_conf_t

定義在 src\http\ngx_http_core_module.h typedef struct {ngx_array_t servers; /* ngx_http_core_srv_conf_t */ngx_http_phase_engine_t phase_engine;ngx_hash_t headers_in_hash;ngx_hash_t variables_hash;…

計算機二級(C語言)考試高頻考點總匯(二)—— 控制流、函數、數組和指針

目錄 六、控制流 七、函數 八、數組和指針 六、控制流 76. if 語句可以&#xff08;嵌套&#xff09;&#xff0c; if 語句可以嵌套在另一個 if 語句內部&#xff0c;形成&#xff08;嵌套的條件判斷結構&#xff09;&#xff0c;用于處理更復雜的條件判斷邏輯。 77. els…

WebRTC協議全面教程:原理、應用與優化指南

一、WebRTC協議概述 **WebRTC&#xff08;Web Real-Time Communication&#xff09;**是一種開源的實時通信協議&#xff0c;支持瀏覽器和移動應用直接進行音頻、視頻及數據傳輸&#xff0c;無需插件或第三方軟件。其核心特性包括&#xff1a; P2P傳輸&#xff1a;點對點直連…

使用 WSL + Ubuntu + Go + GoLand(VSCode) 開發環境配置指南

1. 安裝和配置 WSL 與 Ubuntu 啟用 WSL 功能(以管理員身份運行 PowerShell): wsl --install 或手動啟用: dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachi…

element-plus中,Tour 漫游式引導組件的使用

目錄 一.Tour 漫游式引導組件的簡單介紹 1.作用 2.基本使用 3.展示效果 二.實戰1&#xff1a;介紹患者病歷表單 1.要求 2.實現步驟 3.展示效果 結語 一.Tour 漫游式引導組件的簡單介紹 1.作用 快速了解一個功能/產品。 2.基本使用 從官網復制如下代碼&#xff1a; &…

39-Ajax工作原理

1. 簡明定義開場 “AJAX(Asynchronous JavaScript and XML)是一種允許網頁在不重新加載整個頁面的情況下&#xff0c;與服務器交換數據并更新部分網頁內容的技術。它通過JavaScript的XMLHttpRequest對象或現代的Fetch API實現異步通信。” 2. 核心工作原理 "AJAX的工作…

Python 爬蟲案例

以下是一些常見的 Python 爬蟲案例&#xff0c;涵蓋了不同的應用場景和技術點&#xff1a; 1. 簡單網頁內容爬取 案例&#xff1a;爬取網頁標題和簡介 import requests from bs4 import BeautifulSoup url "https://www.runoob.com/" response requests.get(url) …

【C++進階】函數:深度解析 C++ 函數的 12 大進化特性

目錄 一、函數基礎 1.1 函數定義與聲明 1.2 函數調用 1.3 引用參數 二、函數重載&#xff1a;同名函數的「多態魔法」&#xff08;C 特有&#xff09; 2.1 基礎實現 2.2 重載決議流程圖 2.3 與 C 語言的本質區別 2.4 實戰陷阱 三、默認參數&#xff1a;接口的「彈性設…

Redis的基礎,經典,高級問題解答篇

目錄 一&#xff0c;基礎 二&#xff0c;經典 緩存雪崩&#xff1a; 1. Redis事務的原子性 2. 與MySQL事務的區別 1. 主從復制原理 2. 哨兵模式故障轉移流程 3. 客戶端感知故障轉移 三&#xff0c;高級 一&#xff0c;基礎 Redis的5種基礎數據類型及使用場景&#xf…

【藍橋杯】好數

好數 問題描述代碼解釋代碼 好數 問題描述 一個整數如果按從低位到高位的順序&#xff0c;奇數位 (個位、百位、萬位 ? ) 上的數字是奇數&#xff0c;偶數位 (十位、千位、十萬位 ? ) 上的數字是偶數&#xff0c;我們就稱之為 “好數”。 給定一個正整數 N&#xff0c;請計算…

利用 Patroni + etcd + HAProxy 搭建高可用 PostgreSQL 集群

在生產環境中&#xff0c;數據庫的高可用性是系統穩定運行的關鍵。本文將詳細講解如何利用 Docker 部署一個由 etcd、Patroni 和 HAProxy 組成的 PostgreSQL 高可用集群&#xff0c;實現自動故障轉移和負載均衡。 架構概述 本架構主要包括三部分&#xff1a; etcd 集群 etcd …

bash 和 pip 是兩種完全不同用途的命令,分別用于[系統終端操作]和[Python 包管理]

bash 和 pip 是兩種完全不同用途的命令&#xff0c;分別用于 系統終端操作 和 Python 包管理。以下是它們的核心區別、用法及常見場景對比&#xff1a; 1. 本質區別 特性bashpip類型Shell 命令解釋器&#xff08;一種腳本語言&#xff09;Python 包管理工具作用執行系統命令、…