回答:
同じことを表す2つの用語:
「マップ」は正しい数学用語ですが、関数型プログラミングでは別の意味を持つため、使用を避けます。
一部の言語ではさらに他の用語(JavaScriptの「オブジェクト」、Rubyの「ハッシュ」、Luaの「テーブル」)を使用していますが、それらはすべてプログラミングでもそれぞれ別の意味を持つため、避けたいと思います。
詳細はこちらをご覧ください。
Dictionary
Javaでは廃止されました。これは、Map
インターフェースが作成される前に使用される抽象クラスです。
プログラマによって複雑になるこの質問に答えること、彼らが使用した特定の言語やシステムにおけるより具体的な意味を与えられた条件を見ますが、質問は、私が意味するように取っている「理論的には」言語に依存しない比較、を要求したコンピューティング科学用語で。
コンピュータサイエンスのオックスフォード大学辞書には次のものがリストされています。
要素の挿入と削除、およびメンバーシップのテストをサポートできる要素のセットを表すデータ構造を辞書で検索します
ただし、マップのコンピューティングサイエンスの概念は、オックスフォードディクショナリが次のように定義している数学的言語用語のマッピングに基づいています。
マッピング特定のセット(ドメイン)の各要素を2番目のセット(範囲)の1つ以上の要素に関連付ける操作。
したがって、上記の厳密なComp Sci用語を使用すると、インターフェイスがすべての辞書に必要のない追加の操作をサポートする場合、辞書は単なるマップになります。
個別のキーおよび値コンポーネントを持つ要素を保存する機能
キーのみを指定して値を取得する機能
ささいなひねり:
all上記のすべてにもかかわらず、上記で説明した厳密なコンピューティングサイエンスの意味で辞書を使用する場合、最初に読者がフォローすることを期待したり、用語を共有して擁護したときに感心したりしないでください。この質問に対する他の回答(およびその賛成票)は、「辞書」がほとんどのプログラマーの経験において「マップ」と同義になる可能性がどれほど高いかを示しています。より広く、明確に理解される用語を選択してみてください。例:
map
、multimap
、unordered_map
、unordered_multimap
set
、multiset
、unordered_set
、unordered_multiset
std::find
あなたが会員のための要素とテストを消去することができarray
、vector
、list
、deque
などが、コンテナのインタフェースは、直接要素を見つけることがO(N)で見事に非効率的であるため、ことをサポートしていませんが、いくつかのケースでは、インサート/消去IS非効率的であり、これらの操作をサポートすると、コンテナが意図的に制限するAPIが損なわれます。たとえば、deque
sは、一部のキーではなく、前後での消去/ポップのみをサポートする必要があります。検索を調整するためにコードでより多くの作業を行う必要があるため、プログラマーは、より効率的な検索を備えたコンテナーデータ構造に切り替えることができます。...後で他の言語を追加する場合があります/自由に編集してください...
通常、マップはハッシュテーブルに基づいていると想定しています。注文されていないストアを暗示しています。辞書は注文されたストアを暗示しています。
Trieと呼ばれるツリーベースの辞書があります。
Lispでは、次のようになります。
(a (n (d t)) n d )
これは単語をカプセル化します:
上から葉へのトラバーサルが単語を生み出します。
Dictionary
.Netでは順不同です。
std::map
は注文されていますが、その実装は標準で指定されていませんstd::unordered_map
。これはc ++ 11で導入され、ハッシュを介して実装されています
std::map
、他のものを使用してみてください。AVLツリーは機能しません。挿入コストが基準を満たしていません。ハッシュは機能しません。ハッシュは順序付けされていないため、標準を満たしていません。標準では、「std::map
明示的に言うことなく、実装には赤黒木を使用する必要があります」とほとんど述べています。
まったく同じではありません。マップは辞書のサブセットです。ここでは、辞書は挿入、削除、および検索機能を持つものとして定義されています。ジャワで使用される(に係る地図このする)値にマッピングするキーは厳密に一対一の関数としてマッピングされていることを要件と辞書です。ディクショナリには、1つの値に複数のキーマップがある場合や、Twitterハッシュタグ検索など、1つのキーマップに複数の値が含まれている場合があります(hasttableのチェーンなど)。
より「現実的な」例として、辞書で単語を検索すると、同じ単語の多くの定義が得られ、別のエントリ(他の単語を参照)を指すエントリが見つかると、いくつかの単語が表示されます同じ定義のリスト。現実の世界では、マップははるかに広く、名前の場所や座標の名前を付けることができますが、最近傍や他の属性(人口など)を見つけることもできるため、IMHOの拡張により、おそらくマップベースの実装を持つマップタイプですが、特にキーと値のペアだけを想定するのが最善です。特に、値に最も近いネイバーと他の属性はすべて値のデータメンバーにすぎない可能性があるためです。
Javaマップは、1対1の要件にもかかわらず、値がコレクション自体として一般化されている場合、または値が他の場所に格納されているコレクションへの参照にすぎない場合、一般化された辞書のようなものを実装できます。
JavaのメンテナはADT定義のメンテナではなく、Javaの決定は特にJavaのためのものであることを忘れないでください。
この概念の他の一般的な用語は、連想配列とハッシュです。
そう純粋に理論的なレベルで。
辞書は、リンクされた値を見つけるために使用できる値です。マップは、別の値を見つける方法を説明する値です
単純な配列でさえ正しい値にマップするインデックスを持っているので、ノンリニアアクセスを許可するすべてのコレクション(つまり、最初に取得するか、最後に取得するだけ)はマップです。したがって、ディクショナリはマップの一種ですが、マップは可能な機能のはるかに広い範囲です。
実際には、通常は名前を定義するマッピング関数です。したがって、HashMapは、ハッシュアルゴリズムを使用してキーを値にリンクするマッピングデータ構造です。リンクされたリスト、ツリー、またはその他のアルゴリズムを介して保存できます。使用の端からは、通常、アルゴリズムが何であるかを気にしないので、汎用ディクショナリを使用し、アルゴリズムのタイプを推測する必要がある場合にのみ、他の構造の1つにシフトします。