ハッシュと辞書の違いは何ですか?


46

違いは何であるHashとはDictionary

スクリプトのバックグラウンドから来て、それらは似ていると感じていますが、正確な違いを見つけたいと思いました。グーグルは私をあまり助けませんでした。

回答:


92

Hashは、プログラマーが実装インターフェイスを混同している非常に貧弱な名前のデータ構造です(フルネームを書くのがHashTable面倒Hashでした。つまり、代わりに略語に頼っていました)。

Dictionaryインターフェースの「正しい」名前(= ADT)、つまり(通常は一意の)キーを(必ずしも一意ではない)値にマッピングする連想コンテナです。

ハッシュテーブルは、このようなディクショナリの可能な実装の1つであり、非常に優れたアクセス特性(ランタイムの観点)を提供するため、多くの場合デフォルトの実装です。

このような実装には、2つの重要なプロパティがあります。

  1. キーは、する必要がハッシュ可能平等に匹敵
  2. エントリは辞書に特定の順序で表示されません。

(キーがハッシュ可能であるということは、キーから数値を計算できることを意味します。このキーは、後で配列のインデックスとして使用されます。)

キーに順序付けを行うディクショナリデータ構造の代替実装が存在します。これは、ソート済みディクショナリと呼ばます(通常、検索ツリーの観点から実装されますが、他の効率的な実装も存在します)。


要約すると、辞書は、キーを値にマップするADTです。このADTにはいくつかの可能な実装があり、そのうちハッシュテーブルは1つです。Hashは誤った呼び方ですが、コンテキストでは、ハッシュテーブルの観点から実装された辞書と同等です。


4
C ++の例を挙げると、標準の連想コンテナテンプレートをハッシュとして実装することはできませんが、次の標準にはハッシュテーブルと呼ばれるものがあります。彼らは彼らがunordered_map何であるかではなく、彼らが何をするかを示すために呼ばれています。
デビッドソーンリー

6
どの権限に従って「正しい」?RubyやPerlなどの一部の言語では、これらの構造の正式な(「正しい」と読む)名前は「ハッシュ」です。
nohat

11
@nohat:引用符の使用に注意してください。さらに、なぜ名前が間違って選択されいるのか説明しましたよね?したがって、権限が必要な場合は、理論上のコンピューターサイエンスポリスの権限によるものです。
コンラッドルドルフ

9
興味深いことに、Ruby 1.9の場合Hash、Ruby 1.9 Hashesは挿入順序を保持するがハッシュテーブルは保持しないため、クラスをハッシュテーブルで実装することは実際には不可能です。そのため、Ruby 1.9では、名前Hashは実装を反映していません。
ヨルグWミットタグ

7
@hippietrailあなたは間違っています-最初に、それら客観的な説明です。結局のところ、私はなぜネーミングが貧弱で誤った呼び名であるのかを限定します(以下を参照)。「怠け者」は私の側では芸術的なライセンスですが、名前を短縮する理由は本質的なものであるという点が残っています。つまり、ここで名前を短縮する以外に短い名前を使用する理由はありません。そして、あなたは「辞書」について間違っています:それは単にデータ構造の公式名です。「辞書」の定義はコンピューターサイエンスの文脈では間違っており、その名前はPythonに数十年前から付けられています。
コンラッドルドルフ

8

「辞書」は概念の名前です。ハッシュテーブルは可能な実装です。


1
ハッシュもADTです。HashTableはハッシュの実装です
サイラム

3
@Sairam「ハッシュ」はハッシュテーブルではなくハッシュ関数を意味するのがはるかに一般的だと思います。
jk。

@jk実際には、「ハッシュ」は「ハッシュ関数/アルゴリズム」を入力に適用した結果です。「ハッシュテーブル」または「ハッシュマップ」のomehoeは、ハッシュ可能なオブジェクトを特定のオブジェクト(OOPに限定されない一般的な形式のオブジェクト)に
関連付けます-johannes

「ハッシュ」を使用して、ハッシュ関数操作だけでなく辞書型構造を参照する言語があります。たとえば、Ruby
ショーンバートン

7

辞書とは、高速な検索/挿入に使用されるデータ構造の実装を指す総称です。これは、ハッシュテーブル、スキップリスト、rbツリーなどのさまざまなデータ構造を使用して実現/実装できます。ハッシュテーブルは、辞書の実装を含む多くの目的に役立つ特定のデータ構造です。


ハッシュもADTです。HashとDictionary ADTの間に特定の違いはありますか?
サイラム

2
@Sairam:いいえ、ハッシュは特定の種類のアルゴリズム(ハッシュ関数)の出力です。

5

辞書は、直接内部の値を参照するためにキーを使用して連想配列

すなわち (KEY => VALUE)

ハッシュは、より頻繁にと記載されているハッシュテーブル使用するハッシュ関数値となり、メモリ内の位置(又はより簡単アレイ)を算出します。ハッシュはキーを入力として受け取り、出力として値を提供します。次に、その値をメモリまたは配列インデックスに接続します。

すなわち KEY => HASH FUNCTION => VALUE

1つは直接的なもので、もう1つはそうではないようです。ハッシュ関数も完全ではない場合があり、間違った値を参照するインデックスを提供する場合があります。しかし、それは修正することができます。

見るのに最適な場所:ウィキペディア(連想配列ハッシュテーブル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.