2つのアルゴリズムの比較にランタイムではなく比較を使用する理由


19

いくつかのCS研究論文では、2つのアルゴリズムの効率を比較するために、実際の計算時間自体ではなく、アルゴリズムの主要な比較の総数が使用されていることに気付きました。両方のプログラムを実行し、アルゴリズムの実行に必要な合計時間をカウントすることで、どちらが優れているかを比較できないのはなぜですか?


ようこそ!そのような論文のほとんどがランタイムを使用しないことを願っています。しかし、特に応用されたコミュニティや、考慮されたシステムが非常に複雑な場合に、一部の人がそうすることを知っています。
ラファエル

回答:


14

これは実際には、いくつかの方法論的で実用的な答えがある深い問題です。手元のアルゴリズムについて何か知りたいと思います。特定の入力で特定のマシンでどのアルゴリズムがより適切に機能するかを知りたい場合は、実行時間を測定してください。特定のアルゴリズムのコンパイラの品質を比較する場合は、先に進み、ランタイムを測定します。アルゴリズムについて何かを学ぶために、それをしないでください。

まず、ランタイムを使用するのが良い考えではない理由をいくつか説明します。


  1. 1つのマシンで1つの言語と1つのコンパイラを使用して測定される汎用性ランタイムは、コンポーネントを変更してもほとんど意味がありません。同じアルゴリズムのわずかに異なる実装でも、場合によってはコンパイラの最適化をトリガーしますが、他のコンパイラでは最適化をトリガーしないため、実行が異なる場合があります。
  2. 予測
    したがって、いくつかの入力に対していくつかのランタイムがあります。他の入力の実行時間については何がわかりますか?一般に、何もありません。
  3. 重要性
    通常、すべての入力(ある程度のサイズ)のベンチマークを行うことはないため、アルゴリズムを比較する能力はすぐに制限されます。または、入力が小さすぎて実行時の動作を示さなかった可能性があります
  4. 計量
    計測ランタイムを良くすることは容易ではありません。JITはありますか?競合がありましたか?つまり、アルゴリズムが実行されなかった時間をカウントしていますか?別の実行(他のアルゴリズムの)、特に並行プロセスとキャッシュで、まったく同じマシン状態を再現できますか?メモリレイテンシはどのように処理されますか?

ランタイムはアルゴリズムを比較するための恐ろしい尺度であり、アルゴリズムランタイムを調査するための一般的で抽象的な方法が必要であることをこれらが納得することを願っています。

質問の2番目の部分に進みます。比較または同様の基本演算を使用するのはなぜですか?

  1. 分析の扱いやすさ
    正式な分析を行うには、それを実行できる必要があります。個々のステートメントを数えることは非常に技術的であり、時には難しいこともあります。それにもかかわらず、一部の人々はそれを行います(例:Knuth)。一部のステートメント(ランタイムを支配するステートメント)のみをカウントする方が簡単です。同じ理由で、最悪の場合のランタイムを「のみ」調査します(上限)。

  2. 優位
    選択した操作ランタイムを支配します。それは、それが最もランタイムに貢献することを意味するものではありません-ワードサイズの整数をソートするときのクイックソートなどでは、比較は明らかに貢献しません。しかし、それらは最も頻繁に実行されるため、それらをカウントすることにより、アルゴリズムの最も実行された部分が実行される頻度をカウントします。したがって、漸近ランタイムは、支配的な基本操作の数に比例します。これが、比較のみをカウントする場合でも、ランダウ表記と「ランタイム」という言葉を使用することに慣れている理由です。

複数の操作をカウントすると便利な場合があることに注意してください。たとえば、一部のQuicksortバリアントは、他のものよりも多くの比較を行いますが、スワップは少なくなります(平均)。

価値のあることについては、すべての理論を実行した後、理論が行う予測が適切であることを確認するためにランタイムを再検討することができます。そうでない場合、理論は(実際には)有用ではなく、拡張する必要があります。メモリ階層は、重要ですが、基本的な分析では欠落していることを最初に認識することの1つです。


