天天看点

算法设计与分析3 - 动态规划解决四柱汉诺塔问题

<b>三、四柱汉诺塔问题</b><b></b>

<b></b>

3、四塔问题:设有A,B,C,D四个柱子(有时称塔),在A柱上有由小到大堆放的n个盘子,如图所示。

今将A柱上的盘子移动到D柱上去。可以利用B,C柱作为工作栈用,移动的规则如下:

①每次只能移动一个盘子。

②在移动的过程中,小盘子只能放到大盘子的上面。

设计并实现一个求解四塔问题的动态规划算法,并分析时间和空间复杂性。

■  算法思想:

用如下算法移动盘子(记为FourPegsHanoi):

1)、将A柱上n个盘子划分为上下两部分,下方部分共有k(1≤k≤n)个盘子,上方部分共有n - k个盘子。

2)、将A柱上面部分n–k个盘子使用FourPegsHanoi算法经过C、D柱移至B柱。

3)、将A柱剩余的k个盘子使用ThreePegsHanoi算法经过C柱移至D柱。

4)、将B柱上的n–k个盘子使用FourPegsHanoi算法经过A、C柱移至D柱。

ThreePegsHanoi算法如下(设三个柱子分别为A、B、C,A柱上共有k个盘子):

1)、将A柱上方k-1个盘子使用ThreePegsHanoi算法经过B柱移至C柱。

2)、将C柱上最后一个盘子直接移至C盘。

3)、将B柱上k-1个盘子使用ThreePegsHanoi算法经过A柱移至C柱。

■  算法步骤:

根据动态规划的四个步骤,求解如下:

1)、最优子结构性质:

   四柱汉诺塔问题的最优解是用最少的移动次数将A柱上的盘子全部移到D柱上。当盘子总数为i时,我们不妨设使用FourPegsHanoi的最少移动次数为f(i)。相应的ThreePegsHanoi 算法移动次数为g(k),由于g(k)=2g(k-1)+1=2k -1,当k确定时,g(k)也是不变的。

   f(i)为最优解时,其子问题f(i-k)也必为最优解。如果f(i-k)不是最优解,那么存在f’(i-k) &lt; f(i-k)。用f’(i-k)替换f(i-k)将产生一个比f(i)更优的解。这与f(i)为最优解是矛盾的。所以本问题具有最优子结构性质。

2)、递归地定义问题的最优解:

根据上述FourPegsHanoi算法得到最少移动次数f(i):

3)、自底向上地计算最优解的值: (相应的Java源程序在Hanoi.java中。)

f(i)对应算法中的m[i , s[i]]。

-----------------------------------------------------------------------------------------

求四柱汉诺塔最小移动次数伪代码:

数组下标从0开始,数组m,s大小为n+1。数组m存储计算最小移动次数的中间值。数组s存储每步最小移动次数所对应的分割值k。

MinMovements ( n ):

      m[0,0] ← s[0] ← 0 ▹为了方便计算增加了f(0) = m[0,s[0]] = 0   

      for i ← 1 to n

           do min ← ∞

                 for k ← 1 to i

                      do m[i , k] ← 2 * m[i – k , s[i – k]] + 2k – 1

                            if m[i , k] &lt; min

                                  then min ← m[i , k]

                                        s[i] = k

      return m[n , s[n]] &amp; s

4)、根据计算信息构造最优解:

MinMovements求出的数组s中,s[i]是f(i)所对应的最优分割位置。根据数组s来构造移动盘子的最佳序列,伪代码如下:

FourPegsHanoi (i , src, temp1, temp2, dest):

if i = 1

then move(src , dest)

else FourPegsHanoi(i – s[i] , src , temp2 , dest , temp1)

ThreePegsHanoi(s[i] , src , temp2 , dest)

                  FourPegsHanoi(i – s[i] , temp1 , src , temp2 , dest)

----------------------------------------------------------------------------------------

ThreePegsHanoi(k , src , temp, dest):

           if k = 1

                 else ThreePegsHanoi(k - 1, src , dest , temp)

                        move(src , dest)

                        ThreePegsHanoi(k - 1, temp , src , dest)

■   时间空间复杂度分析:

1、时间复杂度

MinMovements算法的时间复杂度为:

T(n) = 1 + 2 + <b>...</b> + n = n(n+1)/2 = O(n2)

2、空间复杂度

MinMovements算法占用的空间为m 和 s数组的大小:

即 (n+1)2 + (n+1) = O(n2)

通过分析m数组中记录了一些与结果不相关的数据,所以通过对MinMovements进行改进,可使占用空间减小为O(n)。

      m[0] ← s[0] ← 0      

           do m[i] ← ∞

                      do q ← 2 * m[i – k] + 2k – 1

                            if q &lt; m[i]

                                  then m[i] ← q

                                        s[i] ← k

      return m[n] &amp; s

