Eu sei que um mapa é uma estrutura de dados que mapeia chaves para valores. Um dicionário não é o mesmo? Qual é a diferença entre um mapa e um dicionário 1 ?
1. Não estou perguntando como eles são definidos na linguagem X ou Y (que parece ser o que geralmente as pessoas estão perguntando aqui no SO), quero saber qual é a diferença deles na teoria.
dictionary
data-structures
language-agnostic
key-value
elísio devorado
fonte
fonte
Respostas:
Dois termos para a mesma coisa:
"Mapa" é o termo matemático correto, mas é evitado porque tem um significado separado na programação funcional .
Algumas linguagens ainda usam outros termos ("Objeto" em Javascript, "Hash" em Ruby, "Tabela" em Lua) , mas todos eles têm significados separados na programação também, então eu os evitaria.
Veja aqui para mais informações.
fonte
Dictionary
em Java é obsoleto. É uma classe abstrata, usada antes daMap
criação da interface.Um é um termo antigo para o outro. Normalmente, o termo "dicionário" foi usado antes que o termo matemático "mapa" se estabelecesse. Além disso, os dicionários tendem a ter um tipo de string chave, mas isso não é 100% verdadeiro em todos os lugares.
fonte
Meus 2 centavos.
Dictionary é uma classe abstrata em Java, enquanto Map é uma interface. Como o Java não suporta várias heranças, se uma classe estender o Dictionary, não poderá estender nenhuma outra classe.
Portanto, a interface do mapa foi introduzida.
A classe Dictionary é obsoleta e o uso do Map é preferido.
fonte
Responder a essa pergunta é complicado porque os programadores viram os termos com significados mais específicos em idiomas ou sistemas específicos que eles usaram, mas a pergunta pede uma comparação independente da linguagem "na teoria", o que eu entendo nos termos da Ciência da Computação .
A terminologia explicada
O Dicionário de Ciência da Computação da Universidade de Oxford lista:
A noção de mapa da Computing Science é baseada no mapeamento matemático de termos linguísticos , que o Dicionário Oxford define como:
Dicionário e mapa contrastados
Portanto, usando a terminologia estrita do Comp Sci acima, um dicionário é apenas um mapa se a interface oferecer suporte a operações adicionais não necessárias em todos os dicionários:
a capacidade de armazenar elementos com componentes distintos de chave e valor
a capacidade de recuperar o (s) valor (es) fornecido (s) apenas a chave
Uma torção trivial:
Comunique-se de maneira inequívoca com seu público
⚠ Apesar de tudo o que foi exposto acima, se você usar o dicionário no estrito significado da Ciência da Computação explicado acima, não espere que o seu público o siga inicialmente ou fique impressionado ao compartilhar e defender a terminologia. As outras respostas a esta pergunta (e seus upvotes) mostram como é provável que "dicionário" seja sinônimo de "mapa" na experiência da maioria dos programadores. Tente escolher uma terminologia que seja compreendida de maneira mais ampla e inequívoca: por exemplo
Terminologia de referência cruzada Comp Sci com implementações específicas
Biblioteca Padrão C ++
map
,multimap
,unordered_map
,unordered_multimap
set
,multiset
,unordered_set
,unordered_multiset
std::find
você pode apagar um elemento e teste de adesão emarray
,vector
,list
,deque
etc, mas as interfaces de recipiente não suportam diretamente que porque encontrar um elemento é espetacularmente ineficiente em O (N), em alguns casos, inserir / apagar estiver ineficiente e o suporte a essas operações prejudicam a API deliberadamente limitada que o contêiner implica - por exemplo,deque
s devem suportar apenas apagar / pop na frente e atrás e não em termos de alguma chave. Ter que trabalhar mais em código para orquestrar a pesquisa encoraja gentilmente o programador a mudar para uma estrutura de dados de contêiner com uma pesquisa mais eficiente.... pode adicionar outros idiomas mais tarde / pode editar em ...
fonte
Normalmente, assumo que um mapa é apoiado por uma tabela de hash; conota uma loja não ordenada. Os dicionários conectam uma loja solicitada.
Há um dicionário baseado em árvore chamado Trie .
No Lisp, pode ser assim:
O que encapsula as palavras:
A travessia do topo para a folha produz uma palavra.
fonte
Dictionary
no .Net não é ordenado.std::map
é ordenado, sua implementação não está especificada no padrão,std::unordered_map
foi introduzida no c ++ 11, é implementada através de um hashstd::map
", tente usar qualquer outra coisa. Uma árvore AVL não funcionará; seus custos de inserção não atendem ao padrão. Um hash não funciona; um hash é desordenado e, portanto, não atende ao padrão. O padrão praticamente diz "você usará uma árvore vermelho-preta para implementarstd::map
" sem dizer isso explicitamente.Não é realmente a mesma coisa. Mapas são um subconjunto de dicionário. Dicionário é definido aqui como tendo as funções de inserção, exclusão e localização. O mapa usado pelo Java (de acordo com isso ) é um dicionário com o requisito de que o mapeamento de chaves para valores seja mapeado estritamente como uma função individual. Um dicionário pode ter mais de um mapa de chave para um valor ou um mapa de chave para vários valores (como encadeamento em uma tabela de hash), por exemplo, pesquisas de hashtag no Twitter.
Como um exemplo mais "mundo real", procurar uma palavra em um dicionário pode nos dar várias definições para a mesma palavra e, quando encontramos uma entrada que nos aponta para outra entrada (veja outra palavra), várias palavras para a mesma lista de definições. No mundo real, os mapas são muito mais amplos, permitindo que tenhamos locais para nomes ou nomes para coordenadas, mas também podemos encontrar um vizinho mais próximo ou outros atributos (populações, etc.), então IMHO poderia haver argumentos para uma maior expansão de o tipo de mapa pode ter implementações baseadas em gráfico, mas seria melhor sempre assumir apenas o par de valores-chave, especialmente porque o vizinho mais próximo e outros atributos do valor poderiam ser apenas membros de dados do valor.
Os mapas java, apesar do requisito individual, podem implementar algo mais como um dicionário generalizado se o valor for generalizado como uma coleção em si, ou se os valores forem meramente referências a coleções armazenadas em outro local.
Lembre-se de que os mantenedores de Java não são os mantenedores das definições de ADT e que as decisões de Java são especificamente para Java.
fonte
Outros termos desse conceito bastante comuns: array associativo e hash.
fonte
Sim, eles são iguais, você pode adicionar "Matriz associativa" à mistura.
usando
Hashtable
ouHash
ofter refere-se à implementação.fonte
assim, em um nível puramente teórico.
Um dicionário é um valor que pode ser usado para localizar um valor vinculado. Um mapa é um valor que fornece instruções sobre como localizar outros valores
todas as coleções que permitem acesso não linear (ou seja, apenas obtêm o primeiro ou o último) são um mapa, pois mesmo uma matriz simples possui um índice que mapeia o valor correto. Assim, enquanto um dicionário é um tipo de mapa, os mapas são uma gama muito mais ampla de funções possíveis.
Na prática, geralmente é a função de mapeamento que define o nome; portanto, um HashMap é uma estrutura de dados mapeada que usa um algoritmo de hash para vincular a chave ao valor, enquanto um dicionário não especifica como as chaves são vinculadas a um valor. portanto, pode ser armazenado através de uma lista vinculada, árvore ou qualquer outro algoritmo. do ponto de uso, geralmente você não se importa com o algoritmo que eles funcionam, então você usa um dicionário genérico e só muda para uma das outras estruturas apenas quando precisar do tipo de algoritmo
fonte
Estes são dois termos diferentes para o mesmo conceito.
Hashtable
eHashMap
também se referem ao mesmo conceito.fonte
A principal diferença é que um mapa exige que todas as entradas (valor e par de chaves) tenham uma chave única. Se ocorrerem colisões, ou seja, quando uma nova entrada tiver a mesma chave que uma entrada já existente na coleção, será necessário o tratamento de colisões.
Normalmente, lidamos com colisões usando um encadeamento separado . Ou sondagem linear .
Um dicionário permite que várias entradas sejam vinculadas à mesma chave.
Quando um mapa implementa o encadeamento separado, ele tende a se parecer com um dicionário.
fonte