数値アルゴリズムで数値の単項表現を使用しないのはなぜですか?


15

擬似多項式時間アルゴリズムは、入力値(大きさ)で多項式の実行時間を持ち、入力サイズ(ビット数)で指数関数の実行時間を持つアルゴリズムです。

たとえば、数値が素数であるかどうかをテストするには、2からまでの数値をループし、 modがゼロかどうかを確認する必要があります。modがO(1)時間かかる場合、全体的な時間の複雑さはO(n)になります。n 1 nnn1n

ただし、を入力の書き込みに必要なビット数とすると、(バイナリ)であるため、あり、問題の実行時間は指数関数的なO()になります。x = log n n = 2 x 2 xバツバツ=ログnn=2バツ2バツ

私の質問は、入力単項表現を考慮する場合、常にあり、擬似多項式時間は多項式時間の複雑さに等しくなります。では、なぜこれを行わないのでしょうか?x = nnバツ=n

さらに、ナップザックには擬似多項式時間アルゴリズムがあるため、をとることにより、ナップザックは結果として多項式になりますP = NPバツ=n


3
実際、これは頻繁に行われるわけではありません。同じ理由で、私たちは通常単項言語を扱いませんが、これらの獣に関連する多くの興味深い結果があります。調べましたか?
アンドレスーザレ

2
はい、サイズと大きさの違いを取り除くと、その違いに基づいているすべての概念が失われます。
アンドレスーザレモス

7
悪魔を素敵なドレスに入れているからです。それは何も速くしませんが、「実行時間の複雑さ」を無意味にします。
ラファエル

4
@Drupalist単項ナップサック問題は、ナップザック問題の通常の縮約では数値がバイナリで書き出されることを想定しているため、実際にはNP完全であることはわかっていません。標準の縮約を試みても、単項式で数値を記述した場合、縮約は多項式時間で計算できません。その結果、多項式時間で解ける単項ナップザック問題は、P = NPを意味するわけではありません
templatetypedef

2
疑似多項式でタグ付けされた他の回答、特にこの回答をチェックしてください。
ラファエル

回答:


17

これが意味するのは、単項ナップザックがPにあるということです。それは、ナップザック(バイナリエンコードされた数値を含む)がPにあることを意味しません。

ナップザックはNP完全であることが知られています。ナップザックがPにあることを示した場合、P = NPであることを示します。

しかし、ナップザックがPにあることを示していません。単項ナップザックがPにあることを示しました。しかし、単項ナップザックがNP完全であることは知られていません(実際、NP完全ではない可能性が最も高いと思われます) )。したがって、Pに単項ナップザックを入れても、P = NPであるとは限りません。


では、ナップザックと単項ナップサックのどちらの問題をもっと気にする必要がありますか?あなたの動機が実際的な懸念に基づいている場合、答えはナップザック問題を解決したい数字のサイズに依存します:それらが大きい場合、あなたは確かに単項ナップザックよりもナップザックに関心があります。あなたの動機が理論的な懸念に基づいている場合、ナップザックは間違いなくより興味深いものになります-サイズと大きさを区別することができますが、単項ナップザックはその区別ができません。


ナップザック問題の動的計画法アルゴリズムに関する追加の質問に答えるには:

はい、同じ動的プログラミングアルゴリズムナップザックと単項ナップザックの両方に適用できます。その実行時間は、数値の大きさは多項式ですが、バイナリでエンコードされた場合、数値の長さは指数関数(多項式ではありません)です。したがって、その実行時間、入力が単項でエンコードされている場合は入力の長さの多項式ですが、入力がバイナリでエンコードされている場合は入力の長さの多項式ではありません。私たちが理由です、この動的プログラミングアルゴリズムは単項ナップザックのための多項式時間アルゴリズムであると考えますが、していない、それは(バイナリエンコード)ナップサックのための多項式時間アルゴリズムであると考えています。

アルゴリズムの実行時間が最大で入力の長さのビット数である場合、アルゴリズムは多項式時間で実行されることを思い出してください。


1
どうもありがとう、私は同じアルゴリズムの単項と非単項の複雑さのクラスが異なるかもしれないことを知りませんでした。標準ナップザックの動的プログラミングソリューションが単項ナップザックに適用できないのはなぜですか?また、異なるクラスの複雑さをもたらしましたか?問題の単項バージョンの理解に問題があります。
ママD

@Drupalist、答えを編集して、最後に2つの段落を追加して、その質問に答えました。
DW

ありがとうアルゴリズム、設定することにより、多項式および擬似多項式の解釈はどうなるかを知りたいですか?再度ありがとうバツ=n
ママD

@ Drupalist、設定することで何を意味するのか完全にはわかりませんので、答え方がわかりません。この時点で、新しい(自己完結型の)質問をする(およびその質問のすべての変数を定義する)のが最善であると思われます。このプラットフォームは、フォローアップの質問ややり取りにはあまり適していません。この質問に対する答えから学んだことに基づいて、新しい質問をするのが最善の方法です。バツ=n
DW

