質問

たいと思い店舗のマッピングの integer キー float 価値-。

私は約130万キーにおいて、130百万値)。

私はルックアップ性能--いい、多くの、多くの単位百万ルックアップ

C++STL図書館は、 map クラスのための連想配列の並べ替えができます。私はいくつか質問 map.

どの貯蔵のオーバーヘッド map のためのデータセットのサイズを記載しますのでご注意ください。▼どのような保管費の規模で一般的に、 map?

のようになると、元のデータ構造 map 赤-黒のバランスのバイナリーです。そのような実世界 性能 ここでは O(log n) のための挿入および検索。

て言及した O(1) のための示唆挿入出来ます。私の入力が事前にソートされうべきではないかと思いを提供できるヒントで挿入す。方法を教えてください提供するヒントを使用方法に上場 こちらの?

はありまSTLコンテナを提供するより良いルックアップ実績を教えてください。

については、その公開可能であり、オープンソースの枠組みにとの配列クラスを使用する配下のデータ構造がどのように絡んでいるのかを調べSTL map?

述する場合は、それ自分のコンテナクラスをルックアップ性能はどのようなデータ構造がん研究から生まれたのでしょうか?

を使用していGCC4このようなことが、明らかにLinuxまたはMac OS Xで動作します。

会員の方はログインしてくだ事前に作成されている場合は、ダムです。ご要望ありがとうございました.

役に立ちましたか?

解決

れんれん非常にハードの使用 std::vector<pair<int, float> >, 使用 std::lower_bound, std::upper_bound, よび/または std::equal_range 見上げる値です。

ながら、 正確な のオーバーヘッド std::map ではありあっていな部屋のための質問では、通常、消費メモリ 見上げ値上がりが遅バイナリ検索によるベクトルの役割を果たします。また、通常、(ほとんどやむを得ず実施してある種のバランスツリーに対す架空のヒントとのバランス情報通手段の各ノードに割り当ては別途です。からノードを可愛らしい小(通常は8バイト)の追加データが少なくともどん実際に保管(少なくとも100%架線)です。別の配分がい貧しい地域の参考に、広く使われるようになってきキャッシュす。

ほとんどの実装の std::map 利用の赤-黒ツリーです。またのために使用 std::map, を使用する実装では、すAVLツリーうに合わせて目的により、AVL木は、やや強制約とのバランスの取れた.これにより少し速いルックアップに若干遅くなり挿入と削除"からの再バランスが維持強化の解釈のバランスのとれた").どのデータは一定時に利用し std::vector はまだほとんどあります。

一つの可能性には注目に値:場合キーを少なくとも かなり ものを配布するために久しぶりに会う幼なじみや同級生までを補間の代わりに二分.すなわちわずからのベクターのみなさん、線形補間推最も可能性の高い開始ポイントルックアップ.もちろん、場合にキーフォロも知られる非線形分布をお使いいただけますのでマッチング補間です。

を想定したキーを合理的に均一に分布する(または少なくともフォロの一部を予測可能なパターンの観光の拠点には最適な立地への補間の補間検索は、複雑さのO(log N)130百万円のキーとした場合、周辺の4つのプローブ探し項目が異なる場合もあります。-いは大幅に改善することにより、通常/非絶)ハッシュが必要となり良いアルゴリズムを続けるために必要なの負荷係数の極めて低い(通常は約75%であるま択することを許容する必要があるという32百万円の追加(空)スポットを表向上の複雑さからプローブにします。ただ昔ながらのものを打つとして 多く の保存に使用そのような小さな速に改善しました。

大藤ですがこれは最良の状態であるということを完全ハッシュのセットで知られる前に、keyはすでにかなり小さな重要な、ハッシュは通常の線形のキーサイズ)。もういない場合は鍵の配布かに偏在しない見込むには大きな改善--完璧なハッシュ関数多く(通常は?) かなり複雑です。

他のヒント

