SimpleList: Realizzazione. Strutture dati. Strutture dati lineari: liste. SimpleList: rappresentazione collegata. Lista semplice: SimpleList

Documenti analoghi
La struttura dati CODA

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

SOMMARIO STACK. STACK: specifica STACK

Algoritmi e strutture dati

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Liste. Costo operazioni Tutte le operazioni hanno costo O(1)

Laboratorio di Programmazione

Altro di ADT. Dominio. Funzioni. Dominio. Funzioni. Costanti - Collezioni

Alberi Binari Alberi Binari

Il TDA Map. Tabelle hash

Definizione informale. Il TDA Map memorizza coppie formate da una chiave k e da un valore v. La coppia è chiamata entry. Ogni chiave deve essere unica

Il TDA Map. Definizione informale. I metodi del TDA Map 2. I metodi del TDA Map 1. Interfaccia Map 1 NO_SUCH_KEY. Tabelle hash

Informatica 3. LEZIONE 13: Liste doppie, pile e code. Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda

Esempio su strutture dati dinamiche: ArrayList

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

tipi di dato astratti

Fondamenti di Informatica II

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

TIPO DI DATO ASTRATTO

SET: specifica INTRODUZIONE. SET: esempio Si stampano i numeri casuali in ordine di generazione e il contenuto dell insieme.

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Heap e Code di Priorità

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

Algoritmi e Strutture Dati

Esempio su strutture dati dinamiche: ArrayList

Pile e Code. Definiamo una collezione come un gruppo di oggetti, detti gli elementi della collezione.

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Esercizio: Lista Circolare

Implementazione Java di un ADT

PILE E CODE. Pile (stack):

Esercizio. Scrivere una classe ListMap<K, V> che implementa la mappa con una lista. Strutture Dati

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Tipi di dati astratti

Fondamenti di Informatica

Corso sul linguaggio Java

Algoritmi e Programmazione Avanzata. Pile e code. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Liste concatenate. Violetta Lonati

Esempio su strutture dati dinamiche: ArrayList

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa E17. C. Limongelli Maggio 2012

Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

Algoritmi e Strutture di Dati

Pile e code. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Strutture dati. Le liste

Esercizi Strutture dati di tipo astratto

Corso sul linguaggio Java

Insiemi Dinamici. Operazioni tipiche (S:struttura, x: riferimento(puntatore) alla chiave, k: chiave)

argomenti Hashing Funzioni hash per file Tabelle hash Funzioni hash e metodi per generarle Inserimento e risoluzione delle collisioni Eliminazione

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2. Dispensa E09. C. Limongelli Marzo 2008

Programmazione in Java Parte II

Metodi di una Collection

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

10/10/2016. Caratteristiche degli array. Il tipo RECORD. Il record. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica

Standard Template Library

1 Strutture di dati dinamiche. 2 Vector come esempio di array dinamico

Corso di Algoritmi e Strutture Dati con Laboratorio. Tipi di dato pila e coda

ADT Mappa. Le chiavi (il mezzo per accedere agli elementi) hanno lo scopo di rendere efficiente la ricerca. Strutture Dati

ADT Dizionario. Come nella Mappa: Diversamente dalla Mappa:

Algoritmi e Strutture di Dati

Orario delle lezioni LABORATORIO TEORIA. mercoledì. martedì aula P/4. lab Turing. Strutture Dati

Si usano quando serve accesso rapido sia in lettura che in scrittura su un insieme non ordinato

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

INTRODUZIONE INTRODUZIONE TABELLE HASH FUNZIONE HASH

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Hash Table. Hash Table

Dati e Algoritmi 1: A. Pietracaprina. Mappa (I parte)

lezione 5 Tipo di dato Lista Liste

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Algoritmi e Strutture Dati. Lezione 5

Array. Walter Didimo

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO

Introduzione al Java Collections Framework. Java Collections Framework (cont.) Interfacce del Collections Framework

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

Strutture dati Alberi binari

Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals()

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica

Liste. Introduzione alle strutture dati. Capitolo 17 Introduzione alle strutture dati

Introduzione al Java Collections Framework

