最初にハッシュテーブルを試してください。大幅な速度低下なしに非常に高密度であることを許容できるバリアントがいくつかあります (ブレントのバリアントのように)。
32 ビット整数のみを格納する必要があり、関連するレコードを格納する必要がない場合は、ほとんどの C++ ライブラリのように、 a ではset
なく a を使用します。100% になるのを避けるために、4 バイトのレコードに一定のオーバーヘッドと少しのスラックのみを使用します。最悪の場合、「数百万」の数値を処理するには、数十メガバイトが必要になります。大きいですが、手に負えないものはありません。map
hash_set
より厳密にする必要がある場合は、単純な配列に並べ替えて格納し、バイナリ検索を使用してフェッチします。O(1) ではなく O(log n) になりますが、「数百万」のレコードの場合、それらのいずれかを取得するのにまだ 20 のステップしかありません。C には がありbsearch()
、これは可能な限り高速です。
編集:あなたの質問で、「マップされたデータ(名前)」について話しているのを見ました。それらの名前はユニークですか?それらもメモリ内にある必要がありますか?もしそうなら、それらは間違いなくメモリ要件を支配します。それでも、名前が典型的な英語の単語である場合、ほとんどは 10 バイト以下であり、合計サイズは「数十メガバイト」のままです。おそらく最大 100 メガバイトですが、それでも非常に扱いやすいものです。