Sé que un mapa es una estructura de datos que asigna claves a valores. ¿No es un diccionario igual? ¿Cuál es la diferencia entre un mapa y un diccionario 1 ?
1. No estoy preguntando cómo se definen en el lenguaje X o Y (que parece ser lo que generalmente la gente pregunta aquí en SO), quiero saber cuál es su diferencia en teoría.
dictionary
data-structures
language-agnostic
key-value
elysium devorado
fuente
fuente
Respuestas:
Dos términos para la misma cosa:
"Mapa" es el término matemático correcto, pero se evita porque tiene un significado separado en la programación funcional .
Algunos idiomas usan otros términos ("Objeto" en Javascript, "Hash" en Ruby, "Tabla" en Lua) , pero todos tienen significados separados en la programación también, así que los evitaría.
Ver aquí para más información.
fuente
Dictionary
en Java está obsoleto. Es una clase abstracta, utilizada antes deMap
que se creara la interfaz.Uno es un término antiguo para el otro. Típicamente, el término "diccionario" se usaba antes de que el término matemático "mapa" se afianzara. Además, los diccionarios tienden a tener un tipo de cadena clave, pero eso no es 100% cierto en todas partes.
fuente
Mis 2 centavos
Dictionary es una clase abstracta en Java, mientras que Map es una interfaz. Dado que Java no admite múltiples herencias, si una clase extiende Diccionario, no puede extender ninguna otra clase.
Por lo tanto, se introdujo la interfaz de Mapa.
La clase de diccionario está obsoleta y se prefiere el uso de Map.
fuente
La respuesta a esta pregunta es complicada porque los programadores han visto que los términos tienen significados más específicos en lenguajes o sistemas particulares que han usado, pero la pregunta pide una comparación agnóstica del lenguaje "en teoría", que estoy entendiendo en términos de Ciencias de la Computación .
La terminología explicada
Las listas del Diccionario de Ciencias de la Computación de la Universidad de Oxford :
Sin embargo, la noción de mapa de Computing Science se basa en el mapeo de términos lingüísticos matemáticos , que el Diccionario de Oxford define como:
Diccionario y mapa contrastados
Entonces, utilizando la estricta terminología de Comp Sci anterior, un diccionario es solo un mapa si la interfaz admite operaciones adicionales que no se requieren en cada diccionario:
la capacidad de almacenar elementos con componentes clave y de valor distintos
la capacidad de recuperar los valores dados solo la clave
Un giro trivial:
Comunícate sin ambigüedades a tu audiencia
⚠ A pesar de todo lo anterior, si usa el diccionario en el estricto significado de la Ciencia de la Computación explicado anteriormente, no espere que su audiencia lo siga al principio, o se sorprenda cuando comparta y defienda la terminología. Las otras respuestas a esta pregunta (y sus votos positivos) muestran la probabilidad de que "diccionario" sea sinónimo de "mapa" en la experiencia de la mayoría de los programadores. Trate de elegir la terminología que se entenderá más ampliamente y sin ambigüedades: por ejemplo
Referencia cruzada de terminología de ciencia ficción con implementaciones específicas
Biblioteca estándar de C ++
map
,multimap
,unordered_map
,unordered_multimap
set
,multiset
,unordered_set
,unordered_multiset
std::find
puede borrar un elemento de prueba y para ser miembro dearray
,vector
,list
,deque
etc, pero las interfaces de contenedores no apoyan directamente que debido a la búsqueda de un elemento es espectacularmente ineficaz en O (N), en algunos casos de inserción / borrado está ineficiente, y el soporte de esas operaciones socava la API deliberadamente limitada que implica el contenedor, por ejemplo,deque
s solo debe admitir borrar / pop en la parte delantera y trasera y no en términos de alguna tecla. Tener que hacer más trabajo en el código para organizar la búsqueda suavemente alienta al programador a cambiar a una estructura de datos de contenedor con una búsqueda más eficiente.... puede agregar otros idiomas más tarde / no dude en editar en ...
fuente
Por lo general, supongo que un mapa está respaldado por una tabla hash; Connota una tienda desordenada. Los diccionarios connotan una tienda ordenada.
Hay un diccionario basado en árboles llamado Trie .
En Lisp, podría verse así:
Que encapsula las palabras:
El recorrido desde la parte superior hasta la hoja produce una palabra.
fuente
Dictionary
en .Net no está ordenado.std::map
se ordena su implementación no se especifica en el estándar,std::unordered_map
se introdujo en c ++ 11, se implementa a través de un hashstd::map
", intenta usar cualquier otra cosa. Un árbol AVL no funcionará; Sus costos de inserción no cumplen con el estándar. Un hash no funcionará; un hash no está ordenado y, por lo tanto, no cumple con el estándar. La norma dice "usarás un árbol rojo-negro para implementarstd::map
" sin decirlo explícitamente.Realmente no es lo mismo. Los mapas son un subconjunto de diccionario. El diccionario se define aquí como tener las funciones insertar, eliminar y buscar. El mapa utilizado por Java (de acuerdo con esto ) es un diccionario con el requisito de que la asignación de teclas a valores se asigne estrictamente como una función uno a uno. Un diccionario puede tener más de un mapa clave a un valor, o un mapa clave a varios valores (como encadenar en una tabla de hasthtable), por ejemplo, búsquedas de hashtag de Twitter.
Como un ejemplo más del "mundo real", buscar una palabra en un diccionario puede darnos varias definiciones para la misma palabra, y cuando encontramos una entrada que nos señala a otra entrada (ver otra palabra), varias palabras para la misma lista de definiciones. En el mundo real, los mapas son mucho más amplios, lo que nos permite tener ubicaciones para nombres o nombres para coordenadas, pero también podemos encontrar un vecino más cercano u otros atributos (poblaciones, etc.), por lo que en mi humilde opinión podría haber argumentos para una mayor expansión de es posible que el tipo de mapa tenga implementaciones basadas en gráficos, pero sería mejor asumir siempre solo el par clave-valor, especialmente porque el vecino más cercano y otros atributos del valor podrían ser solo miembros de datos del valor.
Los mapas de Java, a pesar del requisito uno a uno, pueden implementar algo más parecido a un diccionario generalizado si el valor se generaliza como una colección en sí misma, o si los valores son meramente referencias a colecciones almacenadas en otro lugar.
Recuerde que los mantenedores de Java no son los mantenedores de las definiciones ADT, y que las decisiones de Java son específicamente para Java.
fuente
Otros términos para este concepto que son bastante comunes: matriz asociativa y hash.
fuente
Sí, son lo mismo, puede agregar "Matriz asociativa" a la mezcla.
el uso
Hashtable
o unaHash
oferta se refiere a la implementación.fuente
así que en un nivel puramente teórico.
Un diccionario es un valor que se puede usar para localizar un valor vinculado. Un mapa es un valor que proporciona instrucciones sobre cómo ubicar otros valores
todas las colecciones que permiten el acceso no lineal (es decir, solo obtener primero o obtener el último) son un Mapa, ya que incluso un Array simple tiene un índice que se asigna al valor correcto. Entonces, mientras que un Diccionario es un Tipo de mapa, los mapas son un rango mucho más amplio de funciones posibles.
En la práctica, generalmente es la función de mapeo que define el nombre, por lo que un HashMap es una estructura de datos mapeada que utiliza un algoritmo de hash para vincular la clave con el valor, mientras que un diccionario no especifica cómo se vinculan las claves con un valor por lo que podría almacenarse a través de una lista vinculada, árbol o cualquier otro algoritmo. desde el final del uso, generalmente no le importa cuál es el algoritmo solo que funcionan, por lo que usa un diccionario genérico y solo cambia a una de las otras estructuras solo cuando necesita prever el tipo de algoritmo
fuente
Estos son dos términos diferentes para el mismo concepto.
Hashtable
yHashMap
también se refieren al mismo concepto.fuente
La principal diferencia es que un Mapa requiere que todas las entradas (valor y par de claves) tengan una clave única. Si se producen colisiones, es decir, cuando una nueva entrada tiene la misma clave que una entrada ya en la colección, se requiere el manejo de colisiones.
Por lo general, manejamos las colisiones usando el encadenamiento separado . O sondeo lineal .
Un diccionario permite que varias entradas se vinculen a la misma clave.
Cuando un mapa ha implementado el encadenamiento separado, tiende a parecerse a un diccionario.
fuente