web-dev-qa-db-ja.com

本当に効率的なアルゴリズムが必要ですか?

今日のコンピューターが非常に高速であるのに、なぜ人々がアルゴリズムとその効率を研究することに時間を費やしているのかを尋ねたいと思います。

答えを出そうとすると、今日のコンピュータは確かに速いので、私の仮定は近視眼的かもしれないと思いましたが、そもそもアルゴリズムを研究していなければ、それほど速くはありません-おそらくいくつかありますコンピュータが依存する低レベルのアルゴリズム(計算などを担当するアルゴリズムなど)。

しかし、O(n ^ 2.81)(Strassen Algorithm)でO(n ^ 3)よりも行列を乗算できるかどうかが問題となる実際の状況を想像することはほとんどできません。コンピュータ科学者や数学者は、楽しみのために/好奇心から/そのようなアルゴリズムを研究しているので、元の論文のトピックがありますか、それとも素朴なアルゴリズムが遅すぎてより効率的なアルゴリズムが必要な実際の状況がいくつかありますか?

2
Doz

TL; DRO(n ^ 2.81)は、O(n ^ 3)と比較して小さなゲインのように見えるかもしれませんが、データセットが大きくなるにつれてその差が大きくなります非常に大きく、非常に速くなります。

Webページの読み込みに1〜2秒ではなく5〜6秒かかるとどう思いますか。 Googleマップが5〜10秒ではなく、20〜30秒で最適なルートを考え出した場合はどうでしょうか。

宇宙を遠くへ移動して、1度ずれているとどうなるか考えてみてください。少しでも離れていると、目標からどれだけ離れているかが大幅に増える可能性があります。あなたがより遠くに行く必要があるほど、あなたは目標から遠くなるでしょう。

大量のデータを処理する場合は、効率的なアルゴリズムが重要です。指数関数的に成長するものは、信じられないほど速く成長します。指数が高いほど、成長は速くなります。何十億ものレコードを扱うとき、これは本当に重要になり始めます。

小さなデータセットの場合、先制的に最適化することは悪いことと考えられています。プログラムが最も処理時間を使用している場所がわかるまで待って、そのコードを最適化することになっています( 80-20ルール を参照)。

merge sortbubble sort のようなものを見て、効率的なアルゴリズムと非効率的なアルゴリズムの大きな違いに気づいてください。

4
yitzih

コンピュータ科学者や数学者は、楽しみや好奇心から抜け出すためだけにそのようなアルゴリズムを研究していますか?それで、彼らには独自の論文トピックがあるのですか、それとも実際の状況で、単純なアルゴリズムが遅すぎてより効率的なものが必要なのですか?

効率は、funcuriosityにとって重要ではありませんが、一般的なソフトウェア開発よりも頻繁にコンピュータサイエンスの問題を解決できることが重要です。 。

コンピュータがO(n)のような計算を行うのに十分速いのは事実ですが:

_List x = [1,2,3,4,5,6]
print [i for i in x]
_

O(n^2)O(n log(n))のような複雑なアルゴリズムがあると、拡張性の問題に直面することがあります。反復処理を行っているデータセットまたは展開に対して計算を行っている場合、計算に時間がかかります。したがって、時間の複雑さをたとえばO(n)からO(log n)に削減できるアルゴリズムを見つけることができれば、より大きなデータセットでより大きな違いを見ることができます。

たとえば、これを参照してください。

enter image description here

緑の領域にできるだけ近いアルゴリズムを試してみたいと思います。

複雑さがコンピュータサイエンスの大きなトピックである大きな理由の1つは、複雑さのクラスPNPがあり、_P = NP_かどうかを証明しようとしているためです。これは大したことではないように思われるかもしれません。プログラミングの文脈で;しかし、暗号化のような概念を扱う巨大な取引になります。

