Hash
とDictionary
の違いは何ですか?
スクリプトのバックグラウンドから来て、それらは似ているように感じますが、正確な違いを知りたいと思いました。グーグルは私をあまり助けませんでした。
回答
Hash
は、名前が非常に貧弱なデータ構造であり、プログラマーがインターフェースと実装を混同しています( は怠惰すぎてフルネームを記述できませんでした。つまり、HashTable
代わりに、略語Hash
)を使用します。
Dictionary
は、インターフェースの「正しい」名前です(= ADT )、つまり(通常は一意の)キーを(必ずしも一意ではない)値にマップする連想コンテナ。
ハッシュテーブルは このような辞書の可能な実装の1つであり、(実行時間の観点から)非常に優れたアクセス特性を提供するため、多くの場合、デフォルトの実装です。
このような実装には、2つの重要なプロパティがあります。
- キーは haである必要がありますシャブルと同等の同等性。
- エントリは辞書に特定の順序で表示されません。
(ハッシュ可能であるということは、後で配列のインデックスとして使用されるキーから数値を計算できることを意味します。)
順序付けを課す辞書データ構造の代替実装が存在します。キーのem> –これはしばしばソートされた辞書と呼ばれます(他の効率的な実装が存在しますが、通常は検索ツリーの観点から実装されます)。
To要約:辞書は、キーを値にマップするADTです。このADTにはいくつかの可能な実装があり、そのうちのハッシュテーブルはその1つです。 Hash
は誤った名称ですが、コンテキストでは、ハッシュテーブルの観点から実装された辞書と同等です。
コメント
- C ++の例を挙げると、標準の連想コンテナテンプレートはハッシュとして実装できませんでした'が、次の標準には事実上ハッシュテーブルが含まれます。 'は
unordered_map
と呼ばれ、彼らが何であるかではなく、何をしているのかを示します。 - によると「正しい」どのような権威? RubyやPerlなどの一部の言語では、これらの構造の正式な名前は「正しい」と読み、「ハッシュ」です。
- @nohat:引用符の使用に注意してください。さらに、なぜ名前が間違って選ばれたのかを説明しましたよね?したがって、権限が必要な場合は、理論計算機科学の警察の権限によるものと言えます。
- 興味深いことに、Ruby 1.9では、クラスとハッシュテーブル。Ruby1.9
Hash
は挿入順序を保持しますが、ハッシュテーブルは保持しません。そのため、Ruby 1.9では、Hash
という名前は'実装を反映していません。 - @hippietrailあなたは間違っています–まず、それらは 客観的な説明です。結局のところ、私は命名が貧弱で誤った名称である理由を認定します(以下を参照)。 「怠惰すぎる」というのは私の側の芸術的許容ですが、名前を短くする理由は本質的なものです。つまり、名前を短くする以外にここで短い名前を使用する理由はありません。そして、あなたは「辞書」について間違っています。それは単にデータ構造の正式な名前です。コンピュータサイエンスの文脈では、「辞書」の定義は間違っており、その名前はPythonより数十年前のものです。
回答
「辞書」は概念の名前です。ハッシュテーブルは可能な実装です。
コメント
- ハッシュもADTです。 HashTableはHashの実装です
- @Sairam ' hash 'の意味ははるかに一般的だと思いますハッシュテーブルではなくハッシュ関数。
- @jk実際には" hash "は適用した結果です。 "ハッシュ関数/アルゴリズム"を入力に追加します。 "ハッシュテーブル"または"ハッシュマップ" omehoeは、ハッシュ可能なオブジェクトを特定のオブジェクト(OOPに限定されない、一般的な形式のオブジェクト)に関連付けます。
- 'ハッシュを使用する言語があります'は、ハッシュ関数操作だけでなく、辞書タイプの構造を参照します。 ルビーなど。
回答
辞書は、高速なルックアップ/挿入に使用されるデータ構造の実装に付けられた総称です。これは、ハッシュテーブル、スキップリスト、RBツリーなどのさまざまなデータ構造を使用して実現/実装できます。ハッシュテーブルは、辞書の実装を含む多くの目的に役立つ特定のデータ構造です。
コメント
- ハッシュもADTです。 HashとDictionaryADTの間に特定の違いはありますか?
- @Sairam:いいえ、ハッシュは特定の種類のアルゴリズム(ハッシュ関数)の出力です。
回答
辞書はキーを使用して連想配列内の値を直接参照します。
ie (KEY => VALUE)
ハッシュはハッシュテーブルは、ハッシュ関数を使用して計算します値が存在するメモリ内の位置(またはより簡単には配列)。 ハッシュはKEYを入力として受け取り、値を出力として提供します。次に、その値をメモリまたは配列のインデックスに接続します。
ie KEY => HASH FUNCTION => VALUE
一方が直接で、もう一方が直接であると思います。そうではありません。ハッシュ関数も完全ではなく、間違った値を参照するインデックスを提供する場合があります。ただし、修正することはできます。
最適な場所:Wikipedia(連想配列およびハッシュテーブル)