Questa risposta riassume parti di TAoCP Vol 3, Cap 6.4.
Supponiamo di avere un insieme di valori , n di cui vogliamo memorizzare in un array A di dimensioni m . Utilizziamo una funzione hash h : V → [ 0 .. M ) ; tipicamente, M ≪ | V | . Chiamiamo α = nVnAmh:V→[0..M)M≪|V| ilfattore di caricodiA. Qui, assumeremo il naturalem=M; in scenari pratici, abbiamom≪M, tuttavia, e dobbiamo mappare permnoi stessi.α=nmAm=Mm≪Mm
La prima osservazione è che anche se ha caratteristiche uniformi¹, la probabilità che due valori abbiano lo stesso valore di hash è alta; questo è essenzialmente un esempio del famigerato paradosso del compleanno . Pertanto, di solito dovremo affrontare i conflitti e possiamo abbandonare la speranza del tempo di accesso nel caso peggiore O ( 1 ) .hO(1)
E il caso medio, però? Supponiamo che ogni chiave di verifichi con la stessa probabilità. Il numero medio di voci selezionate C S n (ricerca riuscita) risp. C U n (ricerca non riuscita) dipende dal metodo di risoluzione dei conflitti utilizzato.[0..M)CSnCUn
chaining
Ogni voce dell'array contiene (un puntatore alla testa di) un elenco collegato. Questa è una buona idea perché la lunghezza dell'elenco prevista è ridotta ( ) anche se la probabilità di avere collisioni è alta. Alla fine, otteniamo
C S n ≈1+αnm
Questo può essere leggermente migliorato memorizzando gli elenchi (parzialmente o completamente) all'interno della tabella.
CSn≈1+α2 and CUn≈1+α22.
Analisi lineare
v
h(v),h(v)−1,…,0,m−1,…,h(v)+1
vα→1CSn≈12(1+11−α) and CUn≈12(1+(11−α)2).
α<0.75
Doppio hash
M
CSn≈1αln(11−α) and CUn≈11−α.
Si noti che la rimozione di elementi da e l'estensione di tabelle presenta vari gradi di difficoltà per i rispettivi metodi.
O(1)αh
h
Hashtable