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
risposta
tabelle hash hanno due possibilità principali:
- 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"]
- 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
.
- 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 accessoO(n)
all'array. Ciò si traduce in operazionin * O(1)
[aggiunta di n elementi] e1 * O(n)
op [rifasamento], in modo da ottenere:(n * O(1) + 1 * O(n))/n = O(1)
tempo armotorizzato. - 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.
Il downtroter si prenderà cura di commentare? – amit
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 ... –
@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
- 1. Implementazione di Hashtable per C
- 2. Implementazione hashCode() di Java Hashtable # rotta?
- 3. Che cos'è un esempio di implementazione di Hashtable in C#?
- 4. Hashtable in C++?
- 5. Aggiungi Hashtable alla fine di un altro Hashtable
- 6. Minimo thread-safe hashtable?
- 7. Serializzare una HashTable, Java
- 8. Apache Velocity: hashtable?
- 9. Haskell Hashtable Performance
- 10. Quando utilizzare una HashTable
- 11. Hashtable vs Dictionary
- 12. PSCustomObject a Hashtable
- 13. Implementazione generica di System.Runtime.Caching.MemoryCache
- 14. Differenza tra Dizionario e Hashtable
- 15. come serializzare hashtable in C#
- 16. Hashtable hashing avoid hashcode negativo
- 17. Dizionario/Oggetto HashTable in C++?
- 18. ConcurrentHashMap e Hashtable in Java
- 19. Enum come chiave di HashTable
- 20. hashtable e sincronizzazione in Java
- 21. Quanta memoria usa un Hashtable?
- 22. ricambio per classe Hashtable obsolete in Java
- 23. Domande di intervista relative a Hashtable & Dizionario
- 24. Hashtable: perché il metodo get viene sincronizzato?
- 25. Powershell ConvertTo-json con hashtable incorporato
- 26. Ottenere la lunghezza di HashTable in PowerShell
- 27. String interpolazione dei valori Hashtable in PowerShell
- 28. Come viene implementata l'iterazione di un hashtable?
- 29. F #: Differenza tra dizionario, Hashtable e Mappa
- 30. Differenza tra Hashtable e Collections.synchronizedMap (HashMap)
può la forza degli array essere con voi –
Avete guardato in un libro, dire "Introduzione agli algoritmi" di Cormen et al.? – Raphael
Questo è esattamente il libro che sto ottenendo. –