andbin ha scritto:
Il nocciolo di tutto è quindi la "tabella hash". Ti è abbastanza chiaro il concetto e la struttura di una tabella hash? Non esiste in assoluto un unico modo per implementarla, dipende innanzitutto se serve per realizzare una "mappa" (chiavi->valori) o più semplicemente per un "insieme" di valori. E poi anche dai tipi di dato da gestire.
E' ovvio: deve implementare un
insieme e i dati sono
interi: lo dice pure.
Ma riassumendo:
1) come hai implementato la funzione hash per gli interi?
2) visto che si parla di
insieme, quali sono le proprieta' di un
insime? Piu' specificatamente, che cosa dovrebbe succedere se viene inserito nell'insieme due volte lo stesso valore intero?
3) supponi di dover inserire nell'insieme i numeri 0, 1, 9223372036854775807 E 9223372036854775807 (tranquillo, questo e' un numero perfettamente rappresentabile in Java). Che cosa ti aspetteresiti?
4) supponi di dover inserire nell'insieme 1.000.000 di numeri compresi tra 0 e 9223372036854775807, generati casualmente, e che quindi non e' necessariamente assicurata la loro univocita', come faresti?
Inizia con pensare ad un'implementazione
ovvia.
Supponendo che la tua implementazione sia quella classica, questa presenta un
grave diffetto.
Per ovviare a tale diffetto serve la
tabella hash.
Ma ti serve capire
perche'!
Poi, l'implementazione di una tabella hash non e' per nulla banale. Il problema non e' il tipo di dati, ma
le proprieta' della funzione hash, ed un'altro importante concetto: la
collisione delle chiavi