Ereditarietà (ultima)

Ereditarietà (ultima)

Generics & Collections

algoritmi e strutture di dati

La struttura dati PILA

Esempio su strutture dati dinamiche: ArrayList

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

se invoco un metodo di Object che è ridefinito in Point, viene invocato il metodo definito in Point

Gestione dinamica di una coda

Laboratorio di Programmazione

Progettazione del Software

Tipi astratti pila e coda

heap heap heap? max- e min-heap concetti ed applicazioni heap = catasta condizione di heap non è una struttura ordinata

Tipi di dato e Strutture dati elementari

Sul pattern Iterator

IL COMPONENTE STACK (pila)

tipi di dato astratti

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Transcript:

4 SimpleList: Realizzazione Strutture dati Un programma object-oriented usa oggetti per memorizzare dati Come organizzare gli oggetti in strutture dati dipende dalle funzionalità desiderate del programma Strutture dati lineari, alberi, grafi, Due alternative Sequenziale Basata su array monodimensionale Bisogna definire una capacità massima e un metodo full Realizzarla come esercizio Collegata Ogni elemento della lista è una coppia denominata Node Node = (Object, Node) 2 5 Strutture dati lineari: liste Struttura lineare atta a contenere oggetti di uno stesso tipo Definizione ricorsiva La lista vuota è una lista, Una lista non vuota l è una coppia h l / t l dove h l è un oggetto e t l è una lista h l e t l sono definiti rispettivamente head e tail di l Caratteristiche di una lista Lunghezza La lunghezza della lista vuota è 0 La lunghezza di una lista non vuota f l / t l è definita come 1 + lunghezza(t l ) Modalità di accesso e operatori per inserimento e rimozione di elementi SimpleList: rappresentazione collegata import java.io.*; class SimpleList { class Node { // NB: se il costruttore non fa niente non è necessario public Object elem; public Node succ; // definizione dei metodi private Node node; // referenza al primo nodo private int length; // mantiene la lunghezza della lista 3 6 Lista semplice: SimpleList Fornisce metodi per l accesso al primo elemento della lista public SimpleList() Costruisce la lista vuota public Object head() Restituisce il primo elemento della lista (definito sulla lista non vuota) public void inserthead(object elem) Inserisce elem in testa alla lista public void removehead() Elimina il primo elemento della lista (definito sulla lista non vuota) public int size() Restituisce la lunghezza della lista public boolean isempty() Restituisce true se la lista è vuota, false altrimenti Inner Class La classe Node è definita come membro della classe SimpleList Possibile creare oggetti di classe Node solo all interno della classe SimpleList (solo nei suoi metodi) Notare anche che nel nostro caso la classe Node non ha un costruttore Il costruttore sarebbe stato: public Node() { In generale se il corpo del costruttore è vuoto (non fa niente) allora non è necessario specificarlo: è definito per default

SimpleList: Realizzazione dei metodi (1) public SimpleList() { node = null; length = 0; public boolean isempty() { return (node == null); public int size() { return length; public Object head() { if(node == null) return null; return node.elem; 7 SimpleList: Realizzazione dei metodi (2) public void inserthead(object elem) { Node tempnode = new Node(); // costruttore di default tempnode.elem = elem; tempnode.succ = node; node = tempnode; length++; public void removehead() { if(node!= null) { node = node.succ; length--; 10 SimpleList: Inserimento 4 3 7 2 Elemento da inserire 6 24 13 18 1 New 8 SimpleList: testdriver public static void testdriver() throws Exception { InteractiveIO io = new InteractiveIO(); SimpleList list = new SimpleList(); String line = io.promptandread("stringa: "); while(!line.equals("")) { list.inserthead(line); line = io.promptandread("stringa: "); io.writeln("lunghezza lista: " + list.size()); while(!list.isempty()) { line = (String) list.head(); io.writeln(line); list.removehead(); 11 SimpleList: Eliminazione 6 24 13 18 9 Inserimento ed eliminazione in posizione qualsiasi: Liste indicizzate Gli operatori della lista semplice costituiscono l insieme di operatori minimali per la realizzazione di una lista Altri operatori possono essere realizzati a partire da questo insieme minimale oppure possono estendere questo insieme minimale Un estensione della lista semplice è la lista indicizzata Accesso, inserimento ed eliminazione di elementi possono avvenire in ogni posizione elementat(int pos) insertelementat(object elem, int pos) removeelementat(int pos) 12

13 16 Vector e liste indicizzate Abbiamo già visto che Java fornisce nella libreria java.util la classe Vector che realizza le funzionalità di una lista indicizzata Un Vector è realizzato mediante array (rappresentazione sequenziale) Un Vector mantiene una capacità e un campo capacityincrement La capacità è ovviamente maggiore della size Un Vector incrementa la sua capacità di celle di dimensione capacityincrement Vector: altri metodi Object firstelement() Restituisce il primo elemento del Vector Object lastelement() Restituisce l ultimo elemento del Vector Object removeelement(object elem) Elimina la prima occorrenza di elem nel Vector Object removeallelements() Svuota il Vector Esercizio: realizzare una classe List come sottoclasse della classe SimpleList (con rappresentazione collegata) che esibisce lo stesso comportamento della classe Vector Vector: costruttori Vector() La capacità iniziale è predefinita Se non c è spazio per inserire un nuovo elemento la capacità viene raddoppiata. Vector(int capacity) Permette di definire la capacità iniziale Si comporta come il precedente quando non c è spazio per l inserimento Vector(int capacity, int increment) Permette di definire la capacità iniziale e il suo incremento Altri metodi int capacity() Restituisce la capacità del Vector void ensurecapacity(int mincapacity) Assicura una capacità minima incrementando la capacità del Vector se necessario 14 Inserimento ed eliminazione in posizione qualsiasi 8 Inserimento 6 24 13 18 Eliminazione 6 24 13 18 17 Alcuni metodi che non abbiamo visto int indexof(object elem) Restituisce la posizione della prima occorrenza di elem nel Vector, restituisce 1 se l elemento non è presente nel Vector int indexof(object elem, int pos) Restituisce la posizione della prima occorrenza di elem nel Vector a partire dalla posizione pos, restituisce 1 se l elemento non è presente nel Vector int lastindexof(object elem) Restituisce la posizione dell ultima occorrenza di elem nel Vector, restituisce 1 se l elemento non è presente nel Vector int lastindexof(object elem, int pos) Restituisce la posizione dell ultima occorrenza di elem nel Vector cercando indietro a partire dalla posizione pos, restituisce 1 se l elemento non è presente nel Vector 15 List: realizzazione di elementat public Object elementat(int pos) { int i = 0; Node tempnode = node; while (i < pos && tempnode!= null) { tempnode = tempnode.succ; i++; if (i!= pos tempnode == null) return null; return tempnode.elem; 18

public void insertelementat(object elem, int pos) { if(pos == 0) inserthead(elem); else { int i = 1; insertelementat Node prednode = node; // punta al predecessore while (i < pos && prednode!= null) { prednode = prednode.succ; i++; if (i == pos && prednode!= null) { Node tempnode = new Node(); tempnode.elem = elem; tempnode.succ = prednode.succ; prednode.succ = tempnode; length++; // incrementa la lunghezza della lista List: realizzazione di 19 Copia di liste e interferenza Ma cosa succede se con la realizzazione vista precedentemente si eseguono le seguenti operazioni: l1 = l2.copia(); l2.insertelementat(elem, 5); l1.removeelementat(6); Ancora una volta le due liste interferiscono l una sull altra seguendo così inesorabilmente lo stesso destino L operatore di copia visto prima in questo caso non è sufficiente ad evitare l interferenza sulle posizioni intermedie della struttura a puntatori Il metodo copia dovrebbe duplicare l intera struttura (tutti i nodi) 22 public void removeelementat(int pos) { if(pos == 0) removehead(); else { int i = 1; Node prednode = node; // punta al predecessore while (i < pos && prednode!= null) { prednode = prednode.succ; i++; List: realizzazione di removeelementat if (i == pos && prednode!= null && prednode.succ!= null) { prednode.succ = prednode.succ.succ; length--; // decrementa la lunghezza della lista 20 Lista semplice e interferenza Da notare che la lista semplice non soffre di questo problema, perché l accesso è possibile solo in testa: l1 = l2.copia(); l2.insertheadt(7); l1.removehead(); 23 Copia di liste e interferenza Sappiamo che con l assegnamento l1 = l2; due le due variabili puntano allo stesso oggetto interferendo tra di loro su successive operazioni di modifica Gli oggetti vanno copiati public List copia() { List temp = new List(); temp.node = this.node; temp.length = this.length; return temp; In questo modo posso effettuare l assegnamento l1 = l2.copia(); 21 La lista semplice è libera da interferenze l1.node l1 = l2.copia(); l2.node l1.node l2.inserthead(7); l2.node l1.removeheadt(); l2.node 7 7 l1.node 24

Realizzazione libera da interferenza Per avere una realizzazione libera da interferenza bisogna duplicare la parte precedente alla posizione in cui si vuole operare (inserire/rimuovere) Ad esempio, l2.insertelementat(8, 2) l1.node l2.node 25 Liste: rappresentazioni doppiamente collegate Ogni nodo punta al predecessore oltre che al suo successore class Node { public Object elem; public Node pred; public Node succ; 28 l2node 6 24 8 Esercizio: realizzare la classe List con rappresentazione doppiamente collegata 26 29 Realizzazione basata su lista semplice Una realizzazione libera da interferenze si ottiene se gli operatori della lista sono realizzati usando esclusivamente gli operatori della lista semplice La realizzazione è ricorsiva: Se la posizione è in cui bisogna effettuare l operazione è 0 allora si possono applicare direttamente gli operatori della lista semplice Altrimenti si salva e si elimina l elemento di testa, si riapplica l operatore ricorsivamente sulla sottolista così ottenuta e si rimette l elemento precedentemente eliminato in testa Queue (Code) Struttura FIFO: First In First Out removeelement front end addelement 27 30 Esempio: realizzazione di insertelementat public void insertelementat(object elem, int pos) { if(pos == 0) inserthead(elem); else if(! isempty()) { Object headelem = head(); removehead(); insertelementat(elem, pos-1); inserthead(headelem); Queue: metodi public Queue () Crea la coda vuota public boolean isempty () public int size () public void addelement(object elem) Inserisce elem in coda public Object firstelement() Restituisce il primo elemento della coda public void removeelement () Rimuove il primo elemento dalla coda

Queue: estendiamo la classe Vector Solo il metodo removeelement da realizzare import java.io.*; import java.util.*; class Queue extends Vector { public Queue () { super (); // non necessario public void removeelement () { if(size > 0) removeelementat (0); 31 Queue con array: Metodi public boolean isempty() { return (num_elem == 0); public boolean isfull() { return (num_elem == content.length); public int size() { return (num_elem); public Object firstelement() { if(num_elem == 0) return null; return content[front]; 34 Queue: testdriver public static void testdriver() throws Exception { InteractiveIO io = new InteractiveIO(); Queue queue = new Queue(); String line = io.promptandread("stringa: "); while(!line.equals("")) { queue.addelement(line); line = io.promptandread("stringa: "); io.writeln("lunghezza coda: " + queue.size()); while(!queue.isempty()) { line = (String) queue.firstelement(); io.writeln(line); queue.removeelement(); 32 Queue con array: Metodi public void addelement(object elem) { if (num_elem < content.length) { if(num_elem == 0) front = end = 0; else end = (end + 1) % content.length; content[end] = elem; num_elem++; // gestione circolare public void removeelement () { if (num_elem > 0) { if(num_elem > 1) front = (front + 1) % content.length; num_elem--; 35 Queue: rappresentazione statica 33 Esercizio 36 E possibile realizzare code mediante array Per motivi di efficienza si effettua una gestione circolare class Queue { public Queue () { content = new Object [default_max_elem]; public Queue (int max_elem) { content = new Object [max_elem]; // altri metodi static final int default_max_elem = 100; // capacità di default Object [ ] content; int front, end; // indici del primo e dell ultimo della coda int num_elem = 0; // assegnamento di default, indica la coda vuota Provare a realizzare una coda con array che modifica la sua capacità quando il numero di elementi da inserire supera la capacità corrente Prima dell inserimento dell elemento bisognerebbe controllare se la coda è piena. In tal caso si dovrebbe creare un nuovo array content di capacità maggiore (vedi ciò che accade per Vector) e risistemare gli elementi della coda nel nuovo array Ovviamente non c è più bisogno del metodo isfull()

37 40 Stack (Pila) Struttura LIFO: Last In First Out Pop Push Top Dictionary E una classe astratta fornita nella libreria java.util Un dizionario supporta la memorizzazione di coppie (key, value) Usa il metodo equals(object key) per verificare l uguaglianza tra due chiavi 38 41 La classe Stack Fornita nella libreria java.util come estensione della classe Vector Costruttore public Stack () Inserimento, rimozione e accesso al top public push(object elem) Inserisce un oggetto sul top dello stack public Object pop () Restituisce l oggetto sul top e lo elimina dallo stack public Object peek () Restituisce l oggetto sul top senza eliminarlo dallo stack Dictionary: metodi public Object put (Object key, Object value) Aggiunge la coppia (key, value) al dizionario e restituisce il precedente valore associato a key public Object get(object key) Restituisce il valore associato a key nel dizionario; restituisce null se la chiave non è presente public Object remove(object key) Elimina la chiave e il valore associato dal dizionario e restituisce il valore 39 42 La classe Stack: altri metodi Altri metodi public int search(object elem) Restituisce la posizione della prima occorrenza di elem dal top dello stack (0 se l elemento è sul top); restituisce 1 se l elemento non è nello stack public boolean empty() Verifica se lo stack è vuoto Esercizio: rivisitare l esercizio delle torri di Hanoi usando degli stack per rappresentare le torri Dictionary: altri metodi public Enumeration keys ( ) Restituisce una enumeration delle chiavi nel dizionario public Enumeration elements ( ) Restituisce una enumeration dei valori nel dizionario public int size ( ) Restituisce il numero di chiavi nel dizionario public boolean isempty ( ) Verifica se il dizionario non contiene chiavi

Una realizzazione di dizionario basata su Vector 43 MyDictionary: get 46 import java.io.*; import java.util.*; class MyDictionary extends Dictionary { // definizione dei metodi private Vector keysvector; private Vector valuesvector; public Object get (Object key) { int pos = keysvector.indexof(key); if (pos == -1) { return null; return valuesvector.elementat(pos); 44 47 MyDictionary: Metodi MyDictionary: remove public MyDictionary () { keysvector = new Vector(); valuesvector = new Vector(); public int size () { return keysvector.size(); public boolean isempty () { return keysvector.isempty (); public Object remove (Object key) { int pos = keysvector.indexof(key); if (pos == -1) return null; Object temp = valuesvector.elementat(pos); keysvector.removeelementat(pos); valuesvector.removeelementat(pos); return temp; 45 48 MyDictionary: put MyDictionary: keys e elements public Object put (Object key, Object value) { int pos = keysvector.indexof(key); if (pos == -1) { keysvector.addelement(key); valuesvector.addelement(value); return null; Object temp = valuesvector.elementat(pos); keysvector.setelementat(key, pos); valuesvector.setelementat(value, pos); return temp; public Enumeration keys () { return keysvector.elements(); public Enumeration elements () { return valuesvector.elements(); Esercizio: realizzare un testdriver

49 52 Hash Table Hashtable è una classe predefinita nella libreria java.util che estende la classe Dictionary Una hash table usa una tabella (gestione basata su array) per memorizzare le coppie (key, value) Mappa una chiave su un indice nella tabella Una funzione che mappa una chiave su un indice della tabella è detta funzione hash Caratteristiche di una hash table capacity: dimensione massima della tabella load factor: rapporto tra il numero di chiavi memorizzate e la capacità della tabella Hashing Collision Il numero di possibili chiavi può essere molto più grande della capacità di una hash table Ad esempio il numero di possibili codici fiscali è molto più elevato di quelli che può avere necessità di memorizzare un azienda per i suoi impiegati Di conseguenza due chiavi possono essere mappate sullo stesso indice della tabella Hashing collision: tentativo di memorizzare due chiavi associate allo stesso indice nella tabella Una hash table implementa dei meccanismi per risolvere le collisioni, in modo tale da poter memorizzare (e poi recuperare) entrambe la chiavi 50 53 Hash Code La classe Object definisce un metodo hashcode() che usa i dati contenuti in un oggetto per calcolare un hash code per l oggetto (un long integer) Dati due oggetti obj1 e obj2, se obj1.equals(obj2) restituisce true, allora obj1.hashcode() è uguale ad obj2.hashcode() Di solito quando si ridefinisce (override) il comportamento del metodo equals, bisogna anche ridefinire il comportamento di hashcode, per assicurarsi che se due oggetti sono uguali, anche i relativi hash code lo siano La classe Hashtable mappa l hash code di una chiave su un indice della tabella Può essere fatto con una semplice operazione di modulo Risoluzione delle collisioni Due possibili strategie Indirizzamento aperto Alloca l elemento in un altra posizione della tabella (garantendone il successivo reperimento) Il più semplice è la scansione lineare Il passo di scansione è costante le prestazioni sono indipendenti dal passo, per cui di solito è usato il passo 1 (vedi prossima diapositiva) Prestazioni migliori si ottengono con passo non costante (ad esempio con la scansione quadratica) Concatenazione Gestisce una lista dei sinonimi (chiavi con lo stesso indirizzo memorizzare nella tabella) 51 54 Generazione di indirizzi Hash La funzione hash deve essere efficiente e semplice da realizzare In genere è costituita da due sottofunzioni la prima che mappa l insieme delle chiavi sull insieme degli interi, come il metodo hashcode() La seconda che mappa l insieme degli interi sull insieme degli indici della tabella Esempio: se una chiave è alfanumerica (come il codice fiscale) si può convertirla in intero usando il codice ASCII (ottenendo così l hash code) effettuare l operazione di modulo per mapparla sull insieme degli indici (questo lo fa già la classe Hashtable) Scansione lineare, passo 1 Inserimento se la posizione della chiave è già occupata (collisione), allora inserisce nella prima posizione successiva libera (viene generato un agglomerato, un gruppo contiguo di posizioni occupate) Ricerca se la posizione della chiave è occupata e non contiene la chiave da cercare, cerca in tutte le posizioni successive occupate Eliminazione trovata la chiave la elimina e l eliminazione rompe l agglomerato quindi si spostano indietro tutte le chiavi dell agglomerato il cui indirizzo è minore di quello della posizione libera ciò ne garantisce il recupero successivo

55 Ridurre la probabilità di collisioni La capacità e il fattore di caricamento di una hash table influenzano la possibilità che si verifichino collisioni Incrementando la capacità si riduce il fattore di caricamento e quindi la possibilità del verificarsi di collisioni Durante l esecuzione un istanza della classe Hashtable confronta il suo fattore di caricamento con una soglia, che per default è 0.75 Quando il fattore di caricamento è maggiore della soglia, la capacità della hash table viene incrementata automaticamente e gli elementi contenuti vengono riallocati 56 Metodi di Hashtable Costruttori: creano una hash table vuota Hashtable() capacity predefinita, soglia = 0.75 Hashtable(int capacity) Permette di definire la capacità della tabella Hashtable(int capacity, float threshold) Permette di definire capacità e soglia La classe Hashtable ridefinisce i metodi ereditati dalla classe astratta Dictionary get, put, remove 57 Altri Metodi di Hashtable boolean containskey(object key) Verifica se una chiave è contenuta nella hash table boolean contains(object value) Verifica se un valore è memorizzato nella hash table String tostring() restituisce una rappresentazione String della hash table void clear() Cancella tutte le coppie (key, value) dalla hash table void rehash() Crea una hash table più grande e riorganizza il contenuto della vecchia hash table nella nuova (ricalcola gli hash code)