私はC++を使用しています.40のユーザー名を格納したいとします。単純に配列を使用します。しかし、私が40000のユーザ名を保存したいのであれば、これはまだ検索速度に関しては良い考えですか?この速度を向上させるにはどのデータ構造を使用する必要がありますか?データ構造の選択
データ構造の選択
答えて
挿入および削除の要件を指定する必要があります。シーケンス内の任意の場所に物事を取り除いて挿入する必要がありますか?
また、なぜ順番に検索する必要がありますか?ハッシュテーブル参照に適していない検索を行っていますか?
現在、私はdeque
またはlist
を提案しています。多くの場合、アルゴリズムの最も簡単な実装を実現するインタフェースを備えたコンテナを選択し、パフォーマンスが不十分で必要なスピードアップが得られる場合にのみ選択肢を変更することをお勧めします。
vector
には2つの主な利点がありますが、頻繁なコピーを防止するためにベクトルが過剰に割り当てられ、オブジェクトが連続して格納されるためシーケンシャルアクセスが高速になる傾向があります。これらはまた、その短所です。成長するベクターには再配置とコピーが必要であり、ベクターの終わり以外の場所からの挿入や除去にもコピーが必要です。連続したストレージは、軽度のメモリ断片化であっても満足することが難しいため、多数のオブジェクトまたは大きなオブジェクトを持つベクタには問題が発生します。
list
は、連続した記憶域を必要としませんが、通常、リストノードは2つのポインタ(ほとんどの実装で)のオブジェクトごとのオーバーヘッドを持ちます。これは、非常に小さいオブジェクトのリスト(例えば、ポインタのリストでは、各ノードはデータアイテムの3倍のサイズである)において重要であり得る。リストの途中からの挿入や削除は非常に安く、リストノードは作成したメモリに移動する必要はありません。
deque
は、チャンクストレージを使用するため、ベクターに似たオブジェクトごとのオーバーヘッドは低くなりますが、断片化されたメモリスペースでは同じ問題が発生しません。それはしばしばコレクションのための非常に良い選択であり、しばしば見落とされます。
std :: vectorとstd :: listはこのタスクに適しているようです。手前のレコードの最大数がわかっている場合は、配列を使用できます。
std :: listは、ベクトルまたはデキューよりもオーバーヘッドが大きいため、順次アクセスのみが必要な場合は悪い選択です。リストは、中央の挿入/削除が必要な場合にのみ適しています。 –
私はハンドヘルドデバイスでリストをテストしました。リストには70,000個の文字列が含まれていました私は収集し、データを徐々に検索しなければならなかった。検索は**非常に**高速でした。私はベクトルとマップもテストしました。さて、私の場合はリストが勝った。それは実際には*解決*依存問題です。 –
私はメモリオーバーヘッドを意味しました。もちろん、アイテムごとの追加配分が手頃であればそれは心配ではないので、おそらく「悪い選択」がそのケースを誇張しているかもしれません。しかし、あなたが使っていないものを支払っているので、それを「適切なコンテナ」と呼ぶのは正しいとは思いません。 –
おおまかに言えば、vector
からlist
を好むか、Cスタイルの配列を禁止します。
ベクトルが塗りつぶされたら、sort
アルゴリズムを使用して正しく順序付けされていることを確認します。 find
,binary_search
またはlower_bound
のいずれかを使用して、特定のレコードを検索できます。 find
を使用するようにソートする必要はありません。
リソースが制約された環境(埋め込みプラットフォーム、電話機など)を使用している場合を除き、真剣です。 std::map
を使用して、並べ替えや検索をする手間を省き、コンテナにすべての処理をさせます。これはソートされたツリー構造、おそらくバランス(例:Red-Black)の可能性があります。これは良い検索パフォーマンスが得られることを意味します。データのサイズが1つまたは2つのポインタのサイズに近い場合を除き、選択するデータ構造のメモリオーバーヘッドは無視できます。あなたのグラフィックカードにはおそらくあなたが考えているデータのために使い果たしようとするより多くのメモリがあります。
他の人はあなたが/データを削除(=>リスト)を挿入する必要があるかどうかに応じて、map
使用std::vector
またはstd::list
を使用したくない場合は、バニラの配列を使用するには非常に少ない良い理由がある言ったようにしませんか(= >ベクトル)
実際にすべてのデータがメモリに必要な場合は、sqlite経由でディスクに保存することをお勧めします。また、メモリアクセスの場合はsqliteを使用してください。それはあなたのデータで何をする必要があるかによって異なります。
- 1. データ構造の選択
- 2. デザインアプローチとデータ構造の選択
- 3. angular.jsの選択/非選択ツリー構造
- 4. 選択句のループ構造
- 5. ガイダンスデータベース構造/エンジンの選択
- 6. 類似のデータ構造に対するMongoDBコレクション構造の選択
- 7. 構造化XMLデータに加えて行データを選択する
- 8. VB.NETでのデータ構造の選択と比較の比較
- 9. リソース割り当て決定ツールのデータ構造の選択
- 10. ベスト・インテグリティ・セットを選択するためのデータ構造とデザイン
- 11. NoSQL Firebaseとクエリでフィールドのサブセットを選択するデータ構造
- 12. 複数のmysqlテーブルから同じインデックスを共有するデータ構造を選択してデータ構造を持たないデータを選択する
- 13. 弾性データ構造BIデータ構造
- 14. iOS CFデータ構造とNSデータ構造
- 15. 要素の効率的な挿入のためのデータ構造の選択
- 16. ExtJS階層選択 - 複数の選択フィールドを持つデータ構造のようなツリーを持つカテゴリセレクタ
- 17. R:data.frame(または他のデータ構造)での高速乗算選択した行
- 18. mysql - 構造が異なる複数のテーブルからデータを選択
- 19. ランダム要素を選択するためのデータ構造ですか?
- 20. どのデータ構造を選択する必要がありますか? [Androidディクショナリ]
- 21. ハッシュテーブル(データ構造)
- 22. データ構造リンクリスト
- 23. Webserviceデータ構造
- 24. データ構造
- 25. データ構造
- 26. データ構造
- 27. チュートリアル - データ構造
- 28. 構造データNoSQL
- 29. Perlデータ構造
- 30. データ構造
なぜあなたは配列を使用するのかわかりません - サイズは問題ではありません。 –