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