【问题标题】:Tower of Hanoi algorithm河内塔算法
【发布时间】:2017-07-29 18:34:50
【问题描述】:

河内塔

假设我必须为 hanoi 函数的递归塔找到最有效的方法,除了 4 个钉子。

显然应该比普通的河内塔快

我的算法如下:

如果我们有 5 张光盘,它会是这样的

     -                                               
    ---                                             
   -----                                            
  -------                                           
 ---------                                        
___________  ___________  ___________  ___________ 

我想将 n // 2 张光盘移动到两个备用凳子之一

   -----                                            
  -------                      -                    
 ---------                    ---                    
___________  ___________  ___________  ___________ 

现在使用剩下的 3 个凳子,我想使用 n - 1 方法(河内的普通塔)将剩余部分送到目的地(我意识到我把 n//2 放在了备用 1 而不是备用 2 中,但是总体相同)

                                          -----     
                  -                      -------    
                 ---                    ---------   
___________  ___________  ___________  ___________ 

现在只需将原来的 n//2 放到目的地

                                            -       
                                           ---      
                                          -----     
                                         -------    
                                        ---------   
___________  ___________  ___________  ___________  

如果光盘是 1 到 8,这将获得最有效的运行时间,但在 9 之后显然有更好的方法。有什么办法可以拆分 n 以获得更好的运行时间?

运行时间:

显然是最佳运行时间(来源:http://service.scs.carleton.ca/sites/default/files/tr/TR-04-10.pdf

8: 33 步

9: 41 步

我的

8: 33 步

9: 49 步

【问题讨论】:

标签: python algorithm computer-science


【解决方案1】:

Hanoi4(N) 为移动 N 个带有 4 个钉子的圆盘所需的移动次数,并令 Hanoi3(N) 为移动 N 个带有 3 个钉子的圆盘所需的移动次数。我们知道 Hanoi3(N) = 2^N-1

我认为你是对的,对于每 N,最好的策略是将一些小磁盘移动到具有 Hanoi4 的备用挂钩上,将剩余的大磁盘移动到Hanoi3 的目标,然后将小的移动到目标 Hanoi4。那么,对于每个 N,得到的公式将是 2*Hanoi4(a) + Hanoi3(N-a),其中 a 是我们先把小钉子移开。

这是一个简单的程序,用于计算并打印 python 中的最佳成本:

Hanoi3=[0,1]
Hanoi4=[0,1]

print "     N    Hanoi3   Hanoi4    a" 
a=1;
for N in range(2,20):
    Hanoi3.append(Hanoi3[N-1]*2+1)
    cost=2*Hanoi4[a]+Hanoi3[N-a];
    while a<N-1:
        c2 = 2*Hanoi4[a+1]+Hanoi3[N-a-1]
        if c2>cost:
            break
        a+=1;
        cost=c2;
    Hanoi4.append(cost)
    print '{0:6d}    {1:6d}   {2:6d}{3:5d}'.format(N,Hanoi3[N],Hanoi4[N],a)

输出:

 N    Hanoi3   Hanoi4    a
 2         3        3    1
 3         7        5    1
 4        15        9    2
 5        31       13    3
 6        63       17    3
 7       127       25    4
 8       255       33    5
 9       511       41    6
10      1023       49    6
11      2047       65    7
12      4095       81    8
13      8191       97    9
14     16383      113   10
15     32767      129   10
16     65535      161   11
17    131071      193   12
18    262143      225   13
19    524287      257   14

如您所见,N/2 并没有计算出最好的 a

你可以在这里玩这个程序:https://ideone.com/tdT5R1

【讨论】:

  • 谢谢。它引导我找到解决方案,它并不准确,但非常接近。我用了平方根
猜你喜欢
  • 2012-09-11
  • 2012-09-13
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多