web-dev-qa-db-fra.com

Quelle est la différence entre une carte et un dictionnaire?

Je sais qu'une carte est une structure de données qui associe des clés à des valeurs. Un dictionnaire n'est-il pas pareil? Quelle est la différence entre une carte et un dictionnaire1?


1. Je ne demande pas comment ils sont définis dans la langue X ou Y (ce qui semble être ce que les gens demandent en général ici sous SO), je veux savoir quelle est leur différence en théorie .

147
devoured elysium

Deux termes pour la même chose:

  • "Map" est utilisé par Java, C++
  • "Dictionnaire" est utilisé par .Net, Python
  • "Tableau associatif" est utilisé par PHP

"Carte" est le terme mathématique correct, mais il est évité car il a une signification distincte dans programmation fonctionnelle .

Certaines langues utilisent encore d'autres termes ("Objet" en Javascript, "Hash" en Ruby, "Table" en Lua), mais ceux-ci ont également des significations distinctes dans la programmation, je les éviterais donc.

Voir ici pour plus d'informations.

L'un est un terme plus ancien pour l'autre. Typiquement, le terme "dictionnaire" était utilisé avant que le terme mathématique "carte" ne prenne forme. De plus, les dictionnaires ont tendance à avoir un type de chaîne clé, mais ce n'est pas vrai à 100% partout.

17
Edwin Buck

En général, je suppose qu'une carte est sauvegardée par une table de hachage; il désigne un magasin non ordonné ... Les dictionnaires désignent un magasin commandé.

Il existe un dictionnaire arborescent appelé Trie .

Dans LISP, cela pourrait ressembler à ceci:

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

Qui encapsule les mots:

  • une 
  • et 
  • fourmi
  • un 
  • un d

Le parcours du haut vers la feuille donne un mot. 

3
Paul Nathan

Mes 2 centimes 

Dictionary est une classe abstraite en Java alors que Map est une interface. Comme Java ne prend pas en charge plusieurs héritages, si une classe étend Dictionary, elle ne peut étendre aucune autre classe.

Par conséquent, l'interface de carte a été introduite. 

La classe de dictionnaire est obsolète et l'utilisation de Map est préférable.

3
Nishit