1
@ NikosM、OK、わかった。フィードバックをお寄せいただきありがとうございます。個人的には、その記述が間違っているとは思わないので、そのままにしておきます。(私の推論:入力の長さは表現の選択に依存するので、あなたが書いたものと矛盾するとは思わない。)しかし、私の視点が狭すぎるか、より詳細な説明または異なる視点が価値を高めるかもしれません。この点がより明確であると思われる場合は、追加の回答を書いたり、編集を提案してください。
DW

6

DWの答えに小さなことを1つ追加します。

私は、単項ナップザックがPにあるため、現在の最良のアルゴリズムが指数時間を持っているナップザックの代わりにそれを使用できると考える人々を見てきました。

入力をおよびkとし、ナップザックおよび単項ナップザックの動的プログラミングアルゴリズムを検討します。両方の実行時間はO n k です。同じ実行時間です。つまり、入力がある場合、単項ナップザックに動的プログラミングを使用するか、ナップザックに動的プログラミングを使用するかは重要ではありません。両方とも、問題のインスタンスを解決するのに(ほぼ)同じ時間がかかります。理論的には、どちらか一方を使用すれば、もう一方も使用できます。数値を単項式から2進数に、またはその逆に変換する必要があります。W={w1wn}kOnk

では、入力のサイズに対するアルゴリズムの複雑さを定義するポイントは何ですか?なぜパラメーターとしてとしてそれらを常に述べないのですか?Onk

単独で問題に関心がある場合は、そうすることができます。実際、これはアルゴリズムの人々がよく行うことです。グラフアルゴリズムの複雑さは、多くの場合、頂点をコード化する文字列のサイズではなく、頂点の数とエッジの数で表されます。

しかし、これは私たちが孤立した問題を扱っているときだけです。入力の種類が異なる問題を処理する場合は役に立ちません。グラフの場合、頂点とエッジの数に対する実行時間について話すことができます。ナップザックについては、アイテムの数とナップザックのサイズについて話すことができます。しかし、両方について話したい場合はどうでしょうか?たとえば、問題間の縮約をしたいとき、またはグラフを入力として持つだけでなく、任意の問題を含む問題のクラスについて話し合うとき 入力の汎用パラメーターが必要です。一般に入力は単なる文字列であり、その記号を単項数、2進数、グラフなどとして解釈するのは私たちです。アルゴリズムと問題の複雑さの一般理論を開発するには、入力の一般的なパラメーターが必要です。入力のサイズは明らかな選択であり、その上に合理的な理論を構築できるほど十分に堅牢であることがわかります。それだけではありません。人工的なものについては、に基づいて理論を構築することができますから入力のサイズ。それは正常に動作します。2

ここで、文字列の観点からオブジェクトのエンコードについて考えることを強制する入力の汎用パラメーターとしてサイズを使用することにします。それらをエンコードするにはさまざまな方法があり、サイズを変えることができます。(また、異なることを簡単/困難にします。)アルゴリズムの一般理論の観点から、入力数を単項でエンコードするか、バイナリでエンコードするかが重要になります。単項を使用しており、のサイズが100の場合、取得できる最大数は100です。バイナリkを使用している場合、2 1001と同じ大きさになります。したがって、ナップザック問題を解決する実行時間について話しているとき、kのサイズはk100100k21001k100は、私たちは2つの非常に異なる状況を取得している:1ケースでは、入力のみを気に限り大きくすることができ、入力に関する他の私たちのケアで最も100である2 100 - 1k21001

SATを多項式時間でナップザックに還元できるかどうかを確認したいとしましょう。SATの入力式のサイズがます。それから、nにサイズ多項式があるナップザックの入力のみを作成できます。p n が、私が作成するナップザックの入力のサイズだとしましょう。単項を使用する場合、最大でp n になるようにkのみを配置できます。バイナリを使用する場合、k2 p n 1と同じ大きさにすることができます。私はkを置く必要があることがわかりましたnnpnkpnk2pn1kSATをナップザックに削減できるほど大きい。したがって、単項ナップザックは、SATを削減するために機能しません。ただし、バイナリナップザックは機能します。 バイナリを使用すると、より大きな持つナップザックインスタンスを作成できます。k

これについて考える別の方法:単項ナップザックを解決するブラックボックスとナップザックを解決する別のブラックボックスがあるとします。ブラックボックスのビット入力を書き込む時間があると仮定します。どのブラックボックスがより強力ですか?明らかにバイナリエンコーディングを使用するもの。これを使用して、単項ナップザックブラックボックスが解決できる問題と比較して指数関数的に大きいkを持つナップザック問題を解決できます。nk


入力を単項表現に変換することにより、数値が素数であるかどうかを判断する問題はどうなりますか、もう1つの質問をありがとうございます。この問題は、入力の大きさに基づいた多項式ですが、入力ビットに基づいた指数関数です(質問で指摘したように)、この変換は何か改善しますか?
ママD

nOnnb=210241210241210241
カヴェー

素敵な明確化、しかし、この記事に関連しているDWの答えの下で私のコメントを見てみる
ニコスM.

2

短く簡単に、理由を説明します。

Tally

x = input integer

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

バツバツO2n

Tally/うんnaryOnバツ

x = input tallies

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

入力表現は、コードの実行を高速化しません。2番目のアルゴリズムは本当にポリタイムですが。RSAの要因を見つけるのはあまり実用的ではありません。


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