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

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


ハッシュテーブルはまた、それは、線形データ構造であり、ハッシュテーブルと呼ばれています。一般的には、付加および欠失は、データO(1)を変更して再検索時間複雑で作られてもよいです。Javaプログラミング言語では、根底にあるのHashMapは、ハッシュテーブルです。


1.ハッシュテーブルとは何ですか

ハッシュテーブルのデータ構造は、データ構造は、一般的にアレイによって達成される基礎となる、直鎖状です。ハッシュ関数ハッシュキー操作によって初めてデータCRUD、ハッシュテーブルを行った後、動作はインデックス配列にマッピングされたキーをハッシュし、インデックスは、アレイ上で直接得ることができますデータ操作。理論的には、時間複雑ハッシュテーブルデータ操作はO(1)です。

ハッシュテーブルの底部は、アレイによって達成されます。データ機能があります:その長さは、初期化時に指定する必要があります。データハッシュテーブルの塗りつぶしが内部にデータを置くことを続けたいときに、あなたは、より大きな容量の配列を再作成する必要があり、その後、新しい配列への配列の前に配列をコピーします。このプロセスは、拡張操作を避けるために、ハッシュテーブルを使用する前に、オペレーティング・コストパフォーマンスなので、データの容量の最善の見積り。

2.ハッシュ関数

ハッシュ関数、ハッシュ関数は、ハッシュアルゴリズムを介して、(また、プレマッピング、プリ画像と呼ばれる)入力任意の長さであるとしても知られ、固定長出力に変換し、出力ハッシュ値です。この変換は、圧縮マップであり、すなわち、空間ハッシュ値は、典型的には、入力空間よりもはるかに小さい、異なる入力が同じ出力にハッシュ、一意のハッシュ値から入力値を決定することは不可能であることができます。次のように出力範囲がSであると仮定すると、ハッシュ関数の性質です。

  • 典型的なハッシュ関数は無限の入力範囲を有します。

  • ときに、同じハッシュ関数の入力、出力が同じになります。

  • 場合着信ハッシュ関数異なる入力値、戻り値は同じであってもよいし、異なっていてもよいです。

  • 得られた異なる入力を均一に分配出力値。

さらに、ハッシュ関数は、次の2つのプロパティがあります。

  • 衝突のない:≠yのxが入力表示されませんが、H =(X)H(Y)の場合、実際には、この機能は、出力の2 ^ 256の種類が存在するであろう、そのような現在使用されているビットコインSHA256アルゴリズムとして、理論的には、確立されていません私たちは2 ^ 256 + 1つの入力された場合は、それも、そうであっても、衝突の99%の可能性があるだろう一度、実際には、理論的には2 ^ 130回の入力によって証明衝突を持っているだろうが現在までの宇宙の誕生は、衝突の可能性が極めて小さいため、すべての人工のコンピュータが操作を起動します。

  • オカルトは:つまり、H(X)の所与の出力のために、それは計算上不可能である、入力xの導入を逆にしたいです。あなたが徹底的より良い可能性が高い主な入力方法のH(X)を取得したい場合は存在しません。

ハッシュ関数は、一般的に使用されている:SHA1、MD5、SHA2など

3.ハッシュの競合

異なる入力値に対して、ハッシュ関数は、このハッシュ衝突と呼ばれる同じ出力を与えることができます。

ハッシュ紛争の方法は、我々はハッシュの衝突がされている解決するために使用、避けられないアドレス法開くと法律** **ジッパーを。

3.1ジッパー法

核となるアイデアは、そのジッパー方法:上のどこかにハッシュハッシュテーブル競合があれば、(すなわち、時間の位置に配置されるアレイ内の1つの要素である、他の要素がこの位置を占めることがありました)これらの要素は、リンクリストの形式で格納されています。

リストクエリの効率が比較的低いので、あまり上の紛争の数がどこかハッシュテーブル場合、この位置は非常に長いリストです。遅く照会します。でJava 8では、ハッシュマップは、8の鎖長は、リストが自動的に赤黒木に変換する場合には、最適化されたより高いクエリ効率を行う(赤黒木は、自己均衡二分探索木です)。

3.2オープニングアドレス法則

開会の挨拶の方法では、データはハッシュ関数に直接格納できない場合は、配列のインデックスを計算し、あなたが店に別の場所を見つける必要があります。ある他の場所、見つけるための開口アドレス方式では3つの方法があり、プロービング線形、二次プロービング、再ハッシュが

検出方法3.2.1リニア

