web-dev-qa-db-ja.com

プログラミングのハッシュマップとは何ですか?どこで使用できますか?

ハッシュ、ハッシュマップ、ハッシュテーブルについての話をよく耳にします。私は彼らが何であるか、そしてあなたがそれらをどこで最もよく使うことができるかを知りたかった。

24
Saif Bechan

まずあなたは多分これを読むべきです 記事

リストを使用していて、通常は完全なリストを反復処理する必要がある特別なアイテムを探している場合。大きなリストがある場合、これは非常にコストがかかります。
ハッシュテーブルははるかに高速になる可能性があり、最良の状況では、1回のアクセスで目的のアイテムを取得できます。
どのように機能していますか?辞書のように...辞書で「ハッシュテーブル」という単語を探しているとき、 'a'の下の最初の単語から始めていません。しかし、むしろあなたは文字「h」にまっすぐ進みます。次に、「は」、「は」など、単語が見つかるまで続けます。辞書内のインデックスを使用して検索を高速化しています。
ハッシュテーブルも基本的に同じです。すべてのアイテムは一意のインデックス(いわゆるhash)を取得します。このハッシュはルックアップに使用します。ハッシュは、通常のリンクリストのインデックスである場合があります。たとえば、ハッシュは2130のような数値になる可能性があります。つまり、リストの2130番を見る必要があります。通常のリスト内の既知のインデックスのルックアップは非常に簡単で高速です。
アプローチ全体の問題は、このインデックスを各アイテムに割り当てる、いわゆる_hash function_です。あなたがアイテムを探しているとき、あなたは前もってインデックスを計算することができるはずです。実際の辞書のように、単語「ハッシュテーブル」が文字「h」で始まるので、おおよその位置がわかります。
優れたハッシュ関数は、可能なすべてのハッシュコードのスペースに均等に分散されるハッシュコードを提供します。そしてもちろん、collisionsを回避しようとします。 2つの異なるアイテムが同じハッシュコードを取得すると、衝突が発生します。
たとえばC#では、すべてのオブジェクトに GetHashcode() メソッドがあり、ハッシュを提供します(必ずしも一意ではありません)。これは、辞書での検索や並べ替えに使用できます。

ハッシュテーブルの使用を開始するときは、衝突を正しく処理することを常に心に留めておく必要があります。 2つのオブジェクトが同じハッシュを取得したことは、大きなハッシュテーブルで非常に簡単に発生する可能性があります(GetHashcode()のオーバーロードに問題があるか、別の何かが発生した可能性があります)。

50
tanascius

基本的に、HashMapを使用すると、アイテムを識別子とともに保存できます。それらは、ハッシュアルゴリズムを使用してハッシュされた識別子と共にテーブル形式で保存されます。

通常、検索ツリーなどよりもアイテムを取得する方が効率的です。

これは役立つかもしれません: http://www.relisoft.com/book/lang/pointer/8hash.html

それが役に立てば幸い、

クリス

9
Chris

ハッシュ(非暗号化の意味で)は、入力を受け取り、それを識別するための出力を生成するための包括的な用語です。ハッシュの簡単な例は、文字列の文字の合計を追加することです。つまり、

f(abc) = 6

この単純なハッシュスキームは、文字列間の衝突を作成することに注意してくださいabc、bca、aeなど。効果的なハッシュスキームは、当然、各文字列に異なる値を生成します。

ハッシュマップとハッシュテーブルは、(配列やリストのような)データ構造であり、ハッシュを使用してデータを格納します。ハッシュテーブルでは、オブジェクトが格納されているテーブル内の場所を決定するハッシュが(提供されたキーから、またはオブジェクト自体から)生成されます。つまり、ハッシュテーブルのユーザーがキーを認識している限り、オブジェクトの取得は非常に高速です。

比較すると、リストでは、目的のオブジェクトを見つけるために、何らかの方法でリストを検索する必要があります。これはハッシュテーブルの裏側も表しています。つまり、オブジェクトがテーブルに格納されている場所はその値や入力された日時とは関係がないため、キーを知らなくてもオブジェクトを見つけることは非常に複雑です。

ハッシュマップはハッシュテーブルに似ていますが、各オブジェクトの1つの例のみが格納されています(したがって、キーを指定する必要はなく、オブジェクト自体がキーです)。

もちろん、これは非常に単純な説明なので、この時点から詳しく読むことをお勧めします。私は愚かな間違いを犯さなかったと思います。 =)

7
mikek

ハッシュマップは、キーと値のペアでデータを格納するために使用されます。アプリケーションにオブジェクトを格納するためにハッシュマップを使用し、値を格納、更新、削除するために同じアプリケーションでさらに使用することができます。ハッシュマップのキーと値は特定のエントリへのバケットに格納され、このエントリの場所はハッシュコード関数を使用して決定されます。このハッシュコード関数は、値が格納されるハッシュを決定します。ハッシュマップがどのように機能するかの詳細な説明は、このビデオで説明されています: https://youtu.be/iqYC1odZSNo

1
tek2tor