ハッシュ(ハッシュ)テーブルのハッシュテーブルのデータ構造の[]データ構造

 


ハッシュテーブル(ハッシュテーブル)の基本的な概念

ハッシュテーブルに従って(ハッシュ・テーブル)キー(キー値)を直接アクセスするためのメモリ記憶場所データ構造
ハッシュテーブルによって、データ要素及びデータ要素キーワードとの間のマッピングのいくつかの種類を確立する、マッピング関数が呼び出されるハッシュ関数を、データ記憶アレイが呼び出され、ハッシュテーブル

 

ハッシュ関数建設

コンストラクタのハッシュテーブルです。

  引数としてそれぞれデータ要素鍵K i(0 <= iが1、N <=)に隣接するメモリ位置のM(m≥n)のセットの長さ、格納されるデータ要素の数がnであると仮定、ハッシュ関数Hashによって(KI)のKiは、メモリセルのアドレスハッシュ(KI)、及びメモリ・ユニットに格納されたデータ要素にマッピングされます。数学的な観点からは、ハッシュ関数は、実際のキーワードにメモリユニットにマッピングされ、我々は、ハッシュ関数のアドレスによって算出されたハッシュをできるだけ均一にマップされるように、簡単な操作でハッシュ関数を使用して試してみたいですメモリセルの直列。

コンストラクタのハッシュ関数は、次の3つの主要なポイントがあります。

まず、操作プロセスは、ハッシュテーブルの挿入および取り出しの効率を改善しようとする単純かつ効率的であり、
第二、ハッシュハッシュ関数は、ハッシュ衝突の確率を低減するために良好な耐性を有するべきである;
第三のハッシュ関数これは、メモリを節約するために大きな圧縮を持っている必要があります。

いくつかの一般的な方法:

1)直接アドレス指定方法
線形関数であるキーワードアドレスのハッシュ値をとります。単にのように表すことができる:
ハッシュ(K)+ Cは、AKの=
いない競合の利点が、欠点は、空間的複雑性が少ない要素場合に高いことがあります。

2)中間二乗法
それぞれが繰り返される高周波現象のいくつかのキー数値を有する場合、それはキーワードと膨張差の二乗で二乗し、最終的なメモリアドレスとして中央桁を取ることができます。
使用例
= 1234 1234 ^ 2 = 1522756が227ハッシュアドレスとし、キー
よう= 4321 4321キーとして^ 2 = 18671041 671は、ハッシュアドレスとし
、この方法は、事前に知られていないデータと小さなデータ長の場合に適しているが

3)また、私はとどまる
ことはハッシュアドレスとして定数で割って得られたデータの重要な要素であり、この方法は、単純な、幅広いアプリケーション、最も頻繁に使用され、それはのように表すことができるのハッシュ関数です。
ハッシュ(K)= K MOD C (C <= M)mは、 長いテーブルである
一般近い又はハッシュ・テーブル自体の長さに等しい必要は、この方法の鍵は、定数を選択することで、理論的研究では、定数は素数を反映することを示しました最高。

 実際には、すべて私たちのキー数値は、文字列があるかもしれない、いくつかの値の組み合わせがあるかもしれないので、我々は独自のハッシュ関数を実装する必要がありません。

1.正の整数

最も一般的に使用される方法の正の整数のハッシュ値を取得することは、私が削除とどまる使用することです。すなわち、Mが素数であるアレイのサイズに、任意の正の整数kに対して、I KはMの数を割ることによって計算されます 一般的にM素数。

2.文字列

ときにキーとして文字列、我々が保持法の使用よりに加えて、大整数として彼もできます。私たちは、それぞれの文字列は、その後のような値を、ハッシュ化されたことができます

公共のint GetHashCodeメソッド(文字列str)
{ 
    文字[] S = str.ToCharArray()。
    int型のハッシュ= 0; 
    以下のために(iは++; iはs.Lengthを<I = 0 INT)
    { 
        ハッシュ= sの[I] +(31 *ハッシュ)。
    } 
    ハッシュを返します。
}

