Definizione informale
Il TDA Dictionary
„ Il
TDA Dictionary (dizionario) modella
una collezione di voci su cui è possibile
effettuare delle ricerche
– Una voce è una coppia (chiave, elemento)
„ Le
principali operazioni di un dizionario
sono la ricerca, l’inserimento e
cancellazione
„ Più voci possono avere la stessa chiave
Prof. Carlo Blundo
„ size()
linguistici
„ isEmpty()
– coppie (parola,definizione)
„ Sistema
2
I metodi del TDA Dictionary – 1
Applicazioni
„ Dizionari
Laboratorio di Algoritmi e Strutture Dati
„ findElement(key)
– Se esiste una voce con chiave key, ne
restituisce l’elemento, altrimenti restituisce
l’elemento speciale NO_SUCH_KEY
DNS
– coppie (nome dominio, indirizzo IP)
„ findAllElements(key)
• (caprera.dia.unisa.it, 192.41.218.62)
– Restituisce un iteratore di tutte le voci che
hanno chiave key
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
3
I metodi del TDA Dictionary – 2
„ keys()
– Restituisce un iteratore su tutte le chiavi
del dizionario
Prof. Carlo Blundo
„ insertItem(key,
„
Laboratorio di Algoritmi e Strutture Dati
removeElement(key)
– Se esiste una voce con chiave key, la rimuove
restituendone l’elemento, altrimenti restituisce
l’elemento speciale NO_SUCH_KEY
„
remove(v)
– cancella la voce v dal dizionario
„ entries()
element)
– Restituisce un iteratore su tutte le voci nel
dizionario
– Inserisce la voce (key, element)
Prof. Carlo Blundo
4
I metodi del TDA Dictionary – 3
„ elements()
– Restituisce un iteratore su tutte le voci del
dizionario
Laboratorio di Algoritmi e Strutture Dati
5
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
6
1
NO_SUCH_KEY
Note – 1
„
In seguito vedremo come implementare
l’elemento speciale NO_SUCH_KEY
„
Non viene lanciata un’eccezione al suo posto
perché, in un dizionario, è normale cercare
una chiave che potrebbe non appartenere al
dizionario stesso
„
– È una sentinella
„
Laboratorio di Algoritmi e Strutture Dati
7
essere
– È la classe Item che abbiamo utilizzato
nell’implementazione della coda a priorità
„
Una qualsiasi implementazione del TDA
Dictionary avrà una variabile di istanza _cmp
simile ad un’istanza di Comparator
– Viene usata per confrontare le chiavi delle voci
– Inoltre gestire un’eccezione è più lento che
eseguire un test su di una sentinella
Prof. Carlo Blundo
Una voce del dizionario può
rappresentata da una classe Entry
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
Note – 2
Algoritmo per findAll(key)
I metodi presenti nell’interfaccia Dictionary
devono lanciare l’eccezione InvalidKeyException
se la chiave specificata non una chiave valida
per il contenitore in esame
Input: Una chiave k
Output: Un iteratore sulle voci con chiave uguale a k
Creare una lista vuota L
B = this.entries()
while B.hasNext() do
e = B.next()
if e.key() == k then
L.insertLast(e)
return L.elements()
private void checkKey(Object key) {
if (!_cmp.isComparable(key))
throw new InvalidKeyException(
" Chiave non confrontabile ");
}
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
9
Prof. Carlo Blundo
// Possono essere sostituiti
// da un accesso diretto
// alle voci
Laboratorio di Algoritmi e Strutture Dati
Tipi di dizionari
Dizionari non ordinati
„ Esistono
„
due tipi di dizionari
– Dizionari non ordinati
„
• Non c’è una relazione d’ordine tra le chiavi
• Dobbiamo solo verificare se due chiavi sono
uguali
• Esiste una relazione d’ordine tra le chiavi
Laboratorio di Algoritmi e Strutture Dati
10
Non è definita alcuna relazione di
ordinamento sulle chiavi
Si può solo stabilire sono se due chiavi sono
uguali o meno
– Al costruttore del dizionario viene passato un
oggetto detto equality tester che supporta un
metodo isEqualTo che verifica se due chiavi sono
uguali o meno
– L’equality tester è una versione ridotta del
comparatore
– Dizionari ordinati
Prof. Carlo Blundo
8
11
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
12
2
EqualityTester
Il log file – 1
public interface EqualityTester {
„ Un
log file è un dizionario non ordinato
implementato tramite una sequenza
„ Le
voci sono memorizzate nella
sequenza in un ordine arbitrario
„ insertItem richiede tempo O(1) se
implementata con InserFirst o InsertLast
boolean isEqualTo(Object x, Object y);
boolean isComparable(Object x);
}
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
13
findElement e removeElement richiedono
tempo O(n)
– Il caso pessimo si verifica quando la chiave non è
presente nel dizionario
– Bisogna scandire l’intera sequenza per trovare la
voce con la chiave desiderata
„
public LogFile(EqualityTester eq) {
LF = new NodeSequence(); _cmp = eq;}
public Object findElement(Object key) {
// Cerca la voce con chiave key
else return NO_SUCH_KEY;
}
– si tratta di un dizionario di piccola dimensione
– si effettuano molti inserimenti e poche operazioni
di cancellazione e di ricerca
Laboratorio di Algoritmi e Strutture Dati
14
public class LogFile implements Dictionary {
private NodeSequence LF;
private EqualityTester _cmp;
Conviene implementare un dizionario come
log file solo se
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
Implementazione di LogFile – 1
Il log file – 2
„
Prof. Carlo Blundo
15
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
16
Utilizzo della classe LogFile
Implementazione di LogFile – 2
public class Prova {
public static final NoKey NO_SUCH_KEY =
new NoKey();
static final class NoKey {
private String _msg;
public NoKey() {
_msg = "Dictionary.NO_SUCH_KEY";
}
}
}
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
private LogFile F = new LogFile();
public void funzioneQualsiasi(Object key) {
if (F.findElement(key) == LogFile.NO_SUCH_KEY)
System.out.println("Chiave non trovata");
else
System.out.println("Chiave trovata");
}
}
17
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
18
3
Esercizio
Dizionari ordinati
„ Completare
l’implementazione
della
classe LogFile
– Scrivere la classe che rappresenta le voci
nel LogFile
– Scrivere la classe che implementa
EqualityTester per confrontare le chiavi
associate alle voci presenti nel LogFile
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
19
Il TDA OrderedDictionary – 1
„
„ Sulle
chiavi è definita una relazione di
ordine totale
„ Al costruttore del dizionario viene
passato
un
comparatore
come
argomento
„ Si possono definire metodi addizionali
che fanno riferimento all’ordinamento
delle chiavi
Prof. Carlo Blundo
– closestKeyAfter(k)
• Restituisce la chiave della voce con la chiave più
piccola tra quelle maggiori o uguali di k
– closestKeyBefore(k)
• Restituisce la chiave della voce con la chiave più
grande tra quelle minori o uguali di k
– closestElementAfter(k)
• Restituisce l’elemento della chiave con la chiave
più piccola tra quelle maggiori o uguali di k
– closestElementBefore(k)
• Restituisce l’elemento della voce con la chiave più
grande tra quelle minori o uguali di k
Laboratorio di Algoritmi e Strutture Dati
21
Tabella di ricerca – 1
„ Una
tabella
l’implementazione
ordinato
di
di
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
22
Tabella di ricerca – 2
ricerca
è
un dizionario
– Le voci vengono immagazzinate in una
sequenza o in un vettore
– Le voci sono ordinate in base al valore
delle chiavi
– Si usa un comparatore esterno per
confrontare le chiavi
Prof. Carlo Blundo
20
Il TDA OrderedDictionary – 2
In aggiunta ai metodi del TDA dizionario
supporta
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
Laboratorio di Algoritmi e Strutture Dati
23
„
findElement
– richiede tempo O(log n)
binaria
„
con la ricerca
insertItem e removeElement
– Con l’implementazione tramite vettore
richiedono tempo O(n) perché occorre
spostare al più n voci
– Che cosa si può dire per l’implementazione
mediante sequenza?
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
24
4
Quando si usa la tabella di ricerca
Esercizio
„È
indicato implementare un dizionario
come una tabella di ricerca solo se
– si tratta di un dizionario piccolo
– si effettuano molte operazioni di ricerca e
poche operazioni di inserimento e
cancellazione
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
25
„ Implementare
il TDA OrderedDictionary
tramite una tabella di ricerca
„ Scrivere
un programma per testare tutti
i metodi dell’implementazione
Prof. Carlo Blundo
Laboratorio di Algoritmi e Strutture Dati
26
5