ADT addendum Dictionary Dictionary un dizionario è un

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