標準では、多かれ少なかれ衝突解決のためにバケットを使用する必要があります。つまり、実際のルックアップ時間は、要素が存在するかどうかに関係なく、バケット内の要素の数に対しておそらく線形になります。O(lg N) にすることも可能ですが、ハッシュテーブルを正しく使えばバケツの要素数は少ないはずなので、通常はそうはいきません。
バケット内の要素数を少なくするには、ハッシュ関数が有効であることを確認する必要があります。有効な手段は、ハッシュされる型と値によって異なります。(MS の実装では、FNV が使用されます。これは、最も優れた一般的なハッシュの 1 つですが、実際に表示されるデータについて特別な知識があれば、より適切に処理できる可能性があります。) 数を減らすのに役立つ別の方法バケットあたりの要素の数は、より多くのバケットを強制するか、より小さい負荷係数を使用することです。最初に、バケットの最小初期数を引数としてコンストラクターに渡すことができます。マップに含まれる要素の総数がわかっている場合は、この方法で負荷率を制御できます。を呼び出して、テーブルがいっぱいになったら、バケットの最小数を強制することもできます
rehash
。それ以外の場合は、機能があります
std::unordered_map<>::max_load_factor
あなたが使用できる。何かを行うことが保証されているわけではありませんが、合理的な実装では、そうします。すでに入力されている で使用する場合unordered_map
は、おそらく後で呼び出す必要が
あることに注意してくださいunordered_map<>::rehash
。
(標準の unordered_map について理解できないことがいくつかあります。負荷係数がfloat
ではなく である
double
理由、効果が必要でない理由、自動的に呼び出さrehash
れない理由などです。)