地図と辞書の違いは何ですか?


197

マップがキーを値にマップするデータ構造であることは知っています。辞書は同じではありませんか?地図と辞書1の違いは何ですか?


1.それらが言語XまたはYでどのように定義されているかを尋ねているのではなく(これは一般にSOでここで求められているようです)、理論の違いを知りたいです。


すばらしい質問です。
NoName

回答:


259

同じことを表す2つの用語:

  • 「マップ」はJava、C ++で使用されます
  • 「辞書」は.Net、Pythonで使用されています
  • 「連想配列」はPHPで使用されます

「マップ」は正しい数学用語ですが、関数型プログラミングでは別の意味を持つため、使用を避けます

一部の言語ではさらに他の用語(JavaScriptの「オブジェクト」、Rubyの「ハッシュ」、Luaの「テーブル」)を使用していますが、それらはすべてプログラミングでもそれぞれ別の意味を持つため、避けたいと思います。

詳細はこちらをご覧ください。


7
JAVAにはマップと辞書の両方がありませんか?そこでの違いは何ですか?
vivek_jonam 2012

35
@vivek_jonam:DictionaryJavaでは廃止されました。これは、Mapインターフェースが作成される前に使用される抽象クラスです。
BlueRaja-Danny Pflughoeft 2012

7
私は質問が言語にとらわれないことを知っているので、これは正しい答えですが、Javaが両方を持っている理由を探してここにたどり着いたので、このコメントは本当に私にとって完璧なものでした。
GrandOpener 2014

1
「テーブル」はluaで使用されます。
デデュプリケータ2015年

1
また、JSON では「オブジェクト」とも呼ばれ、(JavaScriptに関連する歴史的な理由により)
Aprillion '

20

一方はもう一方の古い用語です。通常、「辞書」という用語は、数学的な「マップ」が成立する前に使用されていました。また、辞書にはキータイプの文字列がある傾向がありますが、それはどこでも100%正しいとは限りません。


9

私の2セント。

辞書はJavaの抽象クラスであり、マップはインターフェースです。Javaは複数の継承をサポートしていないため、クラスがディクショナリを拡張する場合、他のクラスを拡張することはできません。

そのため、Mapインターフェースが導入されました。

辞書クラスは廃止され、マップの使用が推奨されます。


9

プログラマによって複雑になるこの質問に答えること、彼らが使用した特定の言語やシステムにおけるより具体的な意味を与えられた条件を見ますが、質問は、私が意味するように取っている「理論的には」言語に依存しない比較、を要求したコンピューティング科学用語で

用語の説明

コンピュータサイエンスのオックスフォード大学辞書には次のものがリストされています。

要素の挿入と削除、およびメンバーシップのテストをサポートできる要素のセットを表すデータ構造を辞書で検索します

  • たとえば、挿入できて削除を開始できる一連の要素{A、B、C、D ...}があり、「Cは存在しますか?」というクエリを実行できます

ただし、マップのコンピューティングサイエンスの概念は、オックスフォードディクショナリが次のように定義している数学的言語用語のマッピングに基づいています。

