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