web-dev-qa-db-ja.com

「ハッシュ関数」を使用してハッシュマップを実装するにはどうすればよいですか?

私の理解では、ハッシュマップを使用すると、たとえば文字列を特定のメモリ位置にリンクできます。ただし、すべての文字列をメモリ内の一意の場所にリンクする場合は、空のメモリの巨大なブロックが必要になります。わかりません。

4
MaiaVictor

ハッシュ関数 は、入力(通常は文字列)をより小さな固定長(通常)の「ハッシュ値」に変換するために使用されます。これは通常、ハッシュテーブルの配列インデックスのように使用されます。理想的には、この値はその範囲全体に均等に分散され、明らかな/重要な濃度を回避する必要があります。

ハッシュ関数は、キーと呼ばれる可変長の大きなデータセットを固定長の小さなデータセットにマップするアルゴリズムまたはサブルーチンです。

あなたは「特定の記憶場所」に関して知らされていませんでした。このような関数の使用は、大きなデータをはるかに小さな値に減らし、その大きなデータを識別するために使用できるようにすることです。ただし、データのサイズを縮小しているため、複数の入力「データ」が同じハッシュ値を持つ可能性があります。これは、いわゆる 衝突 です。

有効なハッシュ関数(あまり良いものではありませんが、まだ有効です)は、文字列の各文字をASCIIコードで合計したものです。

9
Karthik T

ハッシュとマップは2つの異なる概念です。 (したがって、ハッシュとマップの2つのタグ:-))。

マップの概念(このコンテキストでは)はキーと値のペアのコレクションです。ここで、キーは何でも、値は何でもかまいません。マップを作成すると、マップは指定されたキーの値を取得できるはずです。単純なマップは、キーと値のペアを配列またはリンクリストに格納することです。マップは、任意のストレージ手法を使用して実装できます。赤黒木とハッシュが人気です。

ハッシュは何かを一意の表現に変換する(ほとんどの場合可能な限りランダム)であり、ある範囲によって制限されます。ハッシュは1つの方法です。つまり、AをBにハッシュすると、BからAを取得する保証された方法はありません。

ハッシュ関数は、Aを入力として受け取り、Bを出力として返す関数です。ハッシュ関数の2つのプロパティは重要です。

  1. 同じAが与えられると、常に同じBを返す必要があります。
  2. 理想的には、Aごとに異なるBを返す必要があります。ただし、Bの範囲がAの範囲よりも小さい場合は不可能です。

プロパティ2を維持することは非常に難しいため、優れたハッシュ関数を取得することは非常に困難です。最も単純なハッシュ関数はモジュロ演算子です。ハッシュアルゴリズムとライブラリはたくさんあります。

これら2つを組み合わせると何が得られますか?ハッシュマップ。 キーはハッシュに変換され、値に対して保存されます。したがって、ペアがある場合は(A,A')、AをハッシュBに変換して(B, A')を格納します。ここで、キーAに対して保存されている値を取得する場合は、最初にAをBに変換してから、Bに対して保存されている値を確認して返します。

ハッシュマップを使用する利点は、高速検索です。それはO(1)です。つまり、一定時間内に、キーが存在するかどうかと、それに対する値を見つけることができます。取得の時間の複雑さがO(logn)である赤黒木と比較してください。 (ここでは説明していませんが、挿入と削除の時間もあります。)

では、あなたの質問は何ですか?

1
Manoj R