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 .
Deux termes pour la même chose:
"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.
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:
Le parcours du haut vers la feuille donne un mot.
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.
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.
Oui, ils sont identiques, vous pouvez ajouter "Array associatif" au mixage.
utiliser Hashtable
ou un Hash
ofter fait référence à l'implémentation.
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.
Autres termes assez courants pour ce concept: tableau associatif et hachage.
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.
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.
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.
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).
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:
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.
map
, multimap
, unordered_map
, unordered_multimap
set
, multiset
, unordered_set
, unordered_multiset
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: deque
s 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 ...