なぜほとんど(またはすべて)の多項式時間アルゴリズムが実用的ですか?


7

私は最近、論文の興味深いコメントを読んで、数学がいかに奇妙に役立つかを知りました。これは、多項式時間が実際に効率的である必要がないことを述べています(たとえば、は多項式時間ですが、効率的ではありません)。しかし、多項式時間のすべてのアルゴリズムも、多くてもなどのように、現実的であるとは言えませんか?私の質問は次のとおりだと思います:O(n999999999999999999999)O(n4)

  1. これは意外ですか?

  2. 多項式時間であるが実用的ではないアルゴリズムの例はありますか?


本論文では、質問2の例である(ただ定理1.1以下の段落を参照してください。)

3
CS.SEへようこそ!したがって、将来のために、投稿ごとに1つの質問をすることをお勧めします。私たちのサイトはそのようにうまく機能します。とにかく、あなたは見て撮りたいかもしれませんcs.stackexchange.com/q/13202/755cs.stackexchange.com/q/3523/755cs.stackexchange.com/q/45296/755cs.stackexchangeを。 COM / Q / 755分の210cs.stackexchange.com/q/3523/755cs.stackexchange.com/q/10472/755cs.stackexchange.com/q/38219/755rjlipton.wordpress.com/ 2010/10/23 / galactic-algorithms
DW

他のいくつかの例は、線形計画法のいくつかのアルゴリズムです。いくつかの行列乗算アルゴリズム。一部のネットワークフローアルゴリズム。そしてもっと。(コミュニティメンバーへの質問:これは、CS.SEに関する他の質問の重複ですか?)
DW

重複ではありませんが、@ DW?
ラファエル

1
1つの質問に限定してください。重複が非常に多いため、2番目は廃止されました。答えが少ないので削除します。最初の質問は事実ではなく意見を求めているので、私はそれだけで閉じられると思います。コミュニティに決定を任せます:どの質問が優先されますか?これは重複ですか?
ラファエル

回答:


9

コメントが間違っています。まったく実用的でない多項式時間アルゴリズムの例を示すのは非常に簡単です。

  1. 線形プログラムを解くための楕円体アルゴリズムは多項式時間で実行されますが、実行するには遅すぎます。最悪の場合の実行時間が指数関数的であるシンプレックスアルゴリズムが実際に推奨されます。

  2. AKS素数性テストアルゴリズムは多項式時間で実行されますが、実行するには遅すぎます。代わりに、ランダム化された多項式時間アルゴリズムが使用されます。パフォーマンスの確実性を犠牲にします。

  3. 高速行列乗算アルゴリズムは、高校の行列乗算(どちらも多項式)よりも漸近的に実行されますが、実行するには遅すぎます。高校のアルゴリズムが実際に使用されています。

  4. 同様の問題は、高速整数乗算アルゴリズムでも発生します。漸近的な複雑性が最も高いアルゴリズムであるフュラーのアルゴリズムは、実際には使用するには遅すぎます。代わりに、かなり大きな整数であっても、比較的単純なアルゴリズムが使用されます。

  5. ビッグデータアルゴリズムを実用的にするには、線形時間()で実行する必要があります。O(nlogO(1)n)

これらの例は、実用的な多項式時間の識別は正確ではなく、状況に依存する可能性があることを示しています。理論的アルゴリズムの研究者は、自分の研究分野を正当化する必要性を感じているので、あなたが言及するコメントで表現された感情をイデオロギー的に信じています。あなたはそのようなコメントを文字どおりに受け取るべきではありません。

実際、実際に使用されているアルゴリズムの多くはヒューリスティックであり、経験的な結果以外に実行時間の推定値はありません。このようなアルゴリズムは理論上のフレームワークにはまったく適合しませんが、実際には非常に役立ちます。いくつか(すべてではない)の機械学習アルゴリズムは、A *やalpha-betaなどの検索アルゴリズムやSAT解法アルゴリズムと同様に、実行時間パフォーマンスの観点からは言うまでもありません)の点でこのクラスに属します。


1
この乗算アルゴリズムは、フューラーを漸近的に改善します。

6

質問(1)は、私が正当な理由を見たことがないトリッキーな質問です。1つの提案は、単純な問題の解答を理解して見つける可能性がはるかに高く、難しい問題は特別なスキルを身に付けるため、適切な担当者がそれに取り組み、答えを導き出す可能性が低いことです。しかし、これはすべて非常に手を振っています。

(2)については間違いなく例がありますが、実際、この質問はすでに質問され、回答されています!また、他の例があるcstheory.se質問とmath.se質問へのリンクのチェーンがあることにも注意してください。


4

質問(1)について次の説明を見ました。

実行時間におけるのべき乗は、通常、forループまたは同様の構造から生じます。私たちはソルバーとして、問題を分解する方法や、有用なものにインデックスを付ける方法を考えていたため、各forループが順番に必要になります。私たちは通常、少数のアイデアしか使用しないため、力は小さくなる傾向があります。20のforループがネストされたアルゴリズムを想像するのは難しいです。最後のforループ内では、実際に20のインデックスすべてに依存する何かを実行します。n

この議論は私には魅力的ですが、forループのみを扱うため、非常に弱いです。たとえば、再帰を使用して入れ子になったforループをいくつでも簡単に作成できますが、そのような奇妙な構成を行わない理由を見つけることができます。いずれにせよ、この議論は多くの異なるケースを分析することで強化できると思いますが、私は高レベルのアイデアだけを提示します。

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