DWの答えに小さなことを1つ追加します。
私は、単項ナップザックがPにあるため、現在の最良のアルゴリズムが指数時間を持っているナップザックの代わりにそれを使用できると考える人々を見てきました。
入力をおよびkとし、ナップザックおよび単項ナップザックの動的プログラミングアルゴリズムを検討します。両方の実行時間はO (n k )です。同じ実行時間です。つまり、入力がある場合、単項ナップザックに動的プログラミングを使用するか、ナップザックに動的プログラミングを使用するかは重要ではありません。両方とも、問題のインスタンスを解決するのに(ほぼ)同じ時間がかかります。理論的には、どちらか一方を使用すれば、もう一方も使用できます。数値を単項式から2進数に、またはその逆に変換する必要があります。W= { w1、… 、wn}kO (n k )
では、入力のサイズに対するアルゴリズムの複雑さを定義するポイントは何ですか?なぜパラメーターとしてとしてそれらを常に述べないのですか?O (n k )
単独で問題に関心がある場合は、そうすることができます。実際、これはアルゴリズムの人々がよく行うことです。グラフアルゴリズムの複雑さは、多くの場合、頂点をコード化する文字列のサイズではなく、頂点の数とエッジの数で表されます。
しかし、これは私たちが孤立した問題を扱っているときだけです。入力の種類が異なる問題を処理する場合は役に立ちません。グラフの場合、頂点とエッジの数に対する実行時間について話すことができます。ナップザックについては、アイテムの数とナップザックのサイズについて話すことができます。しかし、両方について話したい場合はどうでしょうか?たとえば、問題間の縮約をしたいとき、またはグラフを入力として持つだけでなく、任意の問題を含む問題のクラスについて話し合うとき 入力の汎用パラメーターが必要です。一般に入力は単なる文字列であり、その記号を単項数、2進数、グラフなどとして解釈するのは私たちです。アルゴリズムと問題の複雑さの一般理論を開発するには、入力の一般的なパラメーターが必要です。入力のサイズは明らかな選択であり、その上に合理的な理論を構築できるほど十分に堅牢であることがわかります。それだけではありません。人工的なものについては、に基づいて理論を構築することができますから入力のサイズ。それは正常に動作します。2
ここで、文字列の観点からオブジェクトのエンコードについて考えることを強制する入力の汎用パラメーターとしてサイズを使用することにします。それらをエンコードするにはさまざまな方法があり、サイズを変えることができます。(また、異なることを簡単/困難にします。)アルゴリズムの一般理論の観点から、入力数を単項でエンコードするか、バイナリでエンコードするかが重要になります。単項を使用しており、のサイズが100の場合、取得できる最大数は100です。バイナリkを使用している場合、2 100 − 1と同じ大きさになります。したがって、ナップザック問題を解決する実行時間について話しているとき、kのサイズはk100100k2100− 1k100は、私たちは2つの非常に異なる状況を取得している:1ケースでは、入力のみを気に限り大きくすることができ、入力に関する他の私たちのケアで最も100である2 100 - 1。k2100− 1
SATを多項式時間でナップザックに還元できるかどうかを確認したいとしましょう。SATの入力式のサイズがます。それから、nにサイズ多項式があるナップザックの入力のみを作成できます。p (n )が、私が作成するナップザックの入力のサイズだとしましょう。単項を使用する場合、最大でp (n )になるようにkのみを配置できます。バイナリを使用する場合、kを2 p (n ) − 1と同じ大きさにすることができます。私はkを置く必要があることがわかりましたnnp (n )kp (n )k2p (n )− 1kSATをナップザックに削減できるほど大きい。したがって、単項ナップザックは、SATを削減するために機能しません。ただし、バイナリナップザックは機能します。
バイナリを使用すると、より大きな持つナップザックインスタンスを作成できます。k
これについて考える別の方法:単項ナップザックを解決するブラックボックスとナップザックを解決する別のブラックボックスがあるとします。ブラックボックスのビット入力を書き込む時間があると仮定します。どのブラックボックスがより強力ですか?明らかにバイナリエンコーディングを使用するもの。これを使用して、単項ナップザックブラックボックスが解決できる問題と比較して指数関数的に大きいkを持つナップザック問題を解決できます。nk