多柱汉诺塔的Frame-Stewart算法

本文深入探讨了汉诺塔问题的解决策略,包括三柱、四柱及多柱汉诺塔的递归求解方法。详细分析了移动盘子的最小次数,并介绍了Frame-Stewart算法在多柱汉诺塔问题中的应用。

通过分析三柱汉诺塔的递归求解过程,我们能够线性递推出移动nnn个盘子的最小移动次数

设三柱汉诺塔,移动nnn个盘子的最小移动次数为T(3,n)T(3, n)T(3,n)
T(3,n)={1n=12f(3,n−1)+1n>1 T(3,n)=\left\{ \begin{aligned} & 1 & n=1 \\ & 2f(3,n-1) +1 & n > 1 \\ \end{aligned} \right. T(3,n)={12f(3,n1)+1n=1n>1
由此可得T(3,n)=2n−1T(3,n) = 2^n - 1T(3,n)=2n1


然而对于多柱汉诺塔问题,我们并没有一个非常直观的策略来移动圆盘。

首先考虑四柱汉诺塔的情况(又称Reve’s Puzzle),对四柱汉诺塔上移动nnn个盘子,可以通过分成如下333个步骤

  1. rrr个圆盘从AAA柱,通过CCCDDD柱移动到BBB
  2. n−rn-rnr个圆盘从AAA柱,通过CCC柱移动到DDD
  3. rrr个圆盘从BBB柱,通过AAACCC柱移动到DDD

那么我们的疑问是能够将111333两个步骤作为子问题。通过一些简单的运算,我们发现对于较小的nnn,使用该方法的结果是正确的。

不加证明该递归算法的正确性,我们可以归纳递推式为
T(4,n)=min⁡1≤r&lt;n2T(4,n−r)+T(3,r) T(4, n) = \min_{1 \leq r &lt; n }{2T(4, n-r) + T(3, r)} T(4,n)=1r<nmin2T(4,nr)+T(3,r)

T(4,n)=min⁡1≤r&lt;n2T(4,n−r)+2r−1 T(4, n) = \min_{1 \leq r &lt; n }{2T(4, n-r) + 2^r - 1} T(4,n)=1r<nmin2T(4,nr)+2r1
产生的数列
T(4,i)=A007664=0,1,3,5,9,13,17,25,… T(4, i) = A007664 = 0, 1,3,5,9,13,17,25,\dots T(4,i)=A007664=0,1,3,5,9,13,17,25,
对该数列进行差分,能够发现产生的数列为
A137688=1,2,2,4,4,4,8,8,8,8,⋯=20,21,21,22,22,22,… A137688 = 1,2,2,4,4,4,8,8,8,8,\dots = 2^0, 2^1, 2^1, 2^2,2^2,2^2,\dots A137688=1,2,2,4,4,4,8,8,8,8,=20,21,21,22,22,22,
因此我们可以在O(n)O(n)O(n)的时间内计算出T(4,n)T(4, n)T(4,n)的结果


对于圆柱的数量 m≥5m\geq5m5 的情况,我们是否可以继续使用递归的思路?

我们尝试继续使用333个步骤描述对mmm柱汉诺塔的移动方式:

  1. rrr个圆盘从AAA柱,通过m−2m-2m2根圆柱移动到BBB
  2. n−rn-rnr个圆盘从AAA柱,通过其他m−3m-3m3根圆柱移动到mmm
  3. rrr个圆盘从BBB柱,通过m−2m-2m2根圆柱移动到mmm

在这种移动过程中,我们会产生一些疑问,如:我们是否可以进行如下操作

  1. r’r’r个圆盘从AAA柱,通过m−3m-3m3根圆柱移动到BBB柱、CCC
  2. n−r’n-r’nr个圆盘从AAA柱,通过其他m−4m-4m4根圆柱移动到mmm
  3. r′r&#x27;r个圆盘从BBB柱、CCC柱,通过m−3m-3m3根圆柱移动到m​m​m

这样的话,111333两个步骤就难以通过递归方式描述,因为这把r’r’r个圆盘放到了两根(甚至更多根)圆柱上

但是我们稍加考虑,假设我们移到BBB柱上的数量为rBr_BrB,本质上与我们在之前方案上先移动rBr_BrB个圆盘,再移动n−rBn-r_BnrB个圆盘到mmm柱上的方案是等价的。

333个步骤已经是Frame-Stewart算法的主要思想,我们在利用公式简要地描述:
T(m,n)=min⁡1≤r&lt;n2T(m,n−r)+T(m−1,r) T(m,n) = \min_{1 \le r &lt; n}2T(m,n-r)+T(m-1,r) T(m,n)=1r<nmin2T(m,nr)+T(m1,r)
对此,除m=3,4m=3,4m=3,4的情况外,我们需要O(mn2)O(mn^2)O(mn2)的时间复杂度计算mmm柱汉诺塔问题,含有nnn个圆盘时的最少移动次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值