マッピング特定のセット(ドメイン)の各要素を2番目のセット(範囲)の1つ以上の要素に関連付ける操作。

  • そのため、マップデータ構造は、マップのキー」と呼ばれる特定のセットの要素から、関連する「」と呼ばれる2番目のセットの1つ以上の要素に移動する方法を提供します。
  • 「第二のセット内...以上の要素が」の態様は、実装によってサポートすることができる2つの別個の方法です。
    • 多くのマップ実装はキーの一意性を強制し、各キーを1つの値にのみ関連付けることを許可しますが、その値自体が、{{1、{"one"などの単純なデータ型の多くの値を含むデータ構造になる可能性があります、 "ichi"}、{2、{"two"、 "ni"}}}は、文字列のペアで構成される値を示しています。
    • 他のマップ実装では、同じまたは異なる値への各キーのマッピングを重複キーで許可します。これは、「関連付け...各[キー]要素...複数の[複数の] [値]要素を持つ」ケースを機能的に満たします。たとえば、{{1、 "one"}、{1、 "ichi"}、{2、 "two"}、{2、 "ni"}}。

対照的な辞書と地図

したがって、上記の厳密なComp Sci用語を使用すると、インターフェイスがすべての辞書に必要のない追加の操作をサポートする場合辞書は単なるマップになります。

  • 個別のキーおよびコンポーネントを持つ要素を保存する機能

  • キーのみを指定して値を取得する機能

ささいなひねり:

  • マップインターフェースは、{key、value}ペアがコンテナ内にあるかどうかのテストを直接サポートしない場合があります。これは、要素がたまたま{key、value}ペアである辞書の要件です。マップにはキーをテストする機能さえない場合がありますが、最悪の場合、キーによる試行された値の取得が成功したか失敗したかを確認できます。その場合、キーが期待した値を取得したかどうかを確認できます。

聴衆に明確に伝える

all上記のすべてにもかかわらず、上記で説明した厳密なコンピューティングサイエンスの意味で辞書を使用する場合、最初に読者がフォローすることを期待したり、用語を共有して擁護したときに感心したりしないでください。この質問に対する他の回答(およびその賛成票)は、「辞書」がほとんどのプログラマーの経験において「マップ」と同義になる可能性がどれほど高いかを示しています。より広く、明確に理解される用語を選択してみてください。例:

  • 連想コンテナ:値の取得とキーによる消去を伴うキーと値のペアを格納するコンテナ
  • ハッシュマップ:関連コンテナのハッシュテーブル実装
  • 一意のキーを強制するハッシュセット:要素の重複を挿入できない、個別のキー/値コンポーネントを含むものとして処理せずに要素/値を格納する辞書のハッシュテーブル実装
  • 重複キーをサポートするバイナリツリーマップのバランスをとる:...

特定の実装とComp Sci用語の相互参照

C ++標準ライブラリ

  • マップ:mapmultimapunordered_mapunordered_multimap
  • 他の辞書:setmultisetunordered_setunordered_multiset
  • 注:イテレータを持つか、std::findあなたが会員のための要素とテストを消去することができarrayvectorlistdequeなどが、コンテナのインタフェースは、直接要素を見つけることがO(N)で見事に非効率的であるため、ことをサポートしていませんが、いくつかのケースでは、インサート/消去IS非効率的であり、これらの操作をサポートすると、コンテナが意図的に制限するAPIが損なわれます。たとえば、dequesは、一部のキーではなく、前後での消去/ポップのみをサポートする必要があります。検索を調整するためにコードでより多くの作業を行う必要があるため、プログラマーは、より効率的な検索を備えたコンテナーデータ構造に切り替えることができます。

...後で他の言語を追加する場合があります/自由に編集してください...


3

通常、マップはハッシュテーブルに基づいていると想定しています。注文されていないストアを暗示しています。辞書は注文されたストアを暗示しています。

Trieと呼ばれるツリーベースの辞書があります。

Lispでは、次のようになります。

(a (n (d t)) n d )

これは単語をカプセル化します:

  • a
  • そして
  • 広告

上から葉へのトラバーサルが単語を生み出します。


4
Dictionary.Netでは順不同です。
BlueRaja-Danny Pflughoeft、2010年

2
ココア辞書も順不同です。
ケン

C ++ std::mapは注文されていますが、その実装は標準で指定されていませんstd::unordered_map。これはc ++ 11で導入され、ハッシュを介して実装されています
Harald Scheirich

3
@HaraldScheirich-C ++標準では「実装には赤黒木を使用する必要があります」と具体的には述べられていませんがstd::map、他のものを使用してみてください。AVLツリーは機能しません。挿入コストが基準を満たしていません。ハッシュは機能しません。ハッシュは順序付けされていないため、標準を満たしていません。標準では、「std::map明示的に言うことなく、実装には赤黒木を使用する必要があります」とほとんど述べています。
David Hammen、2015年

+1。辞書は多くのプラットフォームで順序付けされていませんが、単語は順序を意味します。用語マップの方が好きです。
nawfal 2015年

2

まったく同じではありません。マップは辞書のサブセットです。ここでは、辞書は挿入、削除、および検索機能を持つものとして定義さています。ジャワで使用される(に係る地図このする)値にマッピングするキーは厳密に一対一の関数としてマッピングされていることを要件と辞書です。ディクショナリには、1つの値に複数のキーマップがある場合や、Twitterハッシュタグ検索など、1つのキーマップに複数の値が含まれている場合があります(hasttableのチェーンなど)。

より「現実的な」例として、辞書で単語を検索すると、同じ単語の多くの定義が得られ、別のエントリ(他の単語を参照)を指すエントリが見つかると、いくつかの単語が表示されます同じ定義のリスト。現実の世界では、マップははるかに広く、名前の場所や座標の名前を付けることができますが、最近傍や他の属性(人口など)を見つけることもできるため、IMHOの拡張により、おそらくマップベースの実装を持つマップタイプですが、特にキーと値のペアだけを想定するのが最善です。特に、値に最も近いネイバーと他の属性はすべて値のデータメンバーにすぎない可能性があるためです。

Javaマップは、1対1の要件にもかかわらず、値がコレクション自体として一般化されている場合、または値が他の場所に格納されているコレクションへの参照にすぎない場合、一般化された辞書のようなものを実装できます。

JavaのメンテナはADT定義のメンテナではなく、Javaの決定は特にJavaのためのものであることを忘れないでください。


1

この概念の他の一般的な用語は、連想配列とハッシュです。


1
ハッシュはこれとは関係ありません。オブジェクトが異なるかどうかをすばやく検出する方法です。あなたはハッシュマップを考えています。これはハッシュを使用してマップ/辞書の仕事をします。
DJクレイワース2011

5
@DJClayworthいいえ、多くのプログラミング言語は実際にこれらのものをハッシュと呼んでいます。Rubyを参照してください。私はそれを設計しなかったし、それをそれとは呼びませんが、メッセンジャーを撃つことはありません。
ハンクゲイ

1

はい、同じです。ミックスに「連想配列」を追加できます。

using Hashtable またはHashofterは実装を指します。


1

そう純粋に理論的なレベルで。

辞書は、リンクされた値を見つけるために使用できる値です。マップは、別の値を見つける方法を説明する値です

単純な配列でさえ正しい値にマップするインデックスを持っているので、ノンリニアアクセスを許可するすべてのコレクション(つまり、最初に取得するか、最後に取得するだけ)はマップです。したがって、ディクショナリはマップの一種ですが、マップは可能な機能のはるかに広い範囲です。

実際には、通常は名前を定義するマッピング関数です。したがって、HashMapは、ハッシュアルゴリズムを使用してキーを値にリンクするマッピングデータ構造です。リンクされたリスト、ツリー、またはその他のアルゴリズムを介して保存できます。使用の端からは、通常、アルゴリズムが何であるかを気にしないので、汎用ディクショナリを使用し、アルゴリズムのタイプを推測する必要がある場合にのみ、他の構造の1つにシフトします。


-2

これらは、同じ概念の2つの異なる用語です。
HashtableそしてHashMapまた、同じ概念を参照してください。


3
実際、Hashtable / Hashmapは、名前に特定の実装を意味します(たとえば、C ++ std :: mapで使用されるバランスツリーなど)。
ジョー

一般に、実装について気にする必要はありません。(パフォーマンス上の理由を除いて)また、常にそうであるとは限りません。たとえば、.Netを見てください。
SLaks

-2

主な違いは、Mapでは、すべてのエントリ(値とキーのペア)に一意のキーが必要であることです。衝突が発生した場合、つまり、新しいエントリがすでにコレクションにあるエントリと同じキーを持つ場合、衝突処理が必要です。

通常、衝突は個別の連鎖のいずれかを使用して処理します。または線形プローブ

A 辞書は、複数のエントリが同じキーにリンクすることが可能になります。

マップが個別チェーンを実装している場合、マップは辞書に似ている傾向があります。

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