Qual è la differenza tra una mappa e un dizionario?


197

So che una mappa è una struttura di dati che associa le chiavi ai valori. Un dizionario non è lo stesso? Qual è la differenza tra una mappa e un dizionario 1 ?


1. Non sto chiedendo come sono definiti nel linguaggio X o Y (che sembra essere ciò che generalmente le persone chiedono qui su SO), voglio sapere qual è la loro differenza in teoria.


Ottima domanda!
NoName,

Risposte:


259

Due termini per la stessa cosa:

  • "Mappa" è utilizzata da Java, C ++
  • "Dizionario" è utilizzato da .Net, Python
  • "Matrice associativa" è utilizzata da PHP

"Mappa" è il termine matematico corretto, ma viene evitato perché ha un significato separato nella programmazione funzionale .

Alcuni linguaggi usano ancora altri termini ("Oggetto" in Javascript, "Hash" in Ruby, "Tabella" in Lua) , ma quelli hanno tutti significati separati anche nella programmazione, quindi li eviterei.

Vedi qui per maggiori informazioni.


7
JAVA non ha sia la mappa che il dizionario? Quali sono le differenze lì?
vivek_jonam,

35
@vivek_jonam: Dictionaryin Java è obsoleto. È una classe astratta, utilizzata prima della Mapcreazione dell'interfaccia.
BlueRaja - Danny Pflughoeft,

7
So che la domanda è indipendente dal linguaggio, quindi questa è la risposta giusta, ma sono finito qui cercando il motivo per cui Java aveva entrambi, quindi questo commento è stato davvero la cosa perfetta per me.
GrandOpener

1
"table" è usato in lua.
Deduplicatore

1
è anche un po 'confusamente chiamato "Oggetto" in JSON (per ragioni storiche legate a JavaScript)
Aprillion

20

Uno è un termine più vecchio per l'altro. Tipicamente il termine "dizionario" veniva usato prima che il termine matematico "mappa" prendesse piede. Inoltre, i dizionari tendono ad avere un tipo chiave di stringa, ma non è vero al 100% dappertutto.


9

I miei 2 centesimi.

Dizionario è una classe astratta in Java mentre Map è un'interfaccia. Poiché Java non supporta più ereditarietà, se una classe estende il dizionario, non può estendere altre classi.

Pertanto, è stata introdotta l'interfaccia della mappa.

La classe del dizionario è obsoleta e si preferisce l'uso di Map.


9

Rispondere a questa domanda è complicato dai programmatori che hanno visto i termini con significati più specifici in particolari lingue o sistemi che hanno usato, ma la domanda richiede un confronto agnostico del linguaggio "in teoria", che sto prendendo in considerazione in termini di Informatica .

Spiegazione della terminologia

Elenchi del Dizionario di informatica dell'Università di Oxford :

dizionario qualsiasi struttura di dati che rappresenta un insieme di elementi in grado di supportare l'inserimento e la cancellazione di elementi, nonché testare l'appartenenza

  • Ad esempio, abbiamo una serie di elementi {A, B, C, D ...} che siamo stati in grado di inserire e che potremmo iniziare a eliminare e siamo in grado di interrogare "è presente C?" .

La nozione di mappa della scienza informatica si basa però sul termine matematico linguistico mappatura , che l'Oxford Dictionary definisce come:

mapping Un'operazione che associa ogni elemento di un determinato set (il dominio) a uno o più elementi di un secondo set (l'intervallo).

  • Pertanto, una struttura di dati della mappa fornisce un modo per passare da elementi di un determinato set - noti sono " chiavi " nella mappa, a uno o più elementi nel secondo set - noti come " valori " associati .
  • L' aspetto "... o più elementi nel secondo set" può essere supportato da un'implementazione in due modi distinti:
    • Molte implementazioni di mappe applicano l'univocità delle chiavi e consentono a ciascuna chiave di essere associata a un solo valore, ma tale valore potrebbe essere in grado di essere una struttura di dati stessa contenente molti valori di un tipo di dati più semplice, ad esempio {{1, {"one" , "ichi"}, {2, {"two", "ni"}}} illustra valori costituiti da coppie di stringhe.
    • Altre implementazioni di mappe consentono a chiavi duplicate ciascuna mappatura di valori uguali o diversi, il che soddisfa funzionalmente gli "associati ... ogni elemento [chiave] ... con ... più [di uno] elementi [valore]". Ad esempio, {{1, "one"}, {1, "ichi"}, {2, "two"}, {2, "ni"}}.

