ハッシュ関数を理解します

まずは、ハッシュ関数の概念を導入しましょう。ハッシュ関数の入力フィールドが非常に広い範囲であることができ、例えば、文字列が、その出力フィールドは、一定の範囲です。そして、次のプロパティがあります。

  1. 典型的なハッシュ関数は、無限の入力範囲を持っています。
  2. 場合は、同じ入力値は、戻り値として、ハッシュ関数に渡されました。
  3. ハッシュ関数への入力は異なる入力値が、戻り値は同じでも異なっていてもよい場合には、出力フィールドの範囲が固定されているので、当然のことながら、あるので、フィールド内の出力素子に対応する異なる入力値が存在することになりますハッシュ衝突の問題に関係上、。
  4. 異なる入力値の数の最も重要な特性が得られる戻り値は、出力フィールド上に均一に分布しています。

3:00 1は、ハッシュ関数の性質に基づいている、ハッシュ関数の評価のキーポイント4自然メリット、より均一であり、異なる入力値取得した分布が独立した入力値のすべての戻り値を発生します。

コンストラクタのハッシュ関数

1)アドレッシング方法を導きます。

線形関数は、キーワードやハッシュアドレス値をとる:H(キー)=キーまたはH(キー)・キー= + B
とbは定数であり、このようなハッシュ関数が呼び出された関数自体。

注意:により直接キーワードやコレクションのサイズの同じセットを扱うたアドレスに。そのため、競合は異なるキーワードで発生しません。しかし、実際の状況は、このハッシュ関数が小さい使用することができます。

2)丸め方法を掛けます。

まず、定数Aを乗算するキーワード鍵(0 <A <1)、及び小数部key.Aを抽出し; mおよびその後丸め後に小数点を掛けます。

注意:この方法の最大の利点は、法律が要求するよりも、他の選択されたmよりも低くなっています。例えば、これは、2つの完全に選択可能な整数乗です。が、この方法は、Aの任意の値に適用され、その効果は特定の値のために良くなります。クヌースは0.61803を選択することをお勧め.......

3)平方取中法:

ハッシュアドレスに正方形のいくつかのキーワードの真ん中をとった後。

差を二乗することによって拡張、いくつかの追加の中間体は、それによってより均一なハッシュアドレスを生成し、乗算器の各ビットに関連付けられました。これは、ハッシュ関数を構築するより一般的な方法です。

将一组关键字(0100,0110,1010,1001,0111) 
平方后得(0010000,0012100,1020100,1002001,0012321) 
若取表长为1000,则可取中间的三位数作为散列地址集:(100,121,201,020,123)。

4)また、滞在中:

H(キー)= MODキーのP(Pさ≤M):鍵は剰余Pを取った後に得られたハッシュアドレスの数です。

注:これは、ハッシュ関数を構築するための最も単純で最も一般的に用いられている方法です。途中でモジュロ演算を正方形に折り畳まれた後、それだけでなく、キーワード(MOD)直接法とすることができ、またとることができます。法律が残っている残りのほかに、使用中のpを選択することが重要である、ということに注目すべきです。一般Pから選択することができ、複合数が20未満の質量要素を含む素数かどうかです。

5)乱数方法:

ランダム関数を選択し、ランダム関数は、そのアドレスのキーワードのハッシュ値をとり、すなわち、H(キー)は、ランダム、ランダム関数である、ランダムな(キー)=。典型的には、ハッシュ関数を使用して、この方法は、等しくない長さより適切なキーワードを設定しました。

ハッシュ紛争解決

1)オープンアドレッシング方法:

その紛争の後、検出技術のいくつかの種類によって、競合がなくなるまでプローブまで、他のユニットを調査するために、それに要素を追加します。

ハッシュ衝突が位置インデックスで発生した場合、通常、いくつかの検出方法について:

  • 線形検出法(線形再ハッシュをプロービング)
    後方に順次インデックス+ 1、インデックス2 + ...位置を検出し、衝突までの競合がないかどうかを確認するために、要素は、それに加えました。

  • 正方形の検出方法は、
    競合解消されるまで、ようにそのような競合ゼロ位置、プローブ2 ^ 1の、位置、及び検出位置指標が、プローブI ^ 2の位置、2 ^を検出していません。

注意:

(1)用开放定址法建立散列表时,建表前须将表中所有单元(更严格地说,是指单元中存储的关键字)
置空。
(2)两种探测方法的优缺点。
     线性探测法虽然在哈希表未满的情况下,总能保证找到不冲突的地址,但是容易发生二次哈希冲
     突的现象。比如在处理若干次次哈希冲突后k,k+1,k+2位置上的都存储了数据,那下一次存储地
     址在k,k+1,k+2,k+3位置的数据都将存在k+3位置上,这就产生了二次冲突。
     这里引入一个新的概念,堆积现象是指用线性探测法处理哈希冲突时,k,k+1,k+2位置已存有数
     据,下一个数据请求地址如果是k,k+1,k+2,k+3的话,那么这四个数据都会要求填入k+3的位置。
     
     平方探测法可以减少堆积现象的发生,但是前提是哈希表的总容量要是素数4n+3才可以。

2)チェーンアドレス方法(オープンハッシュ法)

基本的な考え方:

メソッドチェーンがその場所に単独でリンクされたリストにリンクされ、次いで、すべてのデータ衝突、アドレスの競合であり、リストに挿入されます。データは、データに続いて、リストの先頭に尾から挿入することができます挿入する方法はいくつかありますが、あなたはまた、順番に最後尾に頭からデータを挿入することができ、また、リストの途中に挿入することができ、一定のルールに従って、要するに、リンクリストにそのデータを確保するために秩序。JavaのHashMapのクラスでは、治療の選択肢のリストの法律を取ることです。

例:キーワード(19,14,23,01,68,20,84,27,55,11,10,79)の集合が与えられる、ハッシュ関数H(キー)=キーMOD13リンクアドレスを押すと、ハッシュテーブルを、得られた処理の競合が構成されています。
ここに画像を挿入説明

3)再ハッシングダブルハッシュ:()

ハッシュ衝突が発生した後、競合が発生しなくなるまで新しいアドレスを生成するために、異なるハッシュアルゴリズムを使用します。これは、よく理解されなければなりません。

再ハッシュ方式が効果的現象の蓄積を避けることができますが、欠点は、時間とハッシュアルゴリズムの計算の数を増やすのではなく、ハッシュテーブルに保証するものではありませんが一杯になっていない、あなたは常にアドレスが競合していない見つけることができます。

共通のオーバーフロー領域の4)設立:

ベーステーブルを確立し、ベース・テーブルのサイズは、ハッシュテーブルのサイズに等しいです。オーバーフローテーブルの確立、最初のレコードのハッシュアドレスのすべてのアドレスは、オーバーフローテーブルに配置されているハッシュアルゴリズムどのように関係なく、すべてのデータ競合ベーステーブルに存在しません。

しかし、欠点がありますが、事前にハッシュテーブルの可能サイズを知らなければならないということで、オーバーフローテーブルのデータは、クエリの効率オーバーフローテーブルに影響を与えそうでない場合は、あまりにも多くのことはできません。実際には、競合を最小限に抑えます。

参考リンク:https://blog.csdn.net/m0_37925202/article/details/82015731

おすすめ

転載: blog.csdn.net/weixin_43234372/article/details/93010592