ハッシュテーブルのオープンとクローズドハッシュハッシュ(C ++達成するために)

ハッシュコンセプト

小さなバイナリハッシュ値として知られる短い固定長の値のバイナリ値にハッシュアルゴリズムマッピング任意の長さのバイナリ値。ハッシュ値は、期間のユニークな値と非常にコンパクトなデータ表現です。
方法検索:少量検索対象データからデータを取得するために一回または2~3回に比較することができるが、データ検索時間の複雑多数のO(1)となります。

ハッシュ関数hashfunc

テーブル内のハッシュ関数記憶素子によってマッピング関係億を構築することができ、あなたはハッシュテーブル内のデータの場所に直接この関数を使用して見つけることができます。

要素を挿入

要素を格納するために、長い短いデータのハッシュ関数を話すことによって、データをマッピングし、ハッシュ関数で要求されているように

検索要素

要素により、対応する地図データとハッシュ関数値を与えるために検索する、及びその要素の位置及び地図データに基づいてハッシュテーブルを見つけます。

共通のハッシュ関数
  • アドレッシング方法を導く:ハッシュ(キー)= *キー+ B - 直接線形アドレスのセットを
  • Iステーに加えて: - ハッシュアドレスとしてIの数ハッシュ(キー)=キー%N
  • 中東二乗法:例えば、データ123は、15129平方、ハッシュアドレス12の真ん中を取ります
  • ランダムな番号方式:ハッシュ(キー)=ランダム(キー)ランダムな乱数
  • 数理分析:、電話番号などの一部の正規店データ。(保存中に、分析されるべき)

ハッシュ衝突

44の堆積物は、44ヶ所が占有されていることを発見したときにアドレスIでのご滞在には、その時点で、4,5,6,7,9メモリハッシュテーブルについて話すときを除いて、ハッシュ値を使用する場合、すなわち、彼は、ハッシュアドレス計算同じ2つのデータを言ったので、ハッシュ衝突が起こりました
ここに画像を挿入説明
ここに画像を挿入説明

紛争のハッシュソリューション - クローズドハッシュ

クローズドハッシュ - プロービングリニア

挿入

単純に、紛争の場所から振り返っている場所を見つけるまで保存することができ、それを保存します。あなたが場所にまだ最後まで見れば、位置0から後方を見続けています。
ハッシュ(キー)はキー%容量=
ここに画像を挿入説明

[削除]

閉じられたハッシュハッシュ衝突を使用する場合は、直接削除要素が他の要素の検索に影響を与える場合は、単に物理的に、ハッシュテーブルの既存の要素を削除しません。たとえば、あなたが直接スワップを削除した場合、要素4を取り外し、44は、それらが影響を受ける可能性が見つけます。従ってリニアプローブ標識用いて疑似削除方法要素を除去します。{DELETE EMPTY、存在する} 3つのフラグが表されている使用。

拡張

=負荷率テーブル/ハッシュテーブル長の要素移入
負荷率が0.7に等しいより大きい、拡張のため、拡張は再ハッシュ記憶素子への必要性があります。

クローズドハッシュ - 二次プローブ

明らかに、第二のプローブは、分割剰余法の残りの後方検出するために行う二次残されを使用することです

挿入

そして、プロービングリニアと同じ方法を挿入

[削除]

そして、プロービングリニアと同じように削除します

拡張

拡張のための負荷率は、一般的に0.5です。

クローズドハッシュコードの実装

リニアプロービングハッシュC ++の実装githubのリンク

オープンハッシュ

あなたが保存中に同じ要素を作ることができますので、リストを格納するための内部ハッシュテーブルであるハッシュバケットの形で。直接ノード挿入します。
ここに画像を挿入説明
場合は、挿入要素44、ハッシュテーブルの実行
ここに画像を挿入説明

[削除]

ノードが直接削除することができます

拡張

膨張は、ハッシュバケット容量を増加し、次に再配置ノードする必要がある場合。

オープンハッシュコードの実装

ハッシュ・バケットコードgithubのリンク

公開された52元の記事 ウォン称賛26 ビュー3400

おすすめ

転載: blog.csdn.net/weixin_43796685/article/details/104538600