Dizionario e mappa in contrasto

Quindi, usando la rigida terminologia Comp Sci sopra, un dizionario è solo una mappa se l'interfaccia supporta funzioni aggiuntive non richieste da ogni dizionario:

  • la capacità di memorizzare elementi con componenti chiave e di valore distinti

  • la capacità di recuperare i valori dati solo la chiave

Una svolta banale:

  • un'interfaccia della mappa potrebbe non supportare direttamente un test per stabilire se nel contenitore è presente una coppia {chiave, valore}, che è pedanticamente un requisito di un dizionario in cui gli elementi sono coppie {chiave, valore}; una mappa potrebbe non avere nemmeno una funzione per testare una chiave, ma nel peggiore dei casi puoi vedere se un tentativo di recupero del valore per chiave ha esito positivo o negativo, quindi se ti interessa puoi verificare se la chiave ha recuperato un valore previsto.

Comunica in modo inequivocabile al tuo pubblico

⚠ Nonostante tutto quanto sopra, se usi il dizionario nel significato rigoroso di Informatica spiegato sopra, non aspettarti che il tuo pubblico ti segua inizialmente o sia colpito quando condividi e difendi la terminologia. Le altre risposte a questa domanda (e ai loro voti) mostrano quanto è probabile che "dizionario" sia sinonimo di "mappa" nell'esperienza della maggior parte dei programmatori. Cerca di scegliere la terminologia che sarà compresa in modo più ampio e inequivocabile: ad es

  • contenitore associativo : qualsiasi contenitore che memorizza coppie chiave / valore con recupero valore e cancellazione per chiave
  • mappa hash : un'implementazione della tabella hash di un contenitore associato
  • hash set che impone chiavi uniche : un'implementazione della tabella hash di un dizionario che memorizza elementi / valori senza considerarli come contenenti componenti chiave / valore distinti, in cui non è possibile inserire duplicati degli elementi
  • bilancia la struttura ad albero binaria che supporta la chiave duplicata : ...

Terminologia di riferimento incrociato Sci Sci con implementazioni specifiche

Libreria standard C ++

  • mappe: map, multimap, unordered_map,unordered_multimap
  • altri dizionari: set, multiset, unordered_set,unordered_multiset
  • Nota: con iteratori o std::findsi può cancellare un elemento e la prova di adesione array, vector, list, dequeecc, ma le interfacce contenitore non supportano direttamente che perché trovare un elemento è spettacolarmente inefficiente a O (N), in alcuni casi, inserimento / cancellazione è inefficiente e il supporto di tali operazioni mina l'API deliberatamente limitata che il contenitore implica - ad esempio, dequei supporti dovrebbero solo cancellare / pop nella parte anteriore e posteriore e non in termini di chiave. Dover fare più lavoro nel codice per orchestrare la ricerca incoraggia delicatamente il programmatore a passare a una struttura di dati del contenitore con una ricerca più efficiente.

... può aggiungere altre lingue in un secondo momento / sentiti libero di modificare in ...


3

In genere suppongo che una mappa sia supportata da una tabella hash; connota un negozio non ordinato. I dizionari connotano un negozio ordinato.

Esiste un dizionario basato su alberi chiamato Trie .

In Lisp, potrebbe apparire così:

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

Che incapsula le parole:

  • un'
  • e
  • formica
  • un
  • anno Domini

L'incrocio dalla cima alla foglia dà una parola.


4
Dictionaryin .Net non è ordinato.
BlueRaja - Danny Pflughoeft,

2
Anche i dizionari di cacao non sono ordinati.
Ken,

std::mapViene ordinato C ++ , l'implementazione non è specificata nello standard, è std::unordered_mapstata introdotta in c ++ 11, è implementata tramite un hash
Harald Scheirich,

3
@HaraldScheirich - Mentre lo standard C ++ non dice specificamente "per implementare un albero rosso-nero std::map", prova a usare qualsiasi altra cosa. Un albero AVL non funzionerà; i suoi costi di inserzione non soddisfano lo standard. Un hash non funzionerà; un hash non è ordinato e quindi non soddisfa lo standard. Lo standard dice praticamente "dovrai usare un albero rosso-nero per implementare std::map" senza dirlo esplicitamente.
David Hammen,

+1. Sebbene i dizionari non siano ordinati in molte piattaforme, la parola connota un ordine. Mi piace di più il termine mappa.
nawfal,

2

