Progetto del corso di
Algoritmi e Strutture di dati e Laboratorio
docenti: M. Torelli, M. A. Alberti
Appello del 13/9/1996
Progetto HASH
E' richiesta la realizzazione di un programma per studiare le prestazioni delle tabelle hash.
L'utente dovrà poter scegliere (non necessariamente in quest'ordine):
- la dimensione m della tabella (diversa per il metodo della concatenazione rispetto ai metodi a indirizzamento aperto);
- il tipo di funzione hash che intende usare: metodo di moltiplicazione o di divisione, e scelta del parametro A (anche per la divisione si usi h(k) = Ak mod m e in questo caso il parametro A dovrà essere un intero positivo). Nel caso l'utente non intenda indicare un
valore di A predisporre un valore di default opportuno; si noti inoltre che le funzioni hash
da specificare sono due nel caso del doppio hash (eventualmente predisporre una funzione
di default per la seconda hash);
- la modalità di inserimento delle chiavi: manuale, generate a caso o a blocchi.
Per la generazione a caso, l'utente dovrà specificare il numero di chiavi da generare e il
valore massimo di tali chiavi (interi non negativi: prevedere almeno 6 cifre decimali:
pensate ai vostri numeri di matricola). Non dovranno essere inserite chiavi duplicate!
Dovrà essere invece garantita la possibilità di generare esattamente la stessa sequenza di
chiavi in momenti diversi, dando all'utente la possibilità di specificare il seme del
generatore.
Per la generazione a blocchi, invece, l'utente dovrà specificare gli estremi di ciascun
blocco di chiavi: per esempio, da 1000 a 2000 e da 10000 a 11000.
Le chiavi generate in blocco o a caso vanno ovviamente inserite in maniera automatica!
Naturalmente, dovrà essere possibile (e agevole) anche eseguire singoli inserimenti, cancellazioni o ricerche di chiavi, e visualizzare (a richiesta, non "sempre e comunque"!) la situazione delle tabelle.
Il programma dovrà fornire in uscita informazioni sulle prestazioni (tempo necessario per eseguire le diverse operazioni, numero di confronti...), soprattutto per le operazioni di inserimento multiple (quelle effettuate a caso o a blocchi).
Per rendere interessanti i confronti di prestazioni, questi saranno relativi ai 4 metodi di gestione delle collisioni illustrati sul testo: le operazioni andranno effettuate simultaneamente su 4 tabelle, gestite rispettivamente coi metodi della concatenazione, della scansione lineare, quadratica, e del doppio hash. Le prestazioni relative andranno confrontate con quelle previste dalla teoria (teoremi 12.1, 12.2, 12.5 e 12.7 del libro).
Non si introducano limitazioni non legate a vincoli hardware o software ben giustificati: in
particolare, si preveda la possibilità di gestire tabelle con qualche migliaio di chiavi (e quindi
l'inserimento deve poter essere fatto in modo automatico). Data la necessità di realizzare
operazioni analoghe in quattro diversi ambienti, si raccomanda di organizzare il programma in
maniera modulare, non duplicando inutilmente codice e funzioni.