Tabella di hash
Struttura dati usata per mettere in corrispondenza una chiave con un dato valore.
Viene usata per l'implementazione di strutture dati astratte associative.
Può usare qualsiasi tipo di dato come indice e tutte le operazioni si possono fare circa in tempo costante
T(n) ~ O( 1 )L'hashing è un'estensione della ricerca indicizzata da chiavi che gestisce problemi di ricerca nei quali le chiavi di ricerca non presentano questa proprietà.
Una ricerca basata sull'hashing cerca di accedere agli elementi della tabella in modo diretto tramite operazioni aritmetiche che trasformano le chiavi in indici della tabella.
Le tabelle di hash sono caratterizzate da 3 operazioni:
- insert: inserisce un nuovo elemento, con un certo valore (unico) di un campo chiave
- search: determina se un elemento con un certo valore della chiave esiste e in tal caso lo restituisce
- delete: elimina l'elemento identificato dal campo chiave, se esiste
Si vuole ottenere per le 3 operazioni fondamentali una complessità pari a
- O( 1 ) nel caso più frequente
- O( n ) nel caso peggiore
vettori associativi: vettori indicizzabili per contenuto (tramite funzione di hashing) anzichè per prosizione. Ad ogni elemento è associata una chiave. Ad ogni chiave è associato un indirizzo del vettore e viceversa.
Ogni elemento è memorizzato ad un certo indirizzo di un vettore.
L'indirizzo viene calcolato da un'opportuna funzione di hash in tempo
O( 1 )complessità:
O( 1 )
occupazione:
O( |U| ) numero di valori diversi assunti dal campo chiave
Nella maggior parte dei casi, il numero di elementi del dizionario
|K| << |U| numero di valori possibili delle chiavi.
Quando l'universo delle chiavi è vasto non è quindi possibile allocare il vettore
TUna tabella di hash è una struttura dati con un'occupazione di spazio
O( |K| ) e tempi di accesso
O( 1 ) nel caso medio
Funzione di hash h: U --> [0, m-1] m size vettore
Ogni qualvolta
h( ki ) = h( kj ) con
ki != kj si verifica una
collissioneOccorre:
- minimizzare il numero di collissioni ottimizzando la funzione di hash
- gestire le collissioni residue, quando avvengono,
- permettendo a più elementi di risiedere nella stessa locazione (chaining)
- ricercare un'altra posizione per insierire l'elemento (open addressing)
b. Gestione delle collisioni residue
chaining: liste di collisioni
È permesso a più elementi di risiedere nella stessa locazione della tabella.
Ogni locazione del vettore associativo è quindi un insieme di elementi implementato sotto forma di liste concatenate (lista non ordinata).
Complessità:
- inserimento in testa: O( 1 )
- ricerca: O( lunghezza lista ) O( 1 + a)
- cancellazione: O( lunghezza lista )