Pas vraiment la même chose. Les cartes sont un sous-ensemble du dictionnaire. Dictionnaire est défini ici comme ayant les fonctions insérer, supprimer et rechercher. Le mappage utilisé par Java (selon this ) est un dictionnaire qui exige que les mappages de clés sur des valeurs soient strictement mappés en tant que fonction un-à-un. Un dictionnaire peut avoir plusieurs mappages de clés pour une valeur ou un mappage de plusieurs valeurs (comme l'enchaînement dans une hasthtable), par exemple les recherches sur Twitter avec un hashtag.

En tant qu’exemple plus "réel", la recherche d’un mot dans un dictionnaire peut nous donner un certain nombre de définitions pour le même mot, et lorsque nous trouvons une entrée qui nous indique une autre entrée (voir autre mot), un certain nombre de mots. pour la même liste de définitions. Dans le monde réel, les cartes sont beaucoup plus larges, nous permettant d’avoir des emplacements pour les noms ou des noms pour les coordonnées, mais nous pouvons aussi trouver un voisin le plus proche ou d’autres attributs (populations, etc.). le type de carte peut éventuellement avoir des implémentations basées sur des graphes, mais il serait préférable de toujours considérer uniquement la paire clé-valeur, d'autant plus que les attributs les plus proches et les autres attributs de la valeur peuvent tous être simplement des membres de données de la valeur. 

Les cartes Java, malgré l'exigence un-à-un, peuvent implémenter quelque chose qui ressemble davantage à un dictionnaire généralisé si la valeur est généralisée en tant que collection elle-même ou si les valeurs ne sont que des références à des collections stockées ailleurs. 

N'oubliez pas que les responsables Java ne sont pas les responsables des définitions ADT, et que les décisions Java sont spécifiquement destinées à Java. 

1
user6585083

Oui, ils sont identiques, vous pouvez ajouter "Array associatif" au mixage.

utiliser Hashtable ou un Hash ofter fait référence à l'implémentation. 

1
OscarRyz

donc sur un niveau purement théorique.

Un dictionnaire est une valeur qui peut être utilisée pour localiser une valeur liée . Une carte est une valeur qui fournit des instructions sur la façon de localiser d'autres valeurs.

toutes les collections qui permettent un accès non linéaire (c'est-à-dire seulement le premier ou le dernier) constituent une carte, car même un simple tableau a un index qui correspond à la valeur correcte. Ainsi, alors qu'un dictionnaire est un type de carte, les cartes constituent un éventail beaucoup plus large de fonctions possibles.

En pratique, c'est généralement la fonction de mappage qui définit le nom. HashMap est donc une structure de données mappée qui utilise un algorithme de hachage pour lier la clé à la valeur. En tant que dictionnaire, le dictionnaire ne spécifie pas comment les clés sont liées à une valeur. peut être stocké via une liste chaînée, une arborescence ou tout autre algorithme. du point de vue de l'utilisation, vous ne vous souciez généralement pas de ce que l'algorithme fonctionne, vous utilisez donc un dictionnaire générique et ne passez à l'une des autres structures que lorsque vous devez définir le type d'algorithme. 

1
MikeT

Autres termes assez courants pour ce concept: tableau associatif et hachage.

0
Hank Gay

La principale différence est que/ Map , nécessite que toutes les entrées (paire valeur/clé) aient une clé unique. Si des collisions se produisent, c'est-à-dire lorsqu'une nouvelle entrée a la même clé qu'une entrée déjà dans la collection, la gestion des collisions est requise.

Habituellement, nous traitons les collisions en utilisant soit Chaînage séparé . Ou Sondage linéaire .

Un Dictionnaire permet de relier plusieurs entrées à la même clé.

Lorsqu'une carte a implémenté le chaînage séparé, elle a tendance à ressembler à un dictionnaire.

0
Bondo Kalombo

La réponse à cette question est compliquée par le fait que les programmeurs ont vu les termes avoir une signification plus précise dans des langages ou des systèmes particuliers qu'ils ont utilisés, mais la question demande une comparaison agnostique des langues "en théorie", ce que je veux dire par en termes de science informatique.

La terminologie expliquée

L’Université d’Oxford Dictionnaire informatique répertorie:

dictionnaire toute structure de données représentant un ensemble d'éléments pouvant prendre en charge l'insertion et la suppression d'éléments, ainsi que le test d'adhésion.

  • Par exemple, nous avons un ensemble d'éléments {A, B, C, D ...} que nous avons pu insérer et que nous pourrions commencer à supprimer, et nous pouvons interroger "C est présent?".

La notion de science informatique de map est cependant basée sur le terme linguistique mathématique mapping, défini par le dictionnaire Oxford comme étant:

mapping Opération qui associe chaque élément d'un ensemble donné (le domaine) à un ou plusieurs éléments d'un second ensemble (la plage).

  • En tant que telle, une structure de données map fournit un moyen de passer de éléments d'un ensemble donné - connus sont "clés" dans la carte, à un ou plusieurs éléments du second ensemble - appelés "valeur (s))" associés.
  • L'aspect "... ou plusieurs éléments de la deuxième série" peut être pris en charge par une implémentation de deux manières différentes:
    • De nombreuses implémentations de carte imposent l’unicité des clés et permettent uniquement d’associer chaque clé à une valeur, mais cette valeur peut éventuellement être une structure de données contenant elle-même de nombreuses valeurs d’un type de données plus simple, par ex. {{1, {"un", "ichi"}, {2, {"deux", "ni"}}} illustre des valeurs constituées de paires de chaînes.
    • D'autres implémentations de carte autorisent les doublons de clés, chaque mappage sur la même valeur ou sur des valeurs différentes - ce qui satisfait fonctionnellement la casse "associe ... chaque élément [clé] ... avec ... plus [plus d'un] [valeur] éléments". Par exemple, {{1, "un"}, {1, "ichi"}, {2, "deux"}, {2, "ni"}}.

Dictionnaire et carte contrastés

Ainsi, en utilisant la terminologie stricte de Comp Sci ci-dessus, un dictionnaire n'est qu'une carte si l'interface prend en charge des opérations supplémentaires non requises pour chaque dictionnaire:

  • possibilité de stocker des éléments avec des composants clé _ et valeur distincts

  • la possibilité de récupérer la ou les valeurs données uniquement à la clé

Une torsion triviale:

  • une interface de carte peut ne pas prendre en charge directement le test permettant de déterminer si une paire {clé, valeur} se trouve dans le conteneur, ce qui est une exigence pédagogique d'un dictionnaire dans lequel les éléments se trouvent être des paires {clé, valeur}; une carte peut même ne pas avoir de fonction pour tester une clé, mais au pire, vous pouvez voir si une tentative d'extraction de valeur par clé réussit ou échoue. Si vous y tenez, vous pouvez vérifier si la clé a récupéré une valeur attendue.

Communiquez sans ambiguïté à votre public

Malgré tout ce qui précède, si vous utilisez dictionnaire dans le sens strict de la science informatique expliqué ci-dessus, ne vous attendez pas à ce que votre auditoire vous suive au départ ou ne soyez pas impressionné lorsque vous partagez et défendez la terminologie. Les autres réponses à cette question (et leurs votes positifs) montrent la probabilité que "dictionnaire" soit synonyme de "carte" dans l'expérience de la plupart des programmeurs. Essayez de choisir une terminologie qui sera comprise plus largement et sans ambiguïté: par ex.

  • conteneur associatif: tout conteneur stockant des paires clé/valeur avec récupération de valeur et effacement par clé
  • hash map: une implémentation de table de hachage d'un conteneur associé
  • ensemble de hachages imposant des clés uniques}: une table de hachage implémentant un dictionnaire stockant des éléments/valeurs sans les traiter comme contenant des composants clé/valeur distincts, dans lesquels les doublons des éléments ne peuvent pas être insérés
  • balance mappe d'arborescence binaire supportant la clé dupliquée: ...

Crossreferencing Comp Sci terminology avec des implémentations spécifiques

Bibliothèque standard C++

  • maps: map , multimap , unordered_map , unordered_multimap
  • autres dictionnaires: set , multiset , unordered_set , unordered_multiset
  • remarque: avec les itérateurs ou std::find vous pouvez effacer un élément et tester l'appartenance à array , vector , list , deque etc, mais le conteneur s'interface don Ne soutenez pas directement que parce que trouver un élément est spectaculairement inefficace en O (N), dans certains cas, insérer/effacer est inefficace, et soutenir ces opérations mine l’API délibérément limité que le conteneur implique - par exemple: deques ne devrait supporter que l'effacement/le pop à l'avant et à l'arrière et non en termes de touches. Le fait de devoir travailler davantage dans le code pour orchestrer la recherche encourage le programmeur à passer à une structure de données de conteneur avec une recherche plus efficace.

... peut ajouter d'autres langues ultérieurement/n'hésitez pas à modifier ...

0
Tony Delroy