Dictionary un dizionario è un contenitore che contiene coppie di dati del tipo ADT addendum Dictionary chiave/valore Paolo Bison funzionalità inserimento ricerca per chiave cancellazione data la chiave Fondamenti di Informatica 1 A.A. 2003/04 Università di Padova vincolo la chiave deve essere unica altri termini Association list Property list ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.2/13 ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.1/13 Property list in Java Dictionary classe Properties del package java.util java.util.Dictionary java.util.Hashtable java.util.Properties ciascuna chiave e il suo corrispondente valore sono stringhe metodi String getProperty(String) Object setProperty(String,String) Object remove(Object) dato l’insieme si ha delle chiavi e l’insieme dei valori, Tipo Dictionary insert Funzioni remove find properties di sistema System.getProperties() ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.3/13 Realizzazione di un Dictionary ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.4/13 Aumento delle prestazioni liste dinamiche non ordinate ordinate se si può usare un array che contiene i riferimenti ai valori, usando le chiavi come indici nell’array array che vengono ridimensionati non ordinati ordinati valore null indica che la chiave non è presente lista array non ordinato array ordinato insert find remove tutte le operazioni hanno complessità ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.5/13 Tabella ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.6/13 Pro e cons di una tabella un dizionario con chiavi numeriche intere viene detto tabella (table) chiave = 0 dato pro dizionario con prestazioni ottime cons chiavi numeri interi per chiavi qualunque deve esistere un funzione iniettiva null dato chiave = 2 dato " # dimensione della tabella: null ! chiave = 3 l’intervallo deve essere conosciuto a priori inefficiente uso della memoria & $ ) $ ( % ' fattore di riempimento (load factor) : numero dati contenuti dimensione tabella null ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.7/13 ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.8/13 Funzione di hash Collisione per ridurre lo spreco di memoria si fissa la dimensione della tabella e si usa una funzione di trasformazione delle chiavi: * * + , le due coppie chiave/valore collidono , - . funzione di hash generalmente non è invertibile: con e + + 0 risoluzione uso della prima locazione libera liste di coppie chiave/valore con la medesima chiave ridotta + 0 0 " 1 / / dato che due chiavi possono avere la stessa chiave ridotta può succedere che una locazione della tabella sia già occupata da un valore / esempio di funzione di hash se * + 2 3 chiave ridotta tabella hash (hash table) ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.10/13 ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.9/13 Tabella hash con bucket Prestazioni tabella hash con bucket ogni cella della tabella è una lista di elementi con la medesima chiave ridotta bucket è una delle liste associate ad una chiave ridotta dipendono dalle caratteristiche della funzione di hash si hanno prestazioni ottimali (tempo-costanti) se: dimensione tabella circa uguale al numero di dati da inserire load factor circa unitario funzione di hash genera chiavi ridotte uniformemente distribuite liste di lunghezza circa uguale la lunghezza media liste di lunghezza uno 4 hash = 0 chiave/valore chiave/valore null chiave/valore hash = 2 4 4 hash = 3 null chiave/valore chiave/valore null ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.11/13 Metodo hashCode in Java int hashCode() della classe Object restituisce una valore intero con buone proprietà di distribuzione uniforme il valore viene calcolato a partire dall’indirizzo di memoria dell’oggetto si può utilizzare qualunque oggetto come chiave per tabelle hash k= obj.hashCode() % n; ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.13/13 ADT addendum, Paolo Bison, A.A. 2003-04, 2003-12-01 – p.12/13