Non proprio la stessa cosa. Le mappe sono un sottoinsieme del dizionario. Il dizionario è definito qui con le funzioni di inserimento, eliminazione e ricerca. Mappa utilizzata da Java (secondo questo ) è un dizionario con il requisito che i tasti che mappano i valori sono strettamente mappati come una funzione uno a uno. Un dizionario potrebbe avere più di una mappa chiave su un valore o una mappa chiave su più valori (come il concatenamento in una piattaforma), ad esempio ricerche di hashtag su Twitter.

Come esempio più "reale", cercare una parola in un dizionario può darci un numero di definizioni per la stessa parola, e quando troviamo una voce che ci indica un'altra voce (vedi altra parola), un numero di parole per lo stesso elenco di definizioni. Nel mondo reale, le mappe sono molto più ampie, permettendoci di avere posizioni per nomi o nomi per coordinate, ma possiamo anche trovare un vicino più vicino o altri attributi (popolazioni, ecc.), Quindi IMHO potrebbe esserci argomento per una maggiore espansione di il tipo di mappa potrebbe avere implementazioni basate su grafici, ma sarebbe meglio assumere sempre solo la coppia chiave-valore, soprattutto perché il vicino più vicino e altri attributi del valore potrebbero essere tutti membri di dati del valore.

Le mappe Java, nonostante il requisito uno a uno, possono implementare qualcosa di più simile a un dizionario generalizzato se il valore è generalizzato come una raccolta stessa o se i valori sono semplicemente riferimenti a raccolte archiviate altrove.

Ricordare che i manutentori Java non sono i manutentori delle definizioni ADT e che le decisioni Java sono specifiche per Java.


1

Altri termini per questo concetto che sono abbastanza comuni: array associativo e hash.


1
L'hash non ha niente a che fare con questo. È un metodo per rilevare rapidamente se gli oggetti sono diversi. Stai pensando a un hashmap, che usa un hash per eseguire il lavoro Mappa / Dizionario.
DJClayworth,

5
@DJClayworth No, molti linguaggi di programmazione in realtà chiamano queste cose hash. Vedi Ruby . Non l'ho progettato e non lo chiamerei così, ma non sparare al messaggero.
Hank Gay,

1

Sì, sono uguali, puoi aggiungere "Associative Array" al mix.

l'utilizzo Hashtable o un Hashofter si riferisce all'implementazione.


1

quindi a livello puramente teorico.

Un dizionario è un valore che può essere utilizzato per individuare un valore collegato. Una mappa è un valore che fornisce istruzioni su come individuare altri valori

tutte le raccolte che consentono l'accesso non lineare (ovvero ottengono solo il primo o l'ultimo) sono una mappa, poiché anche un semplice array ha un indice che mappa al valore corretto. Quindi, mentre un dizionario è un tipo di mappa, le mappe rappresentano una gamma molto più ampia di possibili funzioni.

In pratica a di solito è la funzione di mappatura che definisce il nome, quindi una HashMap è una struttura di dati mappata che utilizza un algoritmo di hashing per collegare la chiave al valore, dove come dizionario non specifica come le chiavi sono collegate a un valore quindi potrebbe essere memorizzato tramite un elenco collegato, albero o qualsiasi altro algoritmo. dal punto di vista dell'utilizzo di solito non ti interessa ciò che l'algoritmo funziona solo in modo da utilizzare un dizionario generico e passare a una delle altre strutture solo quando è necessario enfore il tipo di algoritmo


-2

Questi sono due termini diversi per lo stesso concetto.
Hashtablee HashMapsi riferiscono anche allo stesso concetto.


3
In realtà, Hashtable / Hashmap implicano un'implementazione specifica nel loro nome (rispetto ad un albero bilanciato, che è usato nella C ++ std :: map, per esempio).
Joe,

In generale, non dovresti preoccuparti dell'implementazione. (Tranne per motivi di prestazioni) Inoltre, non è sempre vero; guarda .Net, per esempio.
SLaks,

-2

La differenza principale è che una mappa richiede che tutte le voci (valore e coppia di chiavi) abbiano una chiave univoca. Se si verificano collisioni, ovvero quando una nuova voce ha la stessa chiave di una voce già presente nella raccolta, è necessaria la gestione delle collisioni.

Di solito, gestiamo le collisioni utilizzando l'uno o l'altro concatenamento . O probing lineare .

Un dizionario consente di collegare più voci alla stessa chiave.

Quando una mappa ha implementato il concatenamento separato, tende ad assomigliare a un dizionario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.