隨筆 - 117  文章 - 72  trackbacks - 0

          聲明:原創作品(標有[原]字樣)轉載時請注明出處,謝謝。

          常用鏈接

          常用設置
          常用軟件
          常用命令
           

          訂閱

          訂閱

          留言簿(7)

          隨筆分類(130)

          隨筆檔案(123)

          搜索

          •  

          積分與排名

          • 積分 - 156008
          • 排名 - 389

          最新評論

          三、四柱漢諾塔問題
          3、四塔問題:設有ABCD四個柱子(有時稱塔),在A柱上有由小到大堆放的n個盤子,如圖所示。

          今將A柱上的盤子移動到D柱上去。可以利用BC柱作為工作棧用,移動的規則如下:
          每次只能移動一個盤子。
          在移動的過程中,小盤子只能放到大盤子的上面。
          設計并實現一個求解四塔問題的動態規劃算法,并分析時間和空間復雜性。
           
            算法思想:
          用如下算法移動盤子(記為FourPegsHanoi):
          1)、將A柱上n個盤子劃分為上下兩部分,下方部分共有k(1kn)個盤子,上方部分共有n - k個盤子。
          2)、將A柱上面部分n–k個盤子使用FourPegsHanoi算法經過CD柱移至B柱。
          3)、將A柱剩余的k個盤子使用ThreePegsHanoi算法經過C柱移至D柱。
          4)、將B柱上的n–k個盤子使用FourPegsHanoi算法經過AC柱移至D柱。
           
          ThreePegsHanoi算法如下(設三個柱子分別為ABCA柱上共有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) < 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] < min
                                            then min ← m[i , k]
                                                  s[i] = k
                return m[n , s[n]] & 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
          then move(src , dest)
                           else ThreePegsHanoi(k - 1, src , dest , temp)
                                  move(src , dest)
                                  ThreePegsHanoi(k - 1, temp , src , dest)
          -----------------------------------------------------------------------------------------
             時間空間復雜度分析:
          1、時間復雜度
          MinMovements算法的時間復雜度為:
          T(n) = 1 + 2 + ... + n = n(n+1)/2 = O(n2)
          2、空間復雜度
          MinMovements算法占用的空間為m s數組的大小:
          (n+1)2 + (n+1) = O(n2)
          通過分析m數組中記錄了一些與結果不相關的數據,所以通過對MinMovements進行改進,可使占用空間減小為O(n)
          MinMovements ( n ):
                m[0] ← s[0] ← 0      
                for i ← 1 to n
                     do m[i] ←
                           for k ← 1 to i
                                do q ← 2 * m[i – k] + 2k – 1
                                      if q < m[i]
                                            then m[i] ← q
                                                  s[i] ← k
                return m[n] & s

             算法測試
          n=10時,最小移動次數49 移動序列如下:
          1    A->D
          2    A->B
          3    A->C
          4    B->C
          5    D->C
          6    A->B
          7    A->D
          8    B->D
          9    A->B
           
          10  D->A
          11  D->B
          12  A->B
          13  C->A
          14  C->D
          15  C->B
          16  D->B
          17  A->B
          18  A->C
          19  A->D
           
          20  C->D
          21  A->C
          22  D->A
          23  D->C
          24  A->C
          25  A->D
          26  C->D
          27  C->A
          28  D->A
          29  C->D
           
          30  A->C
          31  A->D
          32  C->D
          33  B->C
          34  B->D
          35  B->A
          36  D->A
          37  C->A
          38  B->D
          39  B->C
          40  D->C
          41  B->D
          42  C->B
          43  C->D
          44  B->D
          45  A->B
          46  A->C
          47  A->D
          48  C->D
          49  B->D
           
          n=15時,最小移動次數129。移動序列如下:
          1    A->B
          2    A->C
          3    A->D
          4    C->D
          5    B->D
          6    A->C
          7    A->B
          8    C->B
          9    A->C
          10  B->A
          11  B->C
          12  A->C
          13  D->A
          14  D->B
          15  D->C
          16  B->C
          17  A->C
          18  A->D
          19  A->B
          20  D->B
          21  A->D
          22  B->A
          23  B->D
          24  A->D
          25  A->B
          26  D->B
           
          27  D->A
          28  B->A
          29  D->B
          30  A->D
          31  A->B
          32  D->B
          33  C->D
          34  C->B
          35  C->A
          36  B->A
          37  D->A
          38  C->B
          39  C->D
          40  B->D
          41  C->B
          42  D->C
          43  D->B
          44  C->B
          45  A->C
          46  A->D
          47  A->B
          48  D->B
          49  C->B
          50  A->D
          51  A->C
          52  D->C
           
          53  A->D
          54  C->A
          55  C->D
          56  A->D
          57  A->C
          58  D->C
          59  D->A
          60  C->A
          61  D->C
          62  A->D
          63  A->C
          64  D->C
          65  A->D
          66  C->A
          67  C->D
          68  A->D
          69  C->A
          70  D->C
          71  D->A
          72  C->A
          73  C->D
          74  A->D
          75  A->C
          76  D->C
          77  A->D
          78  C->A
           
          79  C->D
          80  A->D
          81  B->D
          82  B->A
          83  B->C
          84  A->C
          85  D->C
          86  B->A
          87  B->D
          88  A->D
          89  B->A
          90  D->B
          91  D->A
          92  B->A
          93  C->B
          94  C->D
          95  C->A
          96  D->A
          97  B->A
          98  B->C
          99  B->D
          100C->D
          101B->C
          102D->B
          103D->C
          104B->C
           
          105      B->D
          106      C->D
          107      C->B
          108      D->B
          109      C->D
          110    B->C
          111   B->D
          112    C->D
          113    A->C
          114    A->D
          115    A->B
          116    D->B
          117   C->B
          118    A->D
          119    A->C
          120      D->C
          121      A->D
          122      C->A
          123      C->D
          124      A->D
          125      B->A
          126      B->C
          127      B->D
          128      C->D
          129      A->D

          文章來源:http://wintys.blog.51cto.com/425414/100703
          [附件]:四柱漢諾塔.zip
          posted on 2009-03-18 12:02 天堂露珠 閱讀(1151) 評論(0)  編輯  收藏 所屬分類: Algorithm
          主站蜘蛛池模板: 宝应县| 甘泉县| 西城区| 乌鲁木齐市| 沙洋县| 安康市| 乌审旗| 潜江市| 凤庆县| 托克托县| 辉南县| 晋城| 荔波县| 丰城市| 喀喇沁旗| 奇台县| 射洪县| 抚顺市| 眉山市| 绥中县| 商水县| 南宫市| 定安县| 正蓝旗| 宜昌市| 娱乐| 盘山县| 洮南市| 广昌县| 永平县| 洛隆县| 日土县| 灵丘县| 天长市| 滕州市| 泰安市| 十堰市| 射阳县| 和顺县| 淳化县| 洞口县|