HashSetのなぜHashSetコンストラクタのデフォルトの塗りつぶし比率が0.75ですか?
HashSet<Integer> hs = new HashSet<Integer>(10,(double)0.50);
のコンストラクタを定義する一方で二番目の引数は、「塗りつぶし率」は0.75のデフォルト値を持っていると呼ばれます。
私は、それを0.75にデフォルトする背後に論理的な理由があるかどうかを知りたいと思っていました。
HashSetのなぜHashSetコンストラクタのデフォルトの塗りつぶし比率が0.75ですか?
HashSet<Integer> hs = new HashSet<Integer>(10,(double)0.50);
のコンストラクタを定義する一方で二番目の引数は、「塗りつぶし率」は0.75のデフォルト値を持っていると呼ばれます。
私は、それを0.75にデフォルトする背後に論理的な理由があるかどうかを知りたいと思っていました。
A HashSet
はそうあなたがデフォルト値として0.75の選択の根拠ためHashMap
's javadocを参照することができますHashMap
によって支えられています:一般的なルールとして
、デフォルトの負荷係数(0.75)申し出時間と空間のコストの間の良いトレードオフです。値を大きくするとスペースのオーバーヘッドは減少しますが、参照コストが増加します(HashMapクラスのほとんどの操作に反映されます。
get
およびput
など)。
確かに論理的な理由があります。
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
をして、私たちは重要選択の背後にある論理的な推論を確認することができ、関連HashMap
documentationに進ん:私たちはHashMap
に裏打ちされたと認識しているHashSet
を理解していれば、あなたのポストでコンストラクタはHashMap
コンストラクタを呼び出します。
デフォルトの負荷係数(.75)は、時間とスペースのコストの間で良い のトレードオフを提供します。値を大きくするほど、領域のオーバーヘッドは小さくなりますが、参照コストが増加します(getおよびputを含むHashMapクラスの操作のほとんどに反映されます)。 のエントリ数とその負荷係数は、 の再ハッシュ操作の回数を最小限に抑えるために、最初の容量を設定するときは アカウントに設定する必要があります。初期容量が の最大エントリ数を負荷率で割った値より大きい場合は、再ハッシュ 操作は発生しません。
'hashset'のドキュメントを読んでください。 – passion
ハッシュテーブルに_ハッシュ衝突があり、負荷率が高くなります(「塗りつぶし比率」よりも一般的な用語)は、より多くの衝突を意味します。これにより、挿入と検索の両方のパフォーマンスが低下します。選択した要素によって、時間と空間のトレードオフがあり、0.75は経験的に選択された値です。これは、「別々の連鎖」ハッシュテーブル設計にとっては良いことです。 _open-addressed_デザインは、衝突に対してはるかに敏感であり、負荷係数(0.70が最大有用値)を必要とします。 –