私はコンピューティングと複雑性についてのコースを受講しており、これらの用語の意味を理解することができません。
私が知っているのは、NPがNP完全のサブセットであり、NP完全のサブセットであるということだけですが、それらが実際に何を意味するのかわかりません。Wikipediaは、説明がまだ高すぎるため、あまり役に立ちません。
私はコンピューティングと複雑性についてのコースを受講しており、これらの用語の意味を理解することができません。
私が知っているのは、NPがNP完全のサブセットであり、NP完全のサブセットであるということだけですが、それらが実際に何を意味するのかわかりません。Wikipediaは、説明がまだ高すぎるため、あまり役に立ちません。
回答:
ウィキペディアの記事、、および vs.は非常に優れていると思います 。まだここに私が言うことです:パートI、パートII
[必要に応じてスキップできる技術的な詳細については、括弧内のコメントを使用して説明します。]
さまざまな種類の計算上の問題があります。ただし、計算の複雑さの理論コースの概要では、意思決定の問題、つまり答えが「はい」または「いいえ」の問題に焦点を当てることが簡単です。他の種類の計算問題もありますが、ほとんどの場合、それらに関する質問は、決定問題に関する同様の質問にまとめることができます。さらに、意思決定の問題は非常に単純です。したがって、計算の複雑さの理論コースの概要では、意思決定問題の研究に注意を集中します。
YESと答えた入力のサブセットを使用して、決定問題を特定できます。これは、表記を簡略化し、私たちが書くことができます の代わりに、と の代わりに、。
もう1つの観点は、セット内のメンバーシップクエリについて話しているということです。以下に例を示します。
決定問題:
入力:自然数、 質問:は偶数ですか?x
メンバーシップの問題:
入力:自然数、 質問:はですか?X EとVのE N = { 0 、2 、4 、6 、⋯ }
入力に対するYESの回答を入力の受け入れと呼び、入力に対するNOの回答を入力の拒否と呼びます。
私たちは決定問題のためのアルゴリズムを見て、それらのアルゴリズムが計算可能なリソースのそれらの用法でどれくらい効率的であるか議論します。アルゴリズムと計算リソースが意味することを正式に定義する代わりに、Cのような言語でのプログラミングの直感に頼ります。
[備考:1.すべてを正式かつ正確に行いたい場合、標準チューリングマシンモデルのような計算モデルを修正して、アルゴリズムとその計算リソースの使用が意味するものを正確に定義する必要があります。2.モデルが直接処理できないオブジェクトの計算について話したい場合は、マシンモデルが処理できるオブジェクトとしてエンコードする必要があります。たとえば、チューリングマシンを使用している場合、自然数やグラフなどのオブジェクトをエンコードする必要がありますバイナリ文字列として。]
効率的なアルゴリズムとは、最大で多項式の量の計算リソースを使用するアルゴリズムを意味すると想定します。注目する主なリソースは、入力サイズに関するアルゴリズムの最悪の実行時間です。つまり、サイズ入力に対してアルゴリズムが実行する基本的なステップの数です。入力のサイズあるがかかった場合にのストアにコンピュータメモリの-bitsをに書く、その場合には、。したがって、効率的なアルゴリズムとは、多項式のワーストケース実行時間を持つアルゴリズムを意味します。
仮定多項式時間アルゴリズムは、効率的なアルゴリズムの直感的な概念をキャプチャとして知られているコブハムの論文。現時点では、が効率的に解決可能な問題に適したモデルであるかどうか、およびが実際に関連する問題で効率的に計算できるものをキャプチャするかどうかを説明しません。今のところ、この仮定をする正当な理由があるので、我々の目的のために、これが事実であると仮定します。あなたがコブハムの論文を受け入れない場合、それは私が下に書くものを間違ったものにしない、私たちが失うことになる唯一のものは直観である実際の効率的な計算について。複雑性理論について学び始めている人にとって、それは役に立つ仮定だと思います。
は、効率的に解くことができる決定問題のクラスです。
つまり、多項式時間アルゴリズムを持つ決定問題です。
より正式には、決定問題が場合、
すべての入力に対して次ような効率的なアルゴリズムがあります。x
- もし次に、、
- もし次いで、。
私は単にと書くことができますが、このように書いて定義と比較できるようにします。
時々 、私たちは誰かが私たちに答えを伝えますし、私たちに与えただし場合は、決定問題への答えを見つけるのいずれかの効率的な方法を知らない証拠 私たちが効率的にできる検証の答えは、それがあるかどうかを確認するために証拠をチェックして正しいことを、有効な証明を。これは、複雑度クラス背後にある考え方です。
プルーフが長すぎる場合、それは実際には役に立たないため、プルーフが有効かどうかをチェックすることはもちろん、プルーフを読むだけでも時間がかかりすぎる可能性があります。検証に必要な時間は、指定された証明のサイズではなく、元の入力のサイズで妥当なものにする必要があります!これは、私たちが本当に望んでいるのは、任意の長い証明ではなく、短い証明であることを意味します。検証の実行時間が元の入力のサイズの多項式である場合、検証の多項式部分のみを読み取ることができることに注意してください。そうで短い私たちは意味多項式サイズのもの。
「証明」という言葉を使うときはいつでも、この点を形成してください。「短い証明」を意味します。
効率的な解決方法がわからないが、証明を効率的に検証できる問題の例を次に示します。
パーティション
入力:自然数有限集合、質問:を2つの集合と (と)に分割 して、の数の合計がの数の合計に等しい()?S A B A ∪ B = S A ∩のB = ∅ B Σ X ∈ A X = Σ X ∈ Bの X
を渡し、合計が等しくなるように2つのセットに分割できるかどうかを尋ねると、それを解決するための効率的なアルゴリズムはわかりません。合計が等しいパーティションが見つかるまで、またはすべての可能なパーティションを試しても機能しなくなるまで、番号を2つのセットに分割するすべての可能な方法を試してみます。それらのいずれかが機能していれば、YESと答え、そうでなければNOと答えます。
しかし、可能な限り多くのパーティションが指数関数的に存在するため、多くの時間がかかります。しかし、私はあなたを与える 2組のと和が等しい場合とあれば、あなたは簡単に確認することができますとのパーティションである。合計を効率的に計算できることに注意してください。
ここで、私があなたに与えるとペアは、YESの答えの証拠です。私の証拠を見て、それが有効な証拠であるかどうかをチェックすることで、私の主張を効率的に確認できます。答えが「はい」の場合、有効な証拠があり、私はそれをあなたに渡すことができ、あなたはそれを効率的に検証することができます。答えがNOの場合、有効な証拠はありません。ですから、私があなたに提供するものは何でも、それをチェックして有効な証拠ではないことがわかります。答えが「はい」であるという無効な証拠であなたをだますことはできません。証明が大きすぎる場合、検証に時間がかかることを思い出してください。これが起こるのは望ましくないので、効率的な証明、つまり多項式サイズの証明にのみ注意します。
時々、人々は「証明」の代わりに「証明書」または「証人」を使用します。
注: 回答を効率的に見つけて検証できるように、特定の入力回答に関する十分な情報を提供しています。たとえば、パーティションの例では、答えを示しません。パーティションを指定するだけで、有効かどうかを確認できます。自分で答えを確認する必要があることに注意してください。私が言うことについて私を信頼することはできません。さらに、あなたは私の証明の正当性のみをチェックすることができます。私の証明が有効であれば、答えはYESです。しかし、私の証明が無効である場合、それは答えがNOであることを意味しません。1つの証明が無効であり、有効な証明がないことは確認しました。はいの証明について話している。私たちはNOの証明について話しているのではありません。
例を見てみましょう およびは、が2つのセットに分割できることの証明です 等しい合計。の数値との数値を合計して、結果が等しいかどうかを確認し、、がパーティションであるかどうかを確認するだけです。
私があなたに与えた場合にはと、あなたがチェックし、私の証明が無効であることがわかります。それは答えがNOであることを意味するのではなく、この特定の証明が無効だったことを意味します。ここでのあなたの仕事は、答えを見つけることではなく、与えられた証拠が有効かどうかを確認することです。
学生が試験の問題を解いて、教授が答えが正しいかどうかを確認するようなものです。:)(残念ながら、学生は答えの正しさを検証するのに十分な情報を与えず、教授は残りの部分的な答えを推測し、部分的な答えのために学生に与えるべきマークの量を決定しなければなりません。仕事)。
驚くべきことは、同じ状況が解決したい他の多くの自然の問題にも当てはまる ことです。特定の短い証明が有効かどうかを効率的に検証できますが、答えを見つける効率的な方法はわかりません。これが、複雑度クラスが非常に興味深い理由 です(ただし、これが定義の元の動機ではありませんでした)。何をするにしても(CSだけでなく、数学、生物学、物理学、化学、経済学、管理、社会学、ビジネスなど)、このクラスに該当する計算上の問題に直面します。にある問題の数を知るには、チェックアウトしてください N P N PNP最適化問題の大要。実際、ない自然な問題を見つけるのは難しいでしょう。それは単に驚くべきことです。
は、効率的な検証子を持つ問題のクラスです。つまり
、与えられた解が正しいかどうかを検証できる多項式時間アルゴリズムがあります。
より正式には、決定問題が場合、
すべての入力、verifierと呼ばれる効率的なアルゴリズムがあります。 x
- 場合次に証拠が存在するように、
- もしすべての証明のために、。
答えが「いいえ」の場合、証明を受け入れない場合、検証者は健全であると言います。言い換えれば、答えが本当にNOである場合、サウンド検証者は証拠を受け入れるようにだまされることはできません。誤検知はありません。
同様 に、答えがYESのときに少なくとも1つの証明を受け入れる場合、検証者は完全であると言います。言い換えれば、完全な検証者は、答えがYESであることを確信することができます。
用語は論理と証明システムから来ます。防音システムを使用して、虚偽の陳述を証明することはできません。完全な証明システムを使用して、すべての真実の声明を証明できます。
検証者は2つの入力を取得します。
をのサイズで効率的にしたいことに注意してください。場合は大きい証拠である検証者は、読み取ることができます唯一の多項式部分の。それが証拠が短いことを要求する理由です。が短い場合、がで効率的である と言うことは、がおよび効率的であると言うことと同じです (なぜなら、のサイズはのサイズの固定多項式によって制限されるため)。y y V x V x y y x
要約すると、決定問題が にあることを示すために、健全で完全な効率的な検証アルゴリズムを提供する必要があります。
歴史的注記:歴史的に、これは元の定義ではありません。元の定義では、非決定的チューリングマシンと呼ばれるものを使用しています。これらのマシンは、実際のマシンモデルに対応せず、慣れるのが困難です(少なくとも複雑性理論について学び始めたとき)。私は、多くの専門家が検証者定義をメイン定義として使用し、クラス (多項式時間で検証可能)をV P N P N P 彼らが計算の複雑さの理論の夜明けに戻るなら。検証者の定義はより自然で、概念的に理解しやすく、問題を示すために使いやすいです。
したがって、 = efficient solvableと = efficiently verifiableがあります。したがって、効率的に検証できる問題が効率的に解決できる問題と同じである場合、です。
いずれかの問題があることに注意してくださいでもある与えられた証明が正しければ、あなたがも確認することができ、問題を解決することができ、すなわち場合、:検証はちょうど証拠を無視します!
それは、私たちがそれを必要としないからです。検証者はそれ自身で答えを計算でき、答えが何の助けもなしにYESかNOかを決定できます。答えがNOの場合、証明はないはずであり、検証者は提案されたすべての証明を拒否します。答えがYESであれば、そこにあるべき証拠、実際に私たちは証拠として何を受け入れます。
[検証者が問題の一部のみを受け入れるようにすることもできます。これは、検証者が問題に対して正しく機能することを検証者が少なくとも1つ受け入れる限り、問題ありません。
以下に例を示します。
入力の合計:自然数およびリスト、質問: is?1、⋯ 、N S Σ N I = 1、I = 秒
問題はあります。数値を合計してからと比較できるため、等しい場合はYESを返し、等しくない場合はNOを返すためです。
問題はます。証明とSumの入力を取得する検証者を考えます。上記で説明したアルゴリズムと同じように機能します。これは、Sumの効率的な検証ツールです。
Sumには他にも効率的な検証方法があり、そのうちのいくつかは、与えられた証明を使用する場合があることに注意してください。しかし、私たちが設計したものはそうではなく、それも問題ありません。Sumに対して効率的な検証を行ったため、問題はます。他のすべての問題でも同じトリックが機能するため、 ます。
任意の問題を解決するために私たちが知っている最良のアルゴリズムは、 ブルートフォース / 網羅的検索アルゴリズムです。問題の効率的な検証者を選択し(あると仮定して効率的な検証者がいます)、すべての可能な証明を1つずつ確認します。検証者がそれらのいずれかを受け入れた場合、答えはYESです。それ以外の場合、答えはNOです。
パーティションの例では、考えられるすべてのパーティションを試し、それらのいずれかで合計が等しいかどうかを確認します。
ブルートフォースアルゴリズムは、最悪の指数関数的な時間で実行されることに注意してください。証明のサイズは、入力のサイズの多項式です。プルーフのサイズである場合そこである可能証明。それらのそれぞれを確認するには、検証者が多項式時間を要します。そのため、ブルートフォースアルゴリズムには合計で指数関数的な時間がかかります。
これは、問題はすべて指数時間で解決できることを示しています。つまり、 です。(さらに、ブルートフォースアルゴリズムは多項式量のスペース、つまりのみを使用します が、これは別の日の話です)。
問題はるかに高速アルゴリズムを有することができるが、例えば内の任意の問題多項式時間アルゴリズムを有しています。しかし、任意の問題については、 はるかに優れたアルゴリズムを知りません。言い換えれば、あなたの問題が (そして問題について他に何もない)とだけ言った場合、それを解決するために知っている最速のアルゴリズムは指数関数的な時間がかかります。
しかし、それはより良いアルゴリズムがないという意味ではありません、 私たちはそれを知りません。私たちが知る限り、およびすべての問題は多項式時間で解決できる可能性があります(ほとんどすべての複雑性理論家によって考えられることは非常に少ないと考えられます) 。
さらに、一部の専門家は、私たちはこれ以上改善できないと推測します。つまり、、指数関数的な時間がかかる総当たり検索アルゴリズムよりもはるかに効率的に解決できない問題があります。詳細については、指数時間仮説 を参照してください。しかし、これは証明されておらず、推測にすぎません。これは、任意の問題の多項式時間アルゴリズムを見つけるまでの距離を示しています。
この指数時間との関連付けは一部の人々を混乱させます:彼らは問題は指数関数時間を解く必要があると間違って考えます (あるいはさらに悪いことにそれらのためのアルゴリズムが全くありません)。問題が ということは、問題を解決するのが難しいという意味ではなく、検証しやすいことを意味し、問題を解決する難しさの上限であり、多くの問題はから簡単に解決できます。
それでも、解決が難しいと思われる問題があります。 -hardness について説明するときに、これに戻ります。
、には 多くの自然の問題があり、それらを解決する効率的な方法がわからないことがわかっており、解くのに指数関数的な時間が本当に必要だと思います。これを証明できますか?
残念ながら、下限を証明するタスクは非常に困難です。私たちはできませんでも、これらの問題がより必要であることを証明する線形時間を!言うまでもなく、指数関数的な時間を必要とします。
線形時間の下限の証明はかなり簡単です。アルゴリズムは結局入力を読み取る必要があります。超線形の下限を証明することは、まったく別の話です。たとえば、比較を使用したアルゴリズムの並べ替えなど、検討しているアルゴリズムの種類に関する制限がより高い超線形の下限を証明できますが、これらの制限がない下限はわかりません。
問題の上限を証明するには、十分なアルゴリズムを設計するだけです。そのようなアルゴリズムを思い付くには、しばしば知識、創造的思考、さらには工夫が必要です。
ただし、下限を証明するのに比べて、タスクはかなり単純です。良いアルゴリズムがないことを示さなければなりません。ではない私たちはしていないことを知っている今、何か良い十分なアルゴリズムが、そのいずれかの良いアルゴリズムが存在しないことを、誰も良いアルゴリズムを考え出すないでしょう。これまでにない場合、少し考えてみてください。このような不可能な結果をどのように示すことができますか?
これは、人々が混乱する別の場所です。ここで、「不可能」とは数学的不可能です。つまり、ある天才が将来修正できるというのは、私たちの側の短所ではありません。不可能と言うとき、それは絶対に不可能であり、ように不可能です。科学的進歩がそれを可能にすることはできません。それが下限を証明するときのことです。
下限を証明する、つまり問題が解決するのにある程度の時間が必要であることを示すということは、アルゴリズムは、まだ知らない非常に巧妙なアルゴリズムであっても、問題をより速く解決することはできません。私たちが知っている知的なアイデアはたくさんあります(欲張り、マッチング、動的計画法、線形計画法、半正定値計画、二乗和計画法、および他の多くの知的なアイデア)。1つのアルゴリズムまたはアルゴリズム設計の特定のアイデアを除外するだけでは十分ではありません。まだ知らないものも知らないものも含め、それらすべてを除外する必要があります。そして、これらすべてをアルゴリズムに組み合わせることができるため、それらの組み合わせも除外する必要があります。いくつかのアイデアが難しい解決できないことを示すことに向けて、いくつかの進展がありました欲張りやその拡張などの問題は機能しません。また、動的プログラミングアルゴリズムに関連する作業がいくつかあり、線形計画法の特定の使用方法に関する作業がいくつかあります。しかし、これらは私たちが知っている知的なアイデアを除外することにも近いものではありません(興味がある場合は、制限された計算モデルの下限を検索してください)。
一方 、下限と呼ばれることはありえないという障壁と呼ばれる数学的結果 があり、そのようなものは下限を証明するために使用したすべてのテクニックをほぼカバーしています!実際、多くの研究者は、アレクサンダー・ラズバロフとスティーブン・ルディッヒの自然な証明バリアの結果の後に下限の証明に取り組むことをあきらめました 。特定の種類の下限証明の存在は、暗号化擬似乱数ジェネレータと他の多くの暗号化ツールの安全性を暗示していることがわかります。
私が言うのは、近年、Ryan Williamsが主に バリアの結果をインテリジェントに回避できる進歩を遂げたからです。これまでの結果は、計算の非常に弱いモデルに対するものであり、一般的な多項式時間アルゴリズムの除外にはほど遠いためです。
しかし、私は分かれています。私がしたかった主な点は、下限を証明することは難しく、問題を解く一般的なアルゴリズムには強力な下限がないことです。
[一方、ライアン・ウィリアムズの研究は、下限の証明と上限の証明の間に密接な関係があることを示しています。興味がある場合は、ICM 2014での彼の講演をご覧ください。]
削減の考え方は非常に単純です。問題を解決するには、別の問題にアルゴリズムを使用します。
簡単な例を次に示します自然数のリストの合計を計算し、2つの与えられた数のを返すアルゴリズムとします。を使用して、リスト内の数値をできますか?もちろん!
問題:
入力:リスト自然数、 出力:リターン。
削減アルゴリズム:
- forがから 2.1。
- リターン
ここでは、アルゴリズムでをサブルーチンとして使用しています。私たちはどのように気にしないことに注意してください、それはのような役割を果たし、作品ブラックボックス私たちのために、我々は内部で何が起こっているかを気にしない。サブルーチンをoracleと呼ぶことがよくあります。それはギリシャ神話のデルファイの神託のようであり、私たちは質問をし、神託はそれらに答え、私たちは答えを使います。
これは本質的に削減です。問題のアルゴリズムがあると仮定し、別の問題を解決するためのオラクルとして使用します。ここで効率的とは、オラクルが単位時間内に応答すると仮定して効率的であることを意味します。つまり、オラクルの各実行を単一のステップとしてカウントします。
Oracleは、大きな答えを返した場合、我々はそれを読む必要があり、それは時間がかかることがありますので、我々はそれがかかる時間カウントすべきである私たちをオラクルが私たちに与えられたことの答えを読むために。同様に、オラクルから質問を書いたり質問したりします。しかし、オラクルは即座に機能します。つまり、オラクルに質問をするとすぐに、オラクルは単一の時間単位で答えを書きます。オラクルが行うすべての作業は単一のステップとしてカウントされますが、これは質問を書いて答えを読むのにかかる時間を除外します。
オラクルがどのように機能するかは気にしませんが、それが返す答えだけを気にするので、単純化して、オラクルをアルゴリズムの代わりに問題そのものと見なすことができます。言い換えれば、オラクルがアルゴリズムであるかどうかは気にしません。オラクルがどのように応答するかは気にしません。
たとえば、 上記の質問のは加算関数そのものです(加算を計算するためのアルゴリズムではありません)。
オラクルから複数の質問をすることができますが、質問は事前に決定する必要はありません。オラクルが返す答えに基づいて、自分で計算を実行し、得られた答えに基づいて別の質問をすることができます前の質問。
これを見る別の方法はそれをインタラクティブな計算として考えることです。インタラクティブな計算自体は大きなトピックなので、ここでは触れませんが、この削減の観点に言及することは役立つと思います。
oracle / black boxを使用するアルゴリズムは、通常として示されます。
上記で説明したリダクションは、リダクションの最も一般的な形式であり、ブラックボックスリダクション (別名オラクルリダクション、チューリングリダクション)として知られています。
より正式には:
すべての入力に対してような アルゴリズムが存在する場合、問題は問題に対してブラックボックス還元可能であり、と書くことができます。
言い換えると、oracleをサブルーチンとして使用し、問題を解決するアルゴリズムがある場合です。
リダクションアルゴリズムを多項式時間で実行する場合、多項式時間ブラックボックスリダクションまたは単にクックリダクション (スティーブンA.クックに敬意を表して )と呼び、を記述します。(下付き文字は、Alan Turingに敬意を表して「Turing」の略です )。
ただし、リダクションアルゴリズムがオラクルと相互作用する方法にいくつかの制限を設けたい場合があります。研究されているいくつかの制限がありますが、最も有用な制限は、多対一削減 (別名マッピング削減)と呼ばれるものです。
ここでの考え方は、与えられた入力、多項式時間計算を実行し 、oracleが解決する問題のインスタンスであるを生成するというものです。次に、オラクルに質問し、返ってきた答えを返します。オラクルから単一の質問をすることは許可されており、オラクルの答えは返されるものです。
より正式には、
すべての入力に対してような アルゴリズムが存在する場合、問題は問題に対して多対1で還元可能であり、と書くことができます。
リダクションアルゴリズムが多項式時間である場合、 多項式時間の多対一リダクションまたは単にカープリダクション(リチャードM.カープに敬意を 表して)と呼び、それをます。
この特定の非対話型縮関心がある主な理由は、問題を保存していることです。問題から問題への多項式時間の多対一縮場合、もます。
簡約の単純な概念は、複雑性理論における、、および -complete(後述)とともに最も基本的な概念の1つです。
投稿が長すぎて、回答の制限(30000文字)を超えています。パートIIで答えを続けます。
パートIからの続き。
前のものは、回答で許可されている最大文字数(30000)を超えていたため、2つに分割しています。
OK、これまで、効率的に解決可能な問題のクラス()と効率的に検証可能な問題のクラス()について説明してきました。上で説明したように、これらは両方とも上限です。 驚くほど多くの自然の問題が内部にあることが判明したため、ここでは内部の問題に注目しましょう。
今、ときどき私たちは問題を解決するのが難しいと言いたいです。しかし、前述したように、この目的のために下限を使用することはできません:理論的にはそれらは正確に証明したいものですが、実際には下限を証明することはあまり成功しておらず、一般的には前述したように証明することは困難です上記。問題を解決するのが難しいと言う方法はまだありますか?
ここに完全性の概念があります。しかし、 -completenessを定義する前に、還元についてもう一度見てみましょう。
下限は問題の絶対的な難しさと考えることができます。その場合、削減は問題の相対的な難しさと考えることができます。はよりも簡単だと言って、からへの簡約を行うことができます。これは、削減に使用した概念に暗黙的に含まれています。正式には、削減は問題の部分的な順序を示します。
問題を別の問題効率的に減らすことができれば 、を解決するのはより難しくないはずです。直感は次のとおりです。
してみましょうより効率的に削減することに、すなわち 使用する効率的なアルゴリズムであるして解決します。してみましょう解く効率的なアルゴリズムで。効率的な削減と効率的なアルゴリズム を組み合わせて、を解く効率的なアルゴリズムであるを取得できます。
これは、効率的なアルゴリズムで効率的なサブルーチンを使用できるため(各サブルーチンの呼び出しに1単位の時間がかかります)、結果は効率的なアルゴリズムであるためです。これは、多項式時間アルゴリズムと非常に優れたクロージャープロパティであり 、他の多くの複雑度クラスにはません。
問題の難易度を比較する相対的な方法ができたので、問題の中でどの問題が最も難しいかを尋ねることができますか?このような問題を -completeと呼びます。
-complete問題で最も困難なの問題、
私たちが解決できるかどうか効率的-complete問題を、我々はすべて解決することができます問題を効率的に。
より正式には、決定問題は -complete iffであると言います。
である、及び すべてのため問題、 多対1の既約多項式時間である ()。
完全な問題について考える別の方法は、それらを普遍的なチューリングマシンの複雑なバージョンと考えることです。 -complete問題があるユニバーサル 間と同様の意味での問題:あなたはどんな解決するためにそれらを使用することができます問題を。
これは、特に業界で優れたSATソルバーが重要である理由の1つです。SATは -complete(これについては後ほど説明します)なので、SATを解くための非常に優れたアルゴリズム(できる限り)の設計に集中できます。他の問題を解決するために 、問題のインスタンスをSATインスタンスに変換してから、産業品質の高度に最適化されたSATソルバーを使用できます。
(多くの人が、産業での実用のためにアルゴリズムを最適化するために取り組んでいる他の2つの問題は、整数計画法と 制約充足問題です。あなたの問題と、これらの最適化アルゴリズムを気にするインスタンスによっては、その他。)
問題はの定義に第二の条件を満たした場合 -completeness(すなわち普遍条件)
私たちは、問題の呼び出し -hardを。
硬さは問題が難しいと言う方法です。
私は個人的に -hardnessを普遍性と考えることを好むので、おそらく -universalはもっと正確な名前になっている可能性があります。それらの多項式時間アルゴリズムを見つけることができなかったためです)。
-hard という名前は、 -hard問題は絶対に解決が難しい問題であると誤って考える人をも混乱させます 。私たちはまだそれを知りません、それらが解決する問題と同じくらい難しいことだけを知っています。専門家は考えにくいが、問題はすべて簡単かつ効率的に解決できる可能性があります。言い換えれば、他の問題と同じくらい難しいことは、本当に難しいということではありません。これは、問題が絶対に難しい(つまり、多項式時間アルゴリズムがない)場合にのみ当てはまります。
質問は次のとおりです。
あらゆるある -completeの問題は?
それらのいずれかを知っていますか?
私たちがSATソルバーについて議論したとき、私はすでに答えを与えました。驚くべきことは、多くの自然な問題が完全であることが判明したことです (これについては後で詳しく説明します)。したがって、自然な問題をランダムに選んだ場合、非常に高い確率で、その多項式時間アルゴリズムを知っているか、または -completeであることがわかります。どちらかであることが知られていない自然な問題の数は非常に少ないです(重要な例は整数の因数分解です。同様の問題のリストについてはこのリストを参照してください)。
-complete問題の例に移る前に、他の複雑度クラスに同様の定義を与え、 -completeのような複雑度クラスを定義できることに注意してください。しかし、私が言ったように、 には非常に特別な場所があります。とは異なり、 他の複雑なクラスには自然な完全な問題はほとんどありません。
(自然の問題とは、人々が何らかの点を示すために人為的に定義した問題ではなく、人々が本当に解決に関心がある問題を意味します。本質的に同じ問題が残るように問題を修正できます。SAT の入力に対する答えはNOです。本質的に問題を変更することなく、同様の方法で無限に多くの異なる問題を定義できます。
まず、が -hardであり、 多項式時間の多対1が還元される場合、 も -hardであることに注意してください。私たちはどんな解決することができる使用して問題 、我々は解決することができます使用して自分自身を、私たちはどんな解決することができる使用しても問題!
これは非常に便利な補題です。問題がであることを示したい場合は、すべての問題を削減できることを示す必要があります。。
少し考えてみてください。これを初めて見たときはとても驚くべきことです。すべての問題がSATに還元可能であり、それらがあるという事実以外の問題について何も知らないことを証明できます!
幸いなことに、これを複数回実行する必要はありません。がような問題を示したら、他の問題では難しいので、を削減するだけです。たとえば、が -hardであることを示すには、からへののみを行う必要があります。
OK、完全な問題があることを示しましょう。
注: 次の部分は、最初の読み物では少し技術的かもしれません。
最初の例は少し人工的ですが、直感的にはよりシンプルで便利だと思います。の検証者の定義を思い出してください。すべてを解決するために使用できる問題を定義したいと思います。では、問題をそれだけに定義しないのはなぜですか?
時間制限のあるユニバーサル検証
入力:入力と証明、入力、および2つの数値とを取得するアルゴリズムコード。 出力: 最大で stのサイズの証明がある場合は、ステップの 入力で受け入れられ、そのような証明がない場合は。
私が呼び出されます。この問題を示すために難しいことではありませんされ -hardを:
問題の検証者をます。指定された入力証明があるかどうかを確認するには、とコードをます。 (とは、の実行時間とを探している証明のサイズの上限ですのサイズの多項式によって実行時間と証明のサイズを制限する必要があります。)
(技術的な詳細:実行時間は多項式であり、入力のサイズを少なくともので、バイナリではなく単項表記でを与えます。同様のが単項で与えられます。)
問題自体があることを示す必要があります。が ことを示すために、次の問題を考慮します。
時間制限通訳
入力:アルゴリズムのコード、入力のための、および数。 出力:アルゴリズムあれば、与えられた入力 返すで、ステップ それが戻らない場合はで手順を実行します。
アルゴリズムは、おおよそプログラムのコードと考えることができます。この問題がことを確認するのは難しくありません。基本的には、インタープリターを作成し、ステップ数をカウントし、ステップ後に停止します。
この問題には略語を使用します。
現在、がことを確認するのは難しくありません。入力、、、および与えられた場合、および提案された証明 ; サイズが最大でであるかどうかを確認し、を使用して、およびでステップでがを返すかどうかを確認します。
Universalは少し人工的です。他の問題が -hardであることを示すことはあまり役に立ちません。から削減することは、任意の問題から削減することほど簡単ではありません。より単純な問題が必要です。N P U n i V e r N P
歴史的に、 -completeであることが示された最初の自然問題はでした。S A T
は命題の式が与えられ、充足可能かどうか、つまり命題変数にtrue / falseを割り当ててtrueに評価できるかどうかを確認したいという問題を思い出してください。
SAT
入力:命題式。 出力:が満足できる場合は、そうでない場合は。Y E S φ N O
がことを確認するのは難しくありません。多項式時間で与えられた真理値割り当てで与えられた命題式を評価できます。検証者は、真実の割り当てを取得し、その真実の割り当てに関する式を評価します。N P
書かれる...
SATは -hardです
言及された有用な答え以上に、Michael Sipserによる「計算を超えて:P対NPの問題」を見ることを強くお勧めします。このビデオは、コンピュータサイエンスの主要な教育ビデオの1つとしてアーカイブされるべきだと思います。
楽しい!
スタックオーバーフローに関する同様の質問への私の回答のコピー:
P v。NPなどを技術的に説明することなく説明する最も簡単な方法は、「単語の問題」と「複数選択の問題」を比較することです。
「言葉の問題」を解決しようとするとき、最初から解決策を見つけなければなりません。「多肢選択問題」を解決しようとするとき、選択肢があります。「言葉の問題」と同じように解決するか、与えられた回答のそれぞれにプラグインして、適合する回答の候補を選択してください。
「多肢選択問題」は、対応する「単語問題」よりもはるかに簡単であることがよくあります。候補の答えを置き換えて、それらが適合するかどうかを確認することは、正しい答えを最初から見つけるよりも大幅に少ない労力で済みます。
ここで、多項式時間を「簡単に」取る努力に同意すると、クラスPは「簡単な単語の問題」で構成され、クラスNPは「簡単な複数選択の問題」で構成されます。
P v。NPの本質は、「単語の問題ほど簡単ではない簡単な多肢選択問題はありますか」という質問です。つまり、与えられた答えの妥当性を検証するのは簡単ですが、その答えを最初から見つけるのは難しい問題がありますか?
NPが何であるかを直感的に理解したので、直観に挑戦する必要があります。ある意味で、それらのすべての中で最も難しい「複数選択問題」があることがわかります。「すべての中で最も難しい」問題の1つに対する解決策を見つけると、すべての解決策を見つけることができます。 NPの問題!クックがこれを40年前に発見したとき、それは完全な驚きとして来ました。これらの「最も難しい」問題はNPハードとして知られています。それらのいずれかに対する「単語問題解決策」が見つかった場合、「簡単な複数選択問題」のそれぞれに対する「単語問題解決策」が自動的に見つかります。
最後に、NP完全問題は、NPとNPハードが同時に発生する問題です。私たちのアナロジーに続いて、それらは同時に「複数選択問題として簡単」であり、「それらの中で最も難しいものはすべて言葉の問題として」です。
それらの中で最も単純なのはPであり、多項式時間で解決可能な問題はここに属します。
次にNPが来ます。非決定的チューリングマシンで多項式時間で解決可能な問題はここに属します。
硬度と完全性は、減少に関係しています。問題Aは、ハードの問題Aの場合はC内のすべての問題はAに減少した場合にクラスCのためのNPのためのハード、またはNP困難NP内のすべての問題はAに減少した場合、
最後に、問題がある、完全なそれがある場合、クラスCのために CとハードあなたのケースではC.のため、問題AはNPのための完全な NP内のすべての問題はAに減少し、AがNPである場合、またはNP完全。
NPの説明に追加するために、(決定論的)多項式時間で解を検証できる場合にのみ、NPに問題があります。知っているNP完全問題、SAT、CLIQUE、SUBSET SUM、VERTEX COVERなどを検討してください。「解を得る」場合、多項式時間でその正確性を検証できます。それらは、それぞれ、変数の真理値の割り当て、完全なサブグラフ、数値のサブセット、およびすべてのエッジを支配する頂点のセットです。
基本的には、P vs. NPと計算複雑性動物園のビデオの方がはるかに理解しやすいようです。
問題の本当に大きなバージョンを持つコンピューターの場合:
簡単に解決できます(rubix cube)
難しい -答えを確認するのは簡単(数独)
おそらくこれらはすべてPの問題ですが、私たちはそれを知りません... P対NP。
NP完全NPの問題の多くは、同じ問題に要約されます(数独はリストの新参者です)。
本当に難しい(チェスの次の最高の動き)
編集: NP-hardはビデオではあまり説明されていません(すべてピンク色です)。WikipediaのNP-hard Eulerダイアグラムはこれについてより明確です。
P、NP、NP-completeおよびNP-hardは複雑度クラスであり、問題を解決するアルゴリズムの複雑度に従って分類します。つまり、これらは3つのプロパティに基づいています。
多項式時間で解く:決定論的チューリングマシン(DTM)が多項式の計算時間を使用して解決できる決定問題を定義します。つまり、その実行時間は、アルゴリズムの入力サイズの多項式で上限があります。今回のBig-O表記を使用するとO(n ^ k)
、複雑さはとして定義されます。ここで、nは入力のサイズ、kaは定数係数です。
多項式時間で検証可能な解:正しい解を得るにはより長い時間を必要とする場合でも、多項式の計算時間を使用してDTMが特定の解を検証できる決定問題を定義します。
多項式時間のNP問題を削減します。それらを解決するアルゴリズムを使用して、多項式時間変換ステップ後のNP問題を解決できる決定問題を定義します。
私は最近、NPの問題をNPの困難な問題に還元するためのコードデモを含む、この主題に関する詳細を提供する記事を書きました。問題の複雑性クラス