ゲームプログラミングでソートアルゴリズムをプログラムする方法を知る必要がある重要なケースはありますか?[閉まっている]


7

まあ、私はウィキペディアでアルゴリズムをソートすることについて少し読んだことがありますが、特にアルゴが他のアルゴよりも速いいくつかのケースを扱う場合、主題は広大に見えます。

簡単に要約する必要があるかもしれませんが、その前に、並べ替えが必要なゲームプログラミングの主題があるかどうか誰かに教えてもらえますか?(またはオプションで、実行時間は重要です)。

たぶん深度バッファにあるのでしょうか?

回答:


19

質問のとおりに言いますが、重要な注意事項があります。

はい、プログラミングゲーム開発で物事を分類する方法を知る必要があります。さまざまな状況で、さまざまな並べ替えが行われます。いいえ、さまざまな並べ替えアルゴリズムのすべて(または多く)がどのように機能するかについての詳細を知る必要はありません。必要な場合は、参照(オンラインまたは本)でそれを検索するだけでほとんどの場合十分です。

重要なのは、各アルゴリズムの方法と理由ではなく、状況によっては一部のアルゴリズムがより適切に機能する理由を深く理解することです。それはあなたがどのような状況にあるかを正確に理解しています(インプレースでソートする必要がありますか、リストにアイテムを安く挿入できますか)。それは、最も一般的で柔軟なアルゴリズムを知っており、それらがどのように機能するかについての詳細ではなく、それらが使用されるべきではない状況を知っています。

そして最後に、並べ替えのパフォーマンスが重要なとき(アイテムが多く、多くのアイテムを並べ替える必要があるとき)とそれほど重要ではないとき(アイテムが少なく、並べ替える必要があるとき)です。リストが変更されたとき)。後者の場合は、クイックソートでリストを投げるだけです。オブジェクトが大きい場合は、オブジェクト自体ではなく、オブジェクトのインデックスのリストを並べ替えます。私が専門的に開発してきた過去数十年の間に、もっと調整された、または特定のソートアルゴリズムが必要だった回数を数えることができ、それはおそらく20未満です。


2
調整された特定のアルゴリズムのリストをソートしましたか?
slf 2010年

9

はい、あなたはいつも物事を分類します。一般的な例の1つは、グラフィック呼び出しです。

すべての並べ替えアルゴリズムを頭の中で実行する方法を知る必要があるかどうかは別の質問ですが、少なくとも次のような質問に答えることができるはずです。

  • 最小限のスタックオーバーヘッドでインプレースソートが必要な場合、どのようなソートを使用しますか?(反復または末尾再帰クイックソート。)
  • どうすれば文字列の大きなリストをできるだけ速くソートできますか?(アーキテクチャに応じて、Burstsort、基数ソート、またはクイックソート。)
  • これらのアセットを依存関係順に並べ替えるにはどうすればよいですか?(トポロジカルソート。)
  • 一部の不明なデータを適切な方法で並べ替える必要があるだけですか?(Timsort、quicksort。)

これらの状況はすべて、ゲームを含むあらゆる種類のソフトウェアで発生します。

繰り返しますが、これらすべてを記憶する必要はありませんが、並べ替えアルゴリズムの本を開き、それぞれの簡単な説明を読んで、適切なものを選択できる必要があります。これは、時間とスペース(big-O)の要件を理解し、さまざまなソートアルゴリズムがどのように機能するか(マージ、選択、スワッピング)を把握することを意味します。

並べ替えアルゴリズムは就職の面接でも際立って機能します。通常、質問は「クイックソートの実装」ではなく、「入力の種類の説明です。これにはどのソートアルゴリズムが適していますか?」


5

実行しているゲームプログラミングの種類によっては、並べ替えが必要になる場合がたくさんあります。

  • 描画する前に、不透明なオブジェクトをカメラからの距離で並べ替える(リバースペインターのアルゴリズム
  • 透明な三角形をカメラからの距離で並べ替えてから、逆の順序で描画します。
  • (AIで、または自動化されたヒントを与えることで)目標を達成しようとする賢明な順序を理解するためのトポロジー的な目標依存グラフ。
  • 高速な衝突テストのために、いくつかの座標に沿ってオブジェクトを並べ替えます。
  • イベントを時間順にソートして、次に処理するイベントを特定します。
  • オブジェクトを一意のIDで並べ替えて、比較またはシリアル化のための正規の順序を取得します。
  • プロファイリング統計を並べ替えて、最適化するのに最も利益をもたらす領域を特定します。

独自のソートアルゴリズムを実装する必要があることはまれです。通常、ライブラリから適切な関数を選択するだけです。しかし、ソートアルゴリズムの学習と記述は、アルゴリズムの記述と分析に適した一般的な方法であり、ライブラリから優れたアルゴリズムを選択する場合や、問題の特別な機能が意味する(まれな)ケースを見つける場合に、知識が役立ちます。ジェネリックライブラリルーチンを改善することができます。



1

ほとんどの言語には、優れた汎用クイックソート実装が付属しています。

それらは必ずしも安定したソートの実装、値を直接比較しないソート、事前にソートされたデータで使用しても影響を受けないソート、ディスクベースのデータでうまく機能するソート、与えられた大量のメモリ、追加のメモリをまったく必要とせずに機能する並べ替え、データのサブセットのみを効率的に並べ替える部分的な並べ替え、ピボットしきい値に対してデータのみを並べ替えるパーティションなど。

これらは時々役に立ちます。


-1

より一般的な答えとして、実際に「フィールド」で独自の並べ替えアルゴリズムを作成したことがない場合でも(結局のところ、Wikipediaで見たことがあると思いますが、平均的な園芸品種の並べ替えはすでに解決済みの問題です)、並べ替えは、プログラマーが必要とする種類の計算の考え方を支援する、コンピューターサイエンスの主要な側面の1つです。それを空手にも使えると気付く前に学ぶ「ワックスオン、ワックスオフ」と考えてください:)


1
「あなたの平均的な園芸品種の選別は、すでに解決されている問題です」-本当にそうではありません。Timsortは最近2002年、2003年にバーストソートなどで発明されました。90年代初頭にCSの研究を始めて以来、「ソートは解決された問題」と聞いていました。

結構です、ジョー。「garden-variety」が意味するのは、たとえば、100未満のアイテム(ハイスコアテーブルまたはインベントリアイテムリストにある)のリストのような単純な目的のためには、たくさんの最適化; クイックソートやバブルソートでも問題なく機能し、そのために最先端のソートアルゴリズムを使用する必要はありません。
Ian Schreiber

実際、これらの場合、アイテムごとのコストの観点から、クイックソートは非常に恐ろしいものです。多分あなたのプログラムの壮大な計画では、あなたはそれを1日1回ソートするだけで速くそれをする必要がないので問題ではありませんが、私が言うなら、10アイテムの1000リスト(すべてのオンラインプレーヤーのインベントリアイテム)があるとしたらMMO、たとえば)、クイックソートを1000回適用することは、考えられる最悪のソリューションの1つです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.