0

「オプション」(スキルなど)の固定された一定のセットがあると想像してください。すべてのオブジェクト(人間など)には、オプションがある場合とない場合があります。

すべてのオブジェクトのオプションのメンバーリストを維持し、オプションで埋める必要がありますか?

また:

各ビットがそれぞれのオプションの取得済み(または未取得)ステータスを表すビット配列を使用する方が効率的(高速)ですか?

-編集:-

具体的には、スキルのリストは文字列(オプション名)のベクトルであり、256よりも確実に短くなります。目標は、プログラムを可能な限り高速にすることです(メモリの問題はありません)。

4

3 に答える 3

2

それはむしろ依存します。オプションの数が少ない場合は、いくつかのboolメンバーを使用してそれらを表します。リストが大きくなると、両方のオプションが実行可能になります。

  • ビットセット(オプションをシンボリックに表すのに適しenumています)は、一定の非常に小さなスペースを必要とし、特定のオプションを取得するにはO(1)時間がかかります。
  • オプションのリスト、またはむしろstd::setそれらのリストはunordered_set、スペース効率が高い場合がありますが、オプションの数が膨大であり、オブジェクトごとに設定されるオプションの数が非常に少ない場合に限ります。

疑わしい場合は、多数のboolメンバーまたはを使用してbitsetください。プロファイリングでオプションの保存が負担になることが示された場合にのみ、動的リストまたはセット表現を検討してください(それでも、設計を再検討することをお勧めします)。

編集:256未満のオプションでは、bitset最大64バイトかかります。これは、メモリと速度の点で、リストやセットの表現を確実に上回ります。通常、バイトへのアクセスはビットへのアクセスよりも高速であるため、 sの束bool、またはの配列でさえも高速である可能性があります。unsigned charただし、構造のコピーには時間がかかるため、いくつかのオプションを試して結果を測定してください。YMMV。

于 2011-08-15T18:16:01.957 に答える
1

1回の操作で人に複数のスキルが存在するかどうかをテストする場合は、ビット配列を使用する方が高速です。

オプションのリストを使用する場合は、一度に1項目ずつリストを調べて、スキルセットが終了するかどうかを確認する必要があります。これにより、明らかに時間がかかり、多くの比較操作が必要になります。

于 2011-08-15T18:11:44.740 に答える
0

ビット配列は、一般的に編集と検索が高速になります。必要なスペースについては、計算を行うだけです。オプションのリストには、動的なサイズの配列が必要です(オプションのセット自体にいくらかのオーバーヘッドがかかります)。ただし、オプションの数が多い場合、(通常は)少数のオプションのみが設定されていると、オプションが小さくなる可能性があります。

于 2011-08-15T18:12:00.087 に答える