Devi scavare un po 'per vedere come il dizionario è implementato in C # - Non è così ovvio come HashMap (una tabella hash) o TreeMap (un albero ordinato) (o ConcurrentSkipListMap - un elenco salta ).
Se scavi nella sezione "Note":
La classe generica Dizionario fornisce una mappatura da un set di chiavi a un set di valori. Ogni aggiunta al dizionario è costituita da un valore e dalla chiave associata. Recuperare un valore usando la sua chiave è molto veloce, vicino a O (1), perché la classe Dictionary è implementata come una tabella hash.
E lì ce l'abbiamo. È una tabella hash . Nota che ho collegato l'articolo di Wikipedia lì - è una lettura abbastanza buona. Potresti voler leggere la sezione sulla risoluzione delle collisioni. È possibile ottenere un set di dati patologici in cui la ricerca si trasforma in O (N) (ad esempio tutto ciò che si inserisce rientra nello stesso valore di hash o indice nella tabella di hash per qualche motivo e si rimane con il sondaggio lineare ).
Mentre il dizionario è una soluzione per scopi generici, non dovresti passare da tipi concreti (come il dizionario), ma dovresti passare dalle interfacce. In questo caso, tale interfaccia è IDictionary
( docs ). Per questo, sei perfettamente in grado di scrivere la tua implementazione del dizionario che fa le cose in modo ottimale per i dati che hai.
Quanto all'efficienza di varie ricerche / contiene?
- Camminare su un elenco non ordinato: O (N)
- Ricerca binaria di un array ordinato: O (registro N)
- Albero ordinato: O (registro N)
- Tabella hash: O (1)
Per la maggior parte delle persone, la tabella hash è ciò che vogliono.
Potresti scoprire che SortedDictionary è quello che vuoi invece:
La SortedDictionary<TKey, TValue>
classe generica è un albero di ricerca binario con recupero O (log n), dove n è il numero di elementi nel dizionario. A questo proposito, è simile alla SortedList<TKey, TValue>
classe generica. Le due classi hanno modelli di oggetti simili ed entrambe hanno il recupero O (log n).
Anche se, ancora una volta, se la struttura dei dati non è quella che funziona idealmente con i tuoi dati, ti vengono forniti gli strumenti (le interfacce) per essere in grado di scrivere quello che funziona meglio per i tuoi dati.
Il dizionario stesso è un tipo di dati astratto . Mi dai un dizionario e so cosa posso farci e tutti gli strumenti lì per me da usare per la natura di essere un dizionario. Se mi fornissi una ArrayList, mi ritroverei a scrivere il mio codice per cercare, inserire o eliminare elementi dall'elenco. Questo mi fa perdere tempo e significa anche che c'è più probabilità che si verifichi un bug mentre copio il codice ancora e ancora da un punto all'altro.
Data Structures
Questo link wiki potrebbe essere di maggiore aiuto per te