Mappe e dizionari
In questa pagina 5
Una mappa/dizionario è una collezione di entry (chiave, valore) che supporta ricerca, inserimento e rimozione per chiave. L'ADT ha varianti secondo due scelte: chiavi distinte o no, universo delle chiavi totalmente ordinato o no.
| Chiavi distinte | Universo ordinato | |
|---|---|---|
| Mappa | sì | no |
| Mappa ordinata | sì | sì |
| Multimappa o dizionario | no | no |
| Multimappa o dizionario ordinato | no | sì |
Nel testo adottato dizionario multimap. Le strutture studiate sono: tabelle hash per mappe non necessariamente ordinate (vedi Tabelle hashTabella hash per implementare una mappa: funzione hash = hash code + compression function, bucket array, separate chaining; hash code per numeri e stringhe (polynomial, cyclic shift), division e MAD; load factor, complessità al caso pessimo Theta(n) e medio O(1+lambda), rehashing; esempio svolto con inserimenti e collisioni.Tabelle hash →); alberi binari di ricerca, multi-way search tree e alberi (2,4) per mappe e dizionari ordinati (vedi Alberi binari di ricercaAlbero binario di ricerca come albero binario proprio con entry nei nodi interni e foglie vuote; inorder crescente; TreeSearch; get, put e remove (due casi, con predecessore inorder) in Theta(h); altezza fino a n-1; esempi di inserimenti; alberi aumentati con campi size e max e algoritmi di conteggio e interrogazione in O(h).Alberi binari di ricerca →, Multi-way search tree e alberi (2,4)Multi-way search tree (nodi con più entry, d figli e d-1 chiavi ordinate), ricerca in O(d_max h), un MWS tree con n entry ha n+1 foglie; albero (2,4): nodi con 2-4 figli e tutte le foglie alla stessa profondità, altezza Theta(log n) con dimostrazione, operazioni in Theta(log n); idea di overflow e underflow; tabella di confronto con gli alberi binari di ricerca.Multi-way search tree e alberi (2,4) →).
Applicazioni
- Database (anagrafica degli studenti): chiave = matricola, valore = informazioni dello studente.
- Compilatori, controllo dei tipi: chiave = nome della variabile, valore = tipo.
- Motori di ricerca: chiave = parola, valore = lista dei documenti che la contengono (lista invertita).
- Conteggio di frequenze: chiave = oggetto, valore = conteggio (ad esempio nell'analisi di sequenze biologiche, con oggetto = -mer, sequenza di caratteri).
L'ADT mappa
Mappa: entry con chiavi distinte provenienti da un dominio su cui è definito =; concetto analogo a un indice (associative array: la chiave è l'indice di accesso).
| Metodo | Effetto |
|---|---|
get(k) |
se esiste restituisce , altrimenti null |
put(k, v) |
se esiste lo sostituisce con e restituisce ; altrimenti inserisce e restituisce null |
remove(k) |
se esiste lo toglie e restituisce , altrimenti null |
keySet(), values(), entrySet() |
iteratori sulle chiavi, sui valori, sulle entry |
Con get(k) che restituisce null per "assente", un valore null non è distinguibile da una chiave mancante: per questo di solito si vietano valori null.
Implementazioni semplici ma poco efficienti
- Lista (doppiamente) concatenata non ordinata:
get,put,removerichiedono la ricerca lineare della chiave, al caso pessimo (la mappa non ha ordine, quindi non si può fare di meglio). - Array di taglia : se le chiavi sono interi nell'intervallo si usa la chiave come indice e le tre operazioni costano . Ma lo spazio è , spesso sproporzionato: il codice fiscale ha caratteri (nove lettere e sette cifre, quindi circa chiavi possibili) contro qualche milione di cittadini; inoltre servirebbe una corrispondenza chiave intero calcolabile in tempo costante.
La tabella hash nasce per tenere il tempo costante senza lo spazio proporzionale a .
Dizionario (multimap)
Ammette più entry con la stessa chiave. Metodi caratteristici:
get(k): restituisce una collezione (anche vuota) con tutti i valori associati a ;put(k, x): inserisce sempre una nuova entry , senza toccare le altre con la stessa chiave; non restituisce nulla;remove(k, v): toglie una entry con chiave e valore , se esiste; non restituisce nulla.
Implementazione con una mappa: le entry sono con collezione non vuota dei valori di (una doppia lista); rappresenta in modo compatto le entry . get e put costano come nella mappa (si aggiunge a se la entry esiste, altrimenti si crea con il solo ); remove(k, v) costa come nella mappa più un termine per cercare in ; se resta vuota si toglie la entry dalla mappa. In alternativa si modificano alberi di ricerca e alberi (2,4) per ammettere chiavi uguali.
Errori comuni
- Confondere mappa (chiavi distinte,
putsostituisce) e dizionario (putaggiunge sempre). - Usare una struttura che richiede l'ordine (albero di ricerca) per chiavi senza ordine totale.
- Dimenticare che
putrestituisce il vecchio valore.
Versione ripasso
- Collezione di entry (chiave, valore) con ricerca, inserimento, rimozione. Famiglia: mappa (chiavi distinte), mappa ordinata, dizionario/multimap (chiavi ripetute), dizionario ordinato; ordinata = universo totalmente ordinato.
- Strutture: tabelle hash (vedi Tabelle hashTabella hash per implementare una mappa: funzione hash = hash code + compression function, bucket array, separate chaining; hash code per numeri e stringhe (polynomial, cyclic shift), division e MAD; load factor, complessità al caso pessimo Theta(n) e medio O(1+lambda), rehashing; esempio svolto con inserimenti e collisioni.Tabelle hash →); alberi di ricerca e (2,4) (vedi Alberi binari di ricercaAlbero binario di ricerca come albero binario proprio con entry nei nodi interni e foglie vuote; inorder crescente; TreeSearch; get, put e remove (due casi, con predecessore inorder) in Theta(h); altezza fino a n-1; esempi di inserimenti; alberi aumentati con campi size e max e algoritmi di conteggio e interrogazione in O(h).Alberi binari di ricerca →, Multi-way search tree e alberi (2,4)Multi-way search tree (nodi con più entry, d figli e d-1 chiavi ordinate), ricerca in O(d_max h), un MWS tree con n entry ha n+1 foglie; albero (2,4): nodi con 2-4 figli e tutte le foglie alla stessa profondità, altezza Theta(log n) con dimostrazione, operazioni in Theta(log n); idea di overflow e underflow; tabella di confronto con gli alberi binari di ricerca.Multi-way search tree e alberi (2,4) →).
- Mappa:
get(k)(valore onull),put(k,v)(restituisce il vecchio valore onull),remove(k),keySet,values,entrySet. - Applicazioni: database (matricola), tipo delle variabili, lista invertita, conteggio di frequenze.
- Semplici ma lente: lista non ordinata ; array indicizzato dalle chiavi ma spazio (codice fiscale: chiavi possibili).
- Dizionario:
get(k)restituisce una collezione;put(k,x)aggiunge sempre;remove(k,v). Realizzato con una mappa con lista dei valori: stessi costi più inremove. - Errori: mappa e dizionario scambiati; albero di ricerca su chiavi non ordinate;
putrestituisce il vecchio valore.