標準のハッシュマップでは、これを効果的に(すべてを行なわずに)行うことはできません。ハッシュマップの目的は、わずかなメモリオーバーヘッドで、要素への高速アクセスを提供することです。整数サイズの配列と、格納されているオブジェクトごとに整数を返すhashcode関数があるとします。次に、index = hashcode(key)を適用して要素を見つけることができます。これは基本的には何かを見つける1つの操作です。しかし、あなたはひどいメモリオーバヘッドを持っています(配列の大きさはすべての整数に等しい)。
その他のオプションは、リストを持ち、すべての要素を通過することです。ここではメモリのオーバーヘッドはありませんが、検索の複雑さはO(n)になります。要素が配列内にない(または早く見つかる)ためにすべてを調べる必要があります。
ハッシュマップは中間にあります。サイズの配列を割り当てて100とすると、そのキーのハッシュコード関数が計算され、結果は105になります。したがって、オブジェクトをインデックス{hashcode_result}のモジュロarray_sizeに配置します。私たちの場合105%100 == 5
興味深いものは、同じポジションを持つkey2としての衝突がある場合、あなたが何をするかによって異なります。たとえば、ハッシュコード値が205,305の場合(これらのハッシュコードはすべてモジュロ5になります)。 これらの追加要素を次に利用可能なインデックス6,7に追加することも可能です はJavaで(あるいは、少なくとも私が覚えている限りでは)バケットは、リンクリストとして実装されているので、あなたは
0 => []
1 => []
2 => []
3 => []
4 => []
5 => [k=105, k=205, k=305...]
ハッシュコード機能を実装することであろうあなたのユースケースのためのハッシュマップを使用する方法の唯一の方法がありますこれは常に同じクラスの同じハッシュを生成します。しかしこれはハッシュマップをn個のリストに縮退します。ここでnはサブクラスの数です。そして、正しく実装されたハッシュマップ(ハッシュコード値の一様な分布)が保証されている間、ルックアップはひどく苦しんでいるでしょう(値を調べるためにM/n演算をしなければなりません、Mは要素の数であり、nは別個のクラスの数です)ハッシュマップの構造を、あなたは効果的にデータ依存loopkupのいずれかのタイプを行うことができないので、あなたが検索にパフォーマンスを殺すウィル( - ルックアップの回数は1
かいつまんに効果的に等しくなりますリストを通して)。 このタイプの参照が必要な場合は、の回答はjohn16384です。本当に良いです。
私はキーがX、XY、XZのタイプではないと思います。 – john16384
ありがとう)ミスタイプで固定しました。 – dmitryvim