2012-05-21 6 views
6

は、実行時間O Nは、ディスクの数が移動することである(2 N)未満であるハノイの塔のための解決策はありますか?私の解はO(2 n)時間かかる。O(2^n)より良いハノイ解の塔?

また、以下の解決策は再帰を伴います。私たちは、より短時間でこれを解決するためにメモ帳の概念を使って動的プログラミングを使用できますか?

public void towersOfHanoi(
     int num, 
     MyStack<Integer> from, 
     MyStack<Integer> to, 
     MyStack<Integer> spare 
) { 
    if (num == 1) { 
     int i = from.pop(); 
     to.push(i); 
     System.out.println("Move "+i+" from "+from.getName()+" to " + to.getName()); 
     return; 
    } 
    towersOfHanoi(num - 1, from, spare, to); 
    towersOfHanoi(1, from, to, spare); 
    towersOfHanoi(num - 1, spare, to, from); 
} 

MyStacknameフィールドとアクセサを追加し、JavaのStackクラスの拡張版です。

また、同じ問題のバリエーションはありますか?

+3

「ソリューションはありハノイ塔の稼働時間がO(2^n)未満の場合、ここでnは移動するディスクの数ですか? - そうです。それは不正行為と呼ばれています:-) –

+1

そしてどうすればいいのですか? – dharam

+4

...スタック全体をピックアップして一気に移動します。いいえ、2^nより優れたルールに従う方法はありません。 –

答えて

18

ハノイのタワーズは常に2^n - 1ステップを要します...いいえ、ステップをプリントアウトするだけでO(2^n)が必要なので、より高速なアルゴリズムを見つけることはできません。はるかに少ないそれらを計算します。

9

私は(スティーブン同様に)証明しませんが、2^n-1が最小であることを直感的に説明しようとします: すべての状態で、ディスクには3つの可能な移動しかありません。 最初の数字がラージアディスクがどこにあるかを示し、最後の数字が最も小さいディスクがどこにあるかを示すように、順序付けられたseq(1,1、..、1)として現在の状態を表します。 (1,1、...、1)は、すべてのディスクが位置1にあることを意味します。また、(1,1)からは、(1,1、... 2)と( 1、...、3)。 (1、1、... 2)3つの降順の状態があります。

  1. 背面に移動します(1、1、... 1)
  2. 後藤(1、1、...、3)
  3. 後藤(1、1、... 3、2)

続行する場合は、ノードが可能状態とエッジ(遷移)であるため、グラフを取得します「ディスクの移動」です。

次のような画像が表示されます(継続すると、三角形のようになり、頂点は(1,1、... 1)、(2、2、..2)、 、3、... 3))。ステップ数は実際にはグラフ内のパスです。

三角の端に沿って歩いている場合、2^n-1のステップ数です。その他のパスはすべて同じ長さまたはそれ以上です。

enter image description here

あなたは戦略を使用している場合:2を配置し、その後、3を配置largesを移動するために、最大除くすべてのディスクを移動し、最終的には3 2に、すべてのフォームを移動するには、式は次のように工夫することができます方法:

F(N)=
F(N-1)3
+ 1 //移動最大1から2
+ F 1から最大以外のすべての移動(N -1)// //すべてを3から2に移動
- >
f(n)= 1+ 2 * F(N-1)

その再発方程式の解を使用すると、その戦略によって必要とされるステップ数(ステップ数の最小値であることを起こるもの)

+3

+1の手描きgfx :-) – hirschhornsalz

8

ハノイのタワーに対する解決策を与えます必然的に2 nです。しかし、動的プログラミング解法では、各部分問題は1回だけ計算され、次に、第1の部分問題解決策、現在のディスク移動および第2の部分問題解決策を組み合わせることによって問題が解決される。

したがって、それぞれのソリューションを生成するには、現在のソリューション用にメモリを割り当て、次にそのメモリを満たす2つのコンポーネントがあります。メモリの割り当ては、割り当てられたメモリのサイズにほぼ依存せず、高価なコンポーネントです。メモリコピーは、コピーされたメモリのサイズにおいて線形であり、高速ではあるが、タワーズの解として指数関数的である。

時間= C * N + C * 2 N、C >> C 。すなわち、それは線形で始まり、指数関数的に終わる。

Link to article appearing in ACM's SIGCSE Inroads magazine (September 2012)

+0

このトピックについての優れた洞察力!最初は私が[Google検索で見つけたこのウェブサイト](http://penguin.ewu.edu/~trolfe/DynamicHanoi/)からのインスピレーションで自分自身を実装し、それから実現するまで、私はかなり納得していませんサンプルプログラムと回答者の両方が同じ人物です。ありがとう、@ティムロルフ!私はあなたのウェブ上のあなたのトレースに従うことができることが幸運に感じる。 :-) – RayLuo

1

ハノイ問題の標準の塔は3本のペグを扱います。

しかし、k-pegがある場合、時間の複雑さはO(2 ^(n /(k-2)))になります。

I 4つのペグ及び5本のペグを使用してこの問題を解決しており、時間の複雑さが生じは、O(2 ^(N/2))及びO(2 ^(N/3))であり、それぞれ

関連する問題