■   算法测试

当n=10时,最小移动次数49。 移动序列如下:

1    A-&gt;D

2    A-&gt;B

3    A-&gt;C

4    B-&gt;C

5    D-&gt;C

6    A-&gt;B

7    A-&gt;D

8    B-&gt;D

9    A-&gt;B

10  D-&gt;A

11  D-&gt;B

12  A-&gt;B

13  C-&gt;A

14  C-&gt;D

15  C-&gt;B

16  D-&gt;B

17  A-&gt;B

18  A-&gt;C

19  A-&gt;D

20  C-&gt;D

21  A-&gt;C

22  D-&gt;A

23  D-&gt;C

24  A-&gt;C

25  A-&gt;D

26  C-&gt;D

27  C-&gt;A

28  D-&gt;A

29  C-&gt;D

30  A-&gt;C

31  A-&gt;D

32  C-&gt;D

33  B-&gt;C

34  B-&gt;D

35  B-&gt;A

36  D-&gt;A

37  C-&gt;A

38  B-&gt;D

39  B-&gt;C

40  D-&gt;C

41  B-&gt;D

42  C-&gt;B

43  C-&gt;D

44  B-&gt;D

45  A-&gt;B

46  A-&gt;C

47  A-&gt;D

48  C-&gt;D

49  B-&gt;D

当n=15时,最小移动次数129。移动序列如下:

1    A-&gt;B

2    A-&gt;C

3    A-&gt;D

4    C-&gt;D

5    B-&gt;D

6    A-&gt;C

7    A-&gt;B

8    C-&gt;B

9    A-&gt;C

10  B-&gt;A

11  B-&gt;C

12  A-&gt;C

13  D-&gt;A

14  D-&gt;B

15  D-&gt;C

16  B-&gt;C

17  A-&gt;C

18  A-&gt;D

19  A-&gt;B

20  D-&gt;B

21  A-&gt;D

22  B-&gt;A

23  B-&gt;D

24  A-&gt;D

25  A-&gt;B

26  D-&gt;B

27  D-&gt;A

28  B-&gt;A

29  D-&gt;B

30  A-&gt;D

31  A-&gt;B

32  D-&gt;B

33  C-&gt;D

34  C-&gt;B

35  C-&gt;A

36  B-&gt;A

37  D-&gt;A

38  C-&gt;B

39  C-&gt;D

40  B-&gt;D

41  C-&gt;B

42  D-&gt;C

43  D-&gt;B

44  C-&gt;B

45  A-&gt;C

46  A-&gt;D

47  A-&gt;B

48  D-&gt;B

49  C-&gt;B

50  A-&gt;D

51  A-&gt;C

52  D-&gt;C

53  A-&gt;D

54  C-&gt;A

55  C-&gt;D

56  A-&gt;D

57  A-&gt;C

58  D-&gt;C

59  D-&gt;A

60  C-&gt;A

61  D-&gt;C

62  A-&gt;D

63  A-&gt;C

64  D-&gt;C

65  A-&gt;D

66  C-&gt;A

67  C-&gt;D

68  A-&gt;D

69  C-&gt;A

70  D-&gt;C

71  D-&gt;A

72  C-&gt;A

73  C-&gt;D

74  A-&gt;D

75  A-&gt;C

76  D-&gt;C

77  A-&gt;D

78  C-&gt;A

79  C-&gt;D

80  A-&gt;D

81  B-&gt;D

82  B-&gt;A

83  B-&gt;C

84  A-&gt;C

85  D-&gt;C

86  B-&gt;A

87  B-&gt;D

88  A-&gt;D

89  B-&gt;A

90  D-&gt;B

91  D-&gt;A

92  B-&gt;A

93  C-&gt;B

94  C-&gt;D

95  C-&gt;A

96  D-&gt;A

97  B-&gt;A

98  B-&gt;C

99  B-&gt;D

100C-&gt;D

101B-&gt;C

102D-&gt;B

103D-&gt;C

104B-&gt;C

105      B-&gt;D

106      C-&gt;D

107      C-&gt;B

108      D-&gt;B

109      C-&gt;D

110    B-&gt;C

111   B-&gt;D

112    C-&gt;D

113    A-&gt;C

114    A-&gt;D

115    A-&gt;B

116    D-&gt;B

117   C-&gt;B

118    A-&gt;D

119    A-&gt;C

120      D-&gt;C

121      A-&gt;D

122      C-&gt;A

123      C-&gt;D

124      A-&gt;D

125      B-&gt;A

126      B-&gt;C

127      B-&gt;D

128      C-&gt;D

129      A-&gt;D

<a href="http://down.51cto.com/data/2350666" target="_blank">附件:http://down.51cto.com/data/2350666</a>

本文转自wintys 51CTO博客,原文链接:http://blog.51cto.com/wintys/100703

继续阅读