2012-02-23 13 views
5

Mi è stato chiesto di recente "come implementeresti una hastable". So che l'algoritmo di hashing è fondamentale poiché meno collisioni sono le migliori prestazioni del WRT, ma quale struttura algoritmo/dati deve essere impiegata per fornire un tempo costante ammortizzato {O (1)} per insert/delete/lookups?Implementazione Hashtable

+0

può la forza degli array essere con voi –

+0

Avete guardato in un libro, dire "Introduzione agli algoritmi" di Cormen et al.? – Raphael

+0

Questo è esattamente il libro che sto ottenendo. –

risposta

7

tabelle hash hanno due possibilità principali:

  1. indirizzamento aperto, che è un semplice array [matrice dinamica actualy se si potete lasciare il vostro tavolo crescere al volo]. Una volta che un conflitto si è verificato, è necessario utilizzare una seconda funzione di hash per trovare l'ingresso successivo a cui verrà mappato l'elemento. Nota che questa soluzione ha alcuni problemi [che possono essere risolti] quando la tua tabella hash consente anche le eliminazioni. [Bollo speciale per antipasti "cancellati"]
  2. concatenamento - in questa soluzione, ogni portata nel matrice è una lista collegata - che contiene tutti gli elementi hash per questo antipasto. Qui: tutti gli elementi associati a un certo valore sono presenti nell'elenco.

La parte importante sulle tabelle hash [in entrambe le soluzioni] al fine di consentire armotorized O (1) inserire/del/guardare in alto - è l'assegnazione di un tavolo più grande e rimasticare una volta è stato raggiunto un pre definito load factor.

EDIT: complessità analsis:
Assumere un fattore di carico di p per qualche p < 1.

  1. La probabilità di "collisione" in ogni accesso è p Così la media di matrice accessi è: Sigma(i * p^(i-1) * (1-p)) for each i in [1,n] Questo vi dà: Sigma(i * p^(i-1) * (1-p)) = (1-p) * Sigma(i * p^(i-1)) <= (1-p) * 1/(p-1)^2 = 1-p = CONST. [dai un'occhiata alla correttezza di Sigma(i * p^(i-1)) < 1/(p-1)^2 in wolfram alpha]. In tal modo risultante in media un numero costante di accessi alla matrice. Inoltre: potrebbe essere necessario riprendere tutti gli elementi dopo aver raggiunto il fattore di caricamento, con conseguente accesso O(n) all'array. Ciò si traduce in operazioni n * O(1) [aggiunta di n elementi] e 1 * O(n) op [rifasamento], in modo da ottenere: (n * O(1) + 1 * O(n))/n = O(1) tempo armotorizzato.
  2. Molto simile a (1), ma l'analisi viene eseguita sugli accessi alla lista. Ogni operazione richiede esattamente un accesso di matrice e un numero variante di accessi di elenchi, con la stessa analisi di prima.
+0

Il downtroter si prenderà cura di commentare? – amit

+0

Non ho votato, ma penso che tu abbia confuso la tua terminologia. Le implementazioni delle tabelle hash "concatenate" consistono in elenchi collegati di elementi all'interno di ciascun bucket hash. Le implementazioni della tabella hash "Open Address" sono quelle che memorizzano gli elementi all'interno di un buffer e possono essere implementate con la strategia di hashing doppio che hai descritto. Controlla la pagina che hai collegato a ... –

+0

@DarrenEngwirda: Grazie per il tuo commento. Non sono un madrelingua inglese e di solito tendo a mescolare i termini di volta in volta. Ho editato la risposta. – amit