.NET HashTable Vs Dictionary - Il dizionario può essere veloce?


276

Sto cercando di capire quando e perché utilizzare un dizionario o una tabella hash. Ho fatto un po 'di ricerca qui e ho trovato persone che parlano dei vantaggi generici del Dizionario con cui sono totalmente d'accordo, il che porta il vantaggio di boxe e unboxing per un leggero miglioramento delle prestazioni.

Ma ho anche letto che il dizionario non restituirà sempre gli oggetti nell'ordine in cui sono inseriti, cosa è ordinata. Dove sarà una HashTable. A quanto ho capito, questo porta a rendere HashTable molto più veloce in alcune situazioni.

La mia domanda è davvero, quali potrebbero essere tali situazioni? Sbaglio nelle mie assunzioni sopra? Quali situazioni potresti usare per sceglierne una sopra l'altra (sì, l'ultima è un po 'ambigua).


5
Non voglio votare questo, ma il tuo karma è 7.777 e non voglio essere il ragazzo che rovina tutto per te.
CaptainMarvel

Risposte:


298

System.Collections.Generic.Dictionary<TKey, TValue>e le System.Collections.Hashtableclassi mantengono entrambe una struttura di dati della tabella hash internamente. Nessuno di essi garantisce la conservazione dell'ordine degli articoli.

Lasciando da parte i problemi di boxe / unboxing, la maggior parte delle volte dovrebbero avere prestazioni molto simili.

La principale differenza strutturale tra loro è che Dictionarysi basa sul concatenamento (mantenendo un elenco di elementi per ciascun bucket della tabella hash) per risolvere le collisioni mentre Hashtableutilizza il rehash per la risoluzione delle collisioni (quando si verifica una collisione, prova un'altra funzione hash per mappare la chiave su un bucket) .

Ci sono pochi vantaggi nell'utilizzare la Hashtableclasse se si sta prendendo di mira .NET Framework 2.0+. È effettivamente reso obsoleto da Dictionary<TKey, TValue>.


21
@ Jon- Il concatenamento e rimaneggiamento è discusso in profondità qui- msdn.microsoft.com/en-us/library/ms379571(VS.80).aspx
RichardOD

Grazie ad entrambi. Ho appena trovato quella pagina mentre Richard la pubblicava ... Stavo per chiedere informazioni su Chaining ma il sito MSDN è davvero utile!
Jon

6
@Mehrdad - Ciò che non mi è chiaro su come vengono risolte le collisioni è questo: se più chiavi possono provocare lo stesso hash, quindi come assicurarti di ottenere il giusto valore nelle ricerche, cioè come fa la funzione a sapere quale elemento ritorno? In msdn.microsoft.com/en-us/library/ms379571%28VS.80%29.aspx si dice "Piuttosto che riprogrammare in caso di collisione, come avviene con la classe Hashtable, il Dizionario semplicemente incatena qualsiasi collisione nell'elenco dei bucket ". Questo significa che quando si utilizza Dizionario, le collisioni non sono qualcosa di cui lo sviluppatore deve preoccuparsi?
Howiecamp,

6
@Howiecamp: questo non è molto diverso da Hashtable. Le tabelle hash memorizzano 3 informazioni in una voce: hash chiave, chiave stessa e valore. Per gli oggetti con hash uguale, dovrà attraversare l'elenco per trovare l'articolo con uguale chiave e restituirne il valore. Questo è praticamente vero Hashtableanche per . Come sviluppatore che utilizza un Dictionarynormale, non devi preoccuparti.
Mehrdad Afshari,

@Mehrdad Giusto per essere chiari, sia gli oggetti Hashtable che quelli Dizionario memorizzano la chiave stessa ed entrambi nascondono anche le collisioni dallo sviluppatore?
Howiecamp,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.