web-dev-qa-db-ja.com

ナップザック問題はなぜ擬似多項式なのですか?

KnapsackはNP完全ですが、DPで解決できることは知っています。彼らは、DPソリューションはpseudo-polynomial、「入力の長さ」(つまり、入力のエンコードに必要なビット数)が指数関数的であるため。残念ながら、私はそれを手に入れませんでした。誰でもそれを説明できますかpseudo-polynomial私にゆっくりと?

65
Michael

実行時間はO(NW) N個のアイテムとサイズWのナップサックの無制限ナップザック問題の場合です。Wは入力の長さの多項式ではありません。 擬似-多項式。

W = 1,000,000,000,000と考えてください。この数を表すのに40ビットしかかからないため、入力サイズ= 40ですが、計算ランタイムはO(240)。

したがって、ランタイムはO(N.2wのビット)、これは指数関数です。

こちらもご覧ください:

64
marcog

ほとんどの問題では、標準のint/floatデータ型に快適に適合する数値の大きなリストを扱っています。ほとんどのプロセッサは、追加費用なしで一度に4〜8バイトの数字を処理するように構築されているため(たとえば1バイトに収まらない数字と比較して)、数字の拡大または縮小による実行時間の変更はほとんどありません。実際の問題で遭遇する範囲内で減少します-そのため、支配的な要因はデータポイントの膨大な量であり、私たちが慣れているnまたはmの要因です。

(Big-O表記は、データごとに32または64ビットを分割する定数因子を隠し、各数値がその多くのビット以下に収まるときは常にデータポイント数のみを残すことを想像できます。 )

しかし、他のアルゴリズムを再加工して、大きな整数(8バイト以上を表現するのに必要な数値)を含むデータセットに作用し、それがランタイムに対して何をするかを確認してください。バイナリソートのような他のアルゴリズムでも、関連する数値の大きさは常に違いを生みます。安全性のバッファを超えて拡張すると、従来のプロセッサは4〜8バイトのバッチを処理して「無料」になります。

ここで説明したナップザックアルゴリズムのコツは、特定のパラメーターWの大きさに(他のアルゴリズムと比較して)異常に敏感であることです。Wに1ビットを追加すると、アルゴリズムの実行時間が2倍になります。このアルゴリズムの前に、他のアルゴリズムの値の変化に対するそのような劇的な応答を見たことがないため、ナップザックを異なる方法で処理しているように見えるかもしれませんが、それは非多項式的な方法での応答方法の真の分析です入力サイズの変更。

22
shaunak1111

ナップザックアルゴリズムの実行時間は、入力のサイズ(n-アイテムの数)だけでなく、入力の大きさ(W-ナップザックの容量)O(nW)にも制限されます。コンピュータでのバイナリ(2 ^ n)での表現方法。計算の複雑さ(つまり、ビットを介したコンピュータ内での処理方法)は、入力のサイズのみに関係します。の大きさ/値ではありません。

しばらくの間、値/重量リストを無視します。ナップザック容量2のインスタンスがあるとしましょう。Wは入力データで2ビットを使用します。ここで、ナップザックの容量を4に増やし、残りの入力を維持します。入力は1ビットだけ増加しましたが、計算の複雑さは2倍に増加しました。容量を1024に増やすと、Wの入力は2ではなく10ビットになりますが、複雑さは512倍になります。時間の複雑さは、バイナリ(または10進数)表現のWのサイズで指数関数的に増加します。

疑似多項式の概念を理解するのに役立つもう1つの簡単な例は、素朴な素数性テストアルゴリズムです。与えられた数nに対して、範囲2..√nの各整数で均等に分割されているかどうかをチェックしているため、アルゴリズムは√(n-1)ステップを取ります。しかし、ここで、nは入力の大きさであり、サイズではありません。

                     Now The regular O(n) case

対照的に、特定の要素の配列の検索は、多項式時間O(n)で実行されます。最大でnステップを実行します。ここで、nは入力のサイズ(配列の長さ)です。

[ここを参照]

10進数を格納するために必要なビットの計算

8
shaunak1111

私がこれを理解する方法は、容量がO(W)容量入力[1,2、...、W]の配列だった場合、サイズはWです。ただし、容量の入力は数値の配列ではなく、単一の整数です。時間の複雑さは関係からサイズ = of input。整数のsizeは整数の値ではなく、それを表すビット数です。この整数Wを配列[1,2、...に変換します、W]アルゴリズムでは、人々を誤ってWがサイズであると考えさせますが、この配列は入力ではなく、整数そのものです。

入力を「ものの配列」と考え、サイズを「配列にあるものの数」と考えてください。アイテムの入力は実際には配列内のn個のアイテムの配列なので、size = nです。 容量の入力はW数の配列ではありませんその中、ただし単一の整数、log(W)ビットの配列で表されます。サイズを1増やす(意味のある1ビットを追加する)と、Wが2倍になるので、実行時間が2倍になるため、指数関数的な時間の複雑さが生じます。

3
neilxdims