河内塔算法

时间:2017-07-29 18:34:51

标签: python algorithm computer-science

河内之塔

让我们说我必须找到一个最有效的方法来实现一个递归的河内功能塔除了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移动

1 个答案:

答案 0 :(得分:0)

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

我认为你是正确的,对于每一个 N ,最好的策略是将一些小磁盘移动到一个备用挂钩上,用 Hanoi4 ,将剩下的大磁盘移到 Hanoi3 的目标,然后使用 Hanoi4 将小的目标移动到目标。对于每个 N ,那么,得到的公式将是 2 * Hanoi4(a)+ Hanoi3(Na),其中 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