リニアプローブ挿入比較的単純なアプローチがある:最初の要素のハッシュマップ、この位置にデータを直接挿入するためにマッピングされた他の要素の場所が存在しない場合は、すでにこの位置にデータが含まれている場合、それは次の位置と判断されますデータを直接、さらに挿入されていない場合はデータの有無は、私まで次の判断は空見つかった場合。

、この位置の値は、その後、最初の配列の添字の位置にキーを配置することによって、あなたが直接等しい、等しくない場合見つかった場合は、データの値を比較したデータを検索する、次の要素を決定するために継続する:リニアプロービング検索すべての要素が存在しない、言葉がトラバースされて見つけることができませんでした。

リニアプローブを削除します:まず、キーで配列の添字の位置にマッピングされ、その後、配列の要素の値を比較することで、あなたは要素を削除する、削除する要素を見つけています。そして、(このステップは、私たちのすべては、あなたがやりたい理由を考える)、この位置に要素を削除し、フラグがデータを持っていたこの立場を説明設定

3.2.2二次検出方法

線形ハッシュテーブルをプローブデータ集約が発生し、一度凝集した形態、それらのアイテムが集合の範囲内に入る後に、それは、ハッシュ関数より多くなると、ステップ運動によってバックステップを必要としていると凝集の後に挿入、凝集が大きく、凝集成長したがって、速くなります。私たちは地元の人に多くの時間を好きなように水や土壌は、人々がより多くの、私たちは皆、ちょうどここに何をすべきか知っていることになるでしょう。

二次プローブは、アイデアは遠く離れ単位ではなく、元の場所と隣接するユニットを検出することで生成された凝集を防止しようとする試みです。リニアプローブ、ハッシュ関数が得られた原添字X場合、線形検出は、X + 1、X + 2、X + 3 ......、というように、一方、第2のプローブにおいて、プローブでありますプロセスX + 1、X + 4、X + 9、X + 16、X + 25 ......、というように、元の距離のステップ数の二乗に。

3.2.3二重のハッシュ

二重ハッシュは、直鎖又は二次検出プローブは、各時間ステップサイズが固定されたプローブかどうか、元の凝集および二次凝集の問題を解消することです。二重ハッシュは、第1のハッシュ関数は、同じビット列標準にマッピングされている場合でもように、検出ステップを生成するために、キーワードを追加するために使用される第1のハッシュ関数に加えて、ハッシュ関数であるが、検出工程と同じではありません我々は凝集の問題を解決することができるようにします。

第2のハッシュ関数は、次のような特性を持っている必要があります

  • そして、ハッシュ関数は同じではありません。
  • 0は、ステップ長が0であるため、各プローブはループに、同じ位置を指している、テスト結果の後にステップサイズ=定(キー%定数)、出力されない、ハッシュ関数の形態は、効果は非常に良好であり、定数素数は、アレイの容量より少ないです。

核となるアイデアは、第2のステップは、ランダムな検出ステップを生成し、ハッシュを倍増することです。

4.ハッシュテーブル関連のアプリケーション

唯一の2Gメモリ、コンピュータ、見つけるために、どのように、ほとんどの出現は20億のデータを整数

可能性の数は20億数が200億回にその値、同じであるので、まず我々は、値の範囲を決定する必要があります。したがって、我々は、この番号(4バイトでJavaのint)データ記憶int型の最小値を必要とします。

同時に、我々はこの整数の20億の範囲がどのくらいあるかを決定する必要があります。範囲は1から20億までであれば、我々はまた、キー格納するint型を使用することができ、それがより大きな値の範囲であれば、我々は長い間保存されて検討する必要があります。私たちは、この問題を検討するために、極端に悪い状況があります:20は、これらのデータの範囲は20億以上である完全なデータが異なるデータであるが、私たちは、long型のキー値を維持する必要があり、int型はする必要があります格納された値の値、20億のレコードは、その後、メモリ空間の26Gほどかかります。だから、明らかにメモリのうち、その一回の数2000000000統計的に危険。

ソリューション:ハッシュ関数を使用して16個の小さなファイルに大きなファイルの20億数が含まれているハッシュ関数が十分にあれば、この場合には、同じ数の繰り返しが、確かに、別のファイルに移動し、しませんまあ、この16種類のファイル数を200百万円(20/16)よりも大きくすることはできません。その後、我々は、この16文書内の統計を回すことができ、最終的に最大数を取得するために、繰り返し回数を要約します。(まとめ私はちょうどライン上で比較したそれぞれの小さなファイルに出現の最大数と、これらの16の番号を削除する必要がある場合)

質問:これは同じ番号2000000000である場合はどのようにそれを判断するの?

おすすめ

転載: www.cnblogs.com/54chensongxia/p/11566973.html