実際のシナリオでは、巡回セールスマンの問題であるO(2^nn^2)を考えてみましょう。この問題はポリノメール時間(P)では解決できず、アルゴリズムがまだないため、NP問題のクラスに属しますPでそれを解決します。ただし、Pで解決される調査と解決策がある場合は、他のアルゴリズムに適用できる多くの影響があります。

また、ソートアルゴリズムを確認する価値もあります。たとえば、バブルソートの複雑さはO(n^2)ですが、最悪のヒープソートのようなソートにはより良いアルゴリズムが見つかりました。ケースO(n log(n))

3
Toby

実際の最適化の問題の多くは、CPUに費やすCPU時間によって制限されます。場合によっては、バッチモードで負荷の高いクランチを実行できるため、問題は少なくなりますが、それが常にオプションとは限りません。実際の例:必要な部品のリストがあり、場所A、B、Cに欠陥がある部品を切り取るための木材があります。どのようにして最良の結果を得ることができますか? (まだ他の木材を見たことがないので、完璧な答えはありません。)カメラが木材の分析を終了してから、木材をのこぎりに押し込む準備ができるまで、2秒ほどかかります。 6万ドルの機器をアイドリングしているよりも時間がかかります。

一方、機械が年間6桁の木材を伐採している場合、予測の精度を少しでも向上させることは非常に価値があります。

2
Loren Pechtel

これらの最適化が必要とされる実際の状況はたくさんあり、あらゆる種類のシミュレーション(核、天文学、医学、物理学など)が最初に思い浮かびます。

また、スプレッドシートの計算が10秒速く、ビデオが4時間ではなく3.5時間でレンダリングされるため、単純な生産性の向上についてはどうでしょうか。銀行は数百万のトランザクションを15分速く処理します。

また、ビデオゲームが十分に高速であるため、コマンドの実行が0.4秒ではなく0.2秒遅れるなど、「非生産的」なメリットがあります。

90%を超える使用率で(継続的にではなく)実行されているCPU/GPUコアは、もっと欲しいであることを証明しています。

2
Jan Doggen

複雑さの研究の多くは、実際よりも数学的なものです。多くの場合、「効率の高い」アルゴリズムよりも「効率の低い」アルゴリズムの方が多くのメリットを得ることができます。行列を10 ^ 3ミリ秒で乗算するか、1000000×10 ^ 2.81ミリ秒で乗算するか。

また、多くの場合、アルゴリズムが長く、複雑で繊細な証明に依存するアルゴリズムよりも、明らかにがアルゴリズムに適していることが望ましいという事実もあります。心配することが1つ少なくなります。

そのため、多くの場合、並列処理によって定数係数を改善するか、コードレベルでの設計を改善する方が適切です。

しかし一方百万の行と列を持つ行列を扱っている場合、nの力は真の意味を持ち始め、n ^ 2.81より複雑なステップはより少なくかかるかもしれませんn ^ 3個の単純なものよりも時間。

1

効率はこれまで以上に正確に重要ですなぜならコンピュータのパフォーマンスが向上したからです!ハードウェアは高速化されましたが、同時に使用可能なメモリと帯域幅も同様に増加しました。

使用可能なリソースを使用する傾向があるため、メモリを10倍に増やすと、プロセッサは10倍の作業を行う必要があります。使用可能なメモリに対してO(n)操作を実行する場合、プロセッサ速度とメモリの両方が10倍に増加すると、同じ時間がかかります。ただし、複雑さがO(n )、プロセッサとメモリの両方を10倍に増やすと、操作が大幅に遅くなります。

したがって、効率的なアルゴリズムが実際に重要になるほど、コンピューターのパフォーマンスが向上します。

1
JacquesB

多くのソフトウェアがひざまずくでしょう。辞書へのアクセスを一定の時間ではなく線形に変更した場合。グラフィックアルゴリズムを変更して、一度に1ピクセルを描画します。

十分に悪いコードを処理するのに十分な速度のコンピュータはありません。

0
gnasher729