ハッシュ衝突を解決する方法

主に以下の4つの方法で:

①オープニング送付方法

       別のハッシュアドレスP1を生成し、PベースにP = H(キー)の競合場合キーワードキーハッシュアドレス、P1競合が残っている場合、次いでPは農産物別のカザフスタン基づいている:基本的な考え方でありますギリシャのアドレスP2、...、あなたはハッシュアドレスを見つけるパイまで競合しない、に対応する要素がありません。

②ジッパー法

      この方法は、同時に異なるハッシュ関数を複数構築される:こんにちは= RH1(キー)は、i = 1,2、...、k個のハッシュアドレスのHi = RH1(キー)競合が発生し、その後のHi = RH2(キー計算時)......競合がもはや生成されるまで。この方法は、凝集を発生しにくくなるが、計算時間を増やします。

③再ハッシュ

      このアプローチの基本的な考え方は、ハッシュアドレスiのすべての要素が同義語鎖、単一のリストの先頭ポインタとハッシュテーブルのi番目のユニットの存在と呼ばれる単一のリンクされたリストで構成され、したがって、検索挿入および削除することです主にシノニム・チェーンインチ 頻繁に挿入および欠失の場合にも適用チェーンアドレス法則。

ジッパー方法の利点を※:

      治療ファスナー単純競合、無蓄積現象、すなわち、非同義決して衝突ので、短い平均検索長さ、それがより適切集計であるように、アプリケーションリスト上の各スペース内のノード以降ジップ方法は、動的ですそれは、長い間、オープン状態の前に決定することはできません。ハッシュリストは、ノード操作を削除し、ファスナーの方法で構築し、実装が容易。単にノードに対応するリストを削除します。

※ジッパー法の欠点:

      すなわち、小規模ノードは、オープンアドレス指定方法は、より省スペースであるときにポインタが、追加のスペースを必要とし、ポインタ保存空間は、ハッシュテーブルのサイズを拡張する場合に充填することができる因子は、次にオープン・アドレス指定を減少させる、小さくなります競合は、それによって平均検索速度を向上させることができます。

図は、Javaは、紛争を扱うハッシュマップジッパー法で使用することができます知っています。HashMapのは、初期容量の大きさを持っている、デフォルトは16です

静的最終INT DEFAULT_INITIAL_CAPACITY = 1 << 4; //別名16拡張閾値アレイ長ハッシュマップがトリガされる衝突の確率を低減するために、すべての要素は、拡張後の容器内へ、次いで焼き直し非常に時間のかかる操作。

そして[]のこの臨界値とサイズを決定するために容器の電流容量の負荷係数:即ち、デフォルト= 12 16x0.75あるDEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTORは、膨張動作がトリガされます。

だから、ハッシュコンテナを使用した場合、その初期値にデータの量を推定してみてください。自習用のHashMapのソースを達成するための具体的なコード。

基本サプリメントは、背中の質問に行き、なぜデフォルトの負荷係数は0.75である必要がありますか?ランダム・ハッシュ・コード、ノードの出現頻度は、バケットテーブルも要素と確率の数が与えられ、ハッシュバケットのポアソン分布に従います。上記の表から負荷係数として、すなわち0.75、バケット素子8に到達したとき、確率は非常に小さくなったことがわかる、8以下の各鎖の衝突位置の長さは、ほとんど不可能です。

共通のオーバーフロー領域の確立④

       この方法の基本的な考え方は次のとおりです。ハッシュテーブルは、2つの部分、ベーステーブルとオーバーフローテーブル、要素および基本的な紛争の任意のテーブル、常に移入オーバーフローテーブルに分割されています。

おすすめ

転載: www.cnblogs.com/zhudingtop/p/11456101.html