ホーナー算出したハッシュ値の上記方法は、ハッシュ値列であり、式は次のとおりです。

   H =のS [0]・31 L-1  + ... + S [1 - 3]・31 2  + S [1 - 2]・31 1  + S [L - 1]・31 0

例えば、取得97に対応するUnicode、ユニコード文字列を対応するCハッシュ値が99である「コール」するように、Lは、対応するUnicode 108であるような、文字列は、3045982のハッシュ値を「コール」 = 99・31 。3  + 97 31 * 2  + 108・31 。1  + 108 * 31 = 31・108 +(108 + 31・(31・97 +(99)))

あなたは、ハッシュ値に行けば、より多くの時間がかかり、各文字に対してであってもよいし、時間を節約するために間隔N-文字を取ることによって、ハッシュ値を得ることができ、例えば、文字ごとに8-9でハッシュ値を取得するために取得することができます。

公共のint GetHashCodeメソッド(文字列str)
{ 
    文字[] S = str.ToCharArray()。
    int型のハッシュ= 0; 
    INT = Math.Max(1、s.Length / 8)をスキップ。
    (I 0 = int型、iがs.Lengthを<; iが+ =スキップ)するための
    { 
        ハッシュ= sの[I] +(31 *ハッシュ)。
    } 
    ハッシュを返します。
}

ハッシュ衝突

ハッシュテーブルを構築する場合、当社のハッシュ関数によりハッシュアドレスを計算し、二つの異なるキーワード、問題があるShiqueは、同じハッシュアドレスを持って、我々はハッシュ衝突として知られている現象になります(AS):
残りはキー放置したとき、例えば、我々は他の方法を使用する:3,6,9、3 MOD 3 == 6 MOD 3 == 9 MOD 3 = 0、 この場合は、場所のハッシュ-3,6,9-をとっています競合。

 

 

 

 


ハッシュ紛争解決

1.カスタムメソッドを開き、
チェーンアドレス法2.

オープンカスタム法則

最初のH(キー)ハッシュ関数がある
場合にH(KEY1)= H(KEYI )
、記憶場所KEYI

HI =(H(キー)+ DI)MODm(M個のテーブル長)
DI 3をエミュレート
1)線形再ハッシュプロービング
DIは、I *はC =
2)、次いで正方形ハッシュ検出
、= 1 ^ 2 D_Iを- 2 ^ 2,2 ^ 1、^ 2 -2
3)ランダムハッシュプローブ(デュアルプローブの再ハッシュ)
DIは、擬似乱数列のセットであります

ことに留意されたい
増分は、以下の特性ジ(完全性)を有するべきである:こんにちは(アドレス)が生成さが同じではなく、得られたS(M-1)ハイカバー番目のハッシュテーブル内のすべてのアドレス

    • 場合素数長m平方メートルプローブ必要4J + 3(制限されたプローブのテーブル長の正方形)
    • Mは、ランダム(ジプロービングランダム限ら)共通因子およびジプロービングありません

データのセットがある
19 0,123,145,568,118,637キーMOD 11 = H(キー)表11の配列長に格納される。
格納された上記3つの溶液の競合による方法を、次のように:
(表は説明:フロント挿入位置が既に占有されている場合、バックデータを挿入し、アドレスが使用可能になるまでの衝突は、紛争の別の行、計算されたアドレスを発生し、競合が別の行の後ろにダウンし続ける。それが最も「占めているので(最上端結果データを取りますブロック「データ))

 

 

 

 

 

チェーンアドレス方式

彼らは競合場合ときにチェーンアドレス法の原理は、彼が同じアドレスに新しいスペースを作成し、ノードのリンクリストとして空間内に挿入されます。

 

 

参照してください。

ハッシュテーブルのアルゴリズム原理

ハッシュ(ハッシュ)テーブルのデータ構造

 

おすすめ

転載: www.cnblogs.com/-wenli/p/11703385.html