ハノイの塔の複雑さ


20

私はハノイの塔の複雑さについて次の疑問にぶつかりました。

  • NPにありますか? 回答の試行:ペギー(証明者)が問題を解決し、ビクター(検証者)に提出したとします。ビクターはソリューションの最終状態が(線形時間で)正しいことを簡単に確認できますが、ペギーの各移動を確認して、彼女が違法な移動を行わなかったことを確認する以外に選択肢はありません。Peggyは最低2 ^ | disks |を作成する必要があるため -1移動(証明可能)、ビクターも追随する必要があります。したがって、Victorには多項式時間検証(NPの定義)がないため、NPに含めることはできません。

  • PSPACEにありますか?そのように思えますが、私は上記の推論を拡張する方法を考えることができません。

  • PSPACE完全ですか?そうではないようですが、私にはあいまいな考えしかありません。ToHが特定のインスタンスである自動計画は、PSPACE完全です。PlanningにはToHよりもはるかに難しいインスタンスがあると思います。

更新:入力=、ディスクの数。出力=各ステップでのディスク構成。これを更新した後、私はこの入力/出力形式が意思決定の問題に適合しないことに気付きました。この種の問題に対するNP、PSPACEなどの概念を取り込むための正しい形式化についてはわかりません。n

アップデート#2:KavehとJeffのコメントの後、私は問題をより正確にすることを余儀なくされました。

入力intのペアとするディスクの数です。ディスクが行った一連の移動が、最初の移動から(disk-number、from-peg、to-peg)(disk-number、from-peg、to-peg)...の形式で書き留められている場合最後に、バイナリでエンコードされ、番目のビットを出力します。(n,i)ni

エンコードについてより具体的にする必要があるかどうかを教えてください。この場合、Kavehのコメントが当てはまると思いますか?


5
ハノイの塔の問題を定義するか、定義にリンクしてください。
— カベ

1
PKG、私はそれがハノイの塔であることを知っています。その複雑さを知りたい計算上の問題は何ですか?入力は何ですか?出力は何ですか?
— カヴェー

@Kaveh:最初のコメントからあなたの意図は不明でした
— PKG

ごめんなさい。ところで、関数の複雑度クラスがあります。通常、名前の前後にFがあります。定義については複雑度動物園を確認してください。
— カヴェー

1
整数も入力の一部ですか?i
— JeffE

回答:


9

いいえ、あなたが説明した問題は実際には非常に簡単です。高レベルの理由は、インデックス長さが約nビットであるため、実際にはnで時間多項式を費やす余裕があるためです。inn

以下の関連する問題を考えてみましょう。2つの整数とkが与えられた場合、nディスクパズルの解のk番目の動きを記述します。入力サイズはlg n + lg k < n + lg kですが、実際には、nの最下位ビットのみが重要です。 したがって、lg kがnよりも大幅に小さい場合でも、O (log k )の時間多項式でこの問題を解決できます。nkknlg⁡n+lg⁡k<n+lg⁡knlg⁡knO(log⁡k)

ディスクには、からサイズに応じて昇順で番号が付けられ、ペグには0 = source、1 = destination、および2 = spareの番号が付けられているとします。私たちが書いてみましょうkは= (2 のp + 1 )⋅ 2 Dいくつかの整数のPとD。次に、ターンkで:0k=(2p+1)⋅2dpdk

  • 場合奇数である場合、ディスクDのペグから移動(pは国防省3 )ペグに((P + 1 )国防省3 )。d+nd(pmod3)((p+1)mod3)
  • 場合偶数である場合、ディスクDの移動は、ペグを形成する(- pは国防省3 ) PEGに((- P - 1 )国防省3 )。d+nd(−pmod3)((−p−1)mod3)

最下位ビットから上向きにkのバイナリ表現をループすることにより、時間O (log k )でとdを簡単に計算できます。それでおしまい。pdO(log⁡k)k

ここで、出力シーケンスに番目のビットが本当に必要であるとします。ここで、iはkではなく入力の一部です。具体的には、 -すべてのターンが同じビット数使用して符号化された場合、LG (N + 1 )ディスク番号のビット、2から-PEGためのビット、及び2対PEGのためのビット-その後、我々はただ計算しなければなりませんk個目の動き、K = ⌊ I /(LGを(N + 1 )+ 4 )⌋iiklg⁡(n+1)22kk=⌊i/(lg⁡(n+1)+4)⌋、そして適切なビットを抽出します。(出力を決定するためにnを知る必要があるため、は入力サイズで線形であることに注意してください。)lg⁡(n+1)+4n

一方、ディスク番号に可変長の表現を使用している場合、バイナリ検索により多項式時間で移動数見つけることができます。我々は、上部に移動するのに必要なターンの総数知る必要がM個の全てのために、ディスクをM ≤ Kが、これは再発で与えられる M (M )= 2 M (M - 1 )+ (\レコード移動する#bits 動的計画法により多項式時間で評価できるディスク  m )。残りの詳細は、読者の退屈な課題として残されています。kmm≤k

M(m)=2M(m−1)+(\#bits to record moving disk m)

(少なくとも1つのoff-by-oneまたはパリティエラーを犯したと思いますが、できれば主なアイデアが明確であることを願っています。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.