ベクトルが絶対いうとmapはこちらを想定しない挿入中のベクトルとなっています。書いたカスタムアロケータをトラックメモリ使用量は、ここでの結果Visual Studio2005年

std::map<int, float>:

1.3 million insertions
Total memory allocated: 29,859 KB
Total blocks allocated: 1,274,001
Total time: 17.5 seconds

std::vector<std::pair<int, float> >:

1.3 million insertions
Total memory allocated: 12,303 KB
Total blocks allocated: 1
Total time: 0.88 seconds

std::地図を利用上の保存を20倍の挿入全ての項目です。

ご入力ソートに試したほうがよいでしょうかベクターおよびバイナリ検索( lower_bound()).このとこadaquateでもO(log n)).によっては流通のキーのハッシュ関数を使いますので、hash_mapされるようになる。ことだと思い tr1::unordered_map にgcc.

ほとんどのコンパイラの船舶の非標準が作) hash_mapunordered_map るものがなくなります。でお越しのC++0x(はtr1でも(どう) boost ています。

GCCかったものが、俺C++る。12年..ものであるべきだと思うがどこかということです。

というのを見てstd::tr1::unorderd_map.

また32ビット符号無し整数型キー(4294967296値)130百万円と異なるキー、そして書く独自のコンテナに最適化したことです。特に、場合には130万キーケースである場合とない場合は希少ないたしております。

4294967296/130000000=33、各33回数で空間全体を使います。

きたとえば割のキー範囲を固定サイズ隔壁場合、キーは均一に分散され、パターンを可能にするキースペースを入例256型バケット、32型バケットはどのくらい保存したい廃棄物が数値が格納されています。

例を知ることができるためのアイディア

#define BUCKET_SIZE  256
#define BUCKET_SIZE_SHIFT  8
struct Bucket {
  uint32_t key;
  float value;
  Bucket* pNext;
};

Bucket data[ 4294967296 / BUCKET_SIZE ];

Bucket* find( uint32_t key ) {
  uint32_t bucket_index = key / BUCKET_SIZE;
  // or faster: uint32_t bucket_index = key >> BUCKET_SIZE_SHIFT;
  Bucket* pBucket = &data[ bucket_index ];
  while( pBucket ) {
    if( pBucket->key == key ) return pBucket;
    pBucket = pBucket->pNext;
  }
  return NULL;
}

場合はキーが変わらぬご性を高めることが考えられますが、 完璧なハッシュ関数 の代替として、標準コンテナ.

どうなるかはわからない障害物だけに走ると、データセットのサイズのものとして価値のある支出に数分の実験.

を考慮した大量のメモリにより、すきまが大きくなることも考慮に入れずメモリアクセスの検索結果-メモリキャッシュ。

この混合溶液のhashmapとして初層のソートベクトルのバケットは最高です。

その考え方としては、のハッシュテーブルのキャッシュメモリは、検索に小さい順にソートコンテナの数を減らすキャッシュが発生します。

部分の答えに関するルックアップ性能えることをお 挿入 パターンです。まこと std::map 利用の赤-黒ツリーのヘッジとしてlinearizing慎重に挿入ソートへリンク一覧です。したがって、このような木を提供 O(log n) ルックアップ時間にもかかわらず異常の挿入す。お支払う費用、ただし、挿入、削除、フォーカストラバーサルしていな地域の参考のための繰り返し読み取り"データです。

ハッシュテーブルを提供する場合があり高速のルックアップの場合で調整することができるハッシュ関数のためのキー型(整数という)を妨げるものが衝突した際に場合データセットの固定などができる負荷が一度だけ読んでその後、利用並列の配列での整数、浮遊し、利用 std::lower_bound めくり経由のバイナリを検索するソートの並列に適切にする音声を瞬時に聞いる場合、キーと切り離して考えら対応する価値があるんお楽しみ強化保存と地域の基準以上に保存配列、 std::pair.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top