1
フォーマル分析にも限界があることに注意してください。たとえば、不均一な入力分布の平均的なケースは、しばしば扱いにくいです。
ラファエル

10

これは、アルゴリズムを実行する合計時間が、他の要因とともに実行されるハードウェアに依存するためです。一方がPentium 4で実行され、もう一方がCore i7で実行されている場合、2つのアルゴリズムを比較することは信頼できません。これだけでなく、同じコンピューターで両方を実行したとしましょう。どちらも同じプロセッサ時間を持っているとはどういうことですか?あるアルゴリズムのプロセスよりも他のプロセスの優先度が高い場合はどうなりますか?

これを乗り越えるために、この全体の時間から切り離して完了し、代わりにアルゴリズムのスケーリングに基づいて比較します。あなたは、研究論文でO(1)またはO(n ^ 2)などの表記に気づいたかもしれません。興味のある人はBig O表記を参照してください。


1
また、実際の実行時間は、アルゴリズムを実行するために使用される実際の入力のサイズと内容によって異なります!
伊藤剛

7

他の回答では、基本操作の数に関してランタイムを分析する理由を説明しているため、比較が多くの(すべてではない)ソートアルゴリズムの正しいメトリックである理由をいくつか説明します。

  • 多くのソートアルゴリズムでは、比較の数が実行時間を支配します。つまり、少なくとも他の基本操作と同じ数の比較が実行されます
  • 比較は高価な操作です。ライブラリでのソートルーチンの実装方法について考えてください。sort関数には、要素の配列と2つの要素を比較する関数へのポインタが渡されます。一般に、比較関数の呼び出しと実行の待機は、「内部」操作よりもコストがかかります。この機能はユーザーによって提供されるため、最適化するのは困難です
  • (これが一部の理由である場合もそうでない場合もあります)シーケンスをソートするのに十分かつ必要な比較の数について興味深いことが言えます。最悪の場合、平均してさまざまな分布でこれを行う方法、未知の分布からサンプリングされたiidアイテムで実行されるときに最適に収束するアルゴリズムを設計する方法も知っています(自己改善アルゴリズム)。いくつかの比較が無料で提供されているときにこれを行う方法を知っています(部分情報でソートする

1)「少なくとも他の基本演算と同じ数の比較が実行されます」-定数ファクターまで。2)「比較は高価な操作です」-一般的な設定を前提としています。整数ソート(通常は分析される)の場合、スワップは通常より高価です。
ラファエル

承知しました。opは、一般的なアルゴリズムの分析について混乱しているようで、一定の要因をもたらすことを望まなかった。標準ライブラリのソート・ルーチン整数ソートされていない-私は、一般的な設定について話していたという事実は、説明から明らかであると思います
Sashoニコロフ

OPソーは間違いについてのソートアルゴリズム整数専門されていないことに加えて論文、そこに比較の誰カウント数
Sashoニコロフ

@Raphael小さな整数のソートは、実際には一般的な問題ではありません。世界で行われているほとんどの並べ替えは、文字列(長さなど)に基づいて行われます。整数の並べ替えの場合でも、スワップがより高価であるかどうかは正確ではありません。分岐は、現代のハイエンドプロセッサでは比較的高価な操作であり、分岐予測は並べ替え時にほとんど役に立ちません。
ジル 'SO-悪であるのをやめる'

@Gillesそれ自体、スワップは私が知っているどのプラットフォームよりも整数比較よりも高価です。分岐予測ミスなどの「二次」コストは間違いなく要因であり、その影響は進行中の研究の対象です。(実際の使用に関しては、修飾されたステートメントを作成することはできません。ただし、標準ライブラリメンテナーは、プリミティブデータ型に使用するソートアルゴリズムを改善し続けているため、多くの(ab)使用が想定されます。)
Raphael
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.