web-dev-qa-db-fra.com

SortedList <>, SortedDictionary <> et Dictionnaire <>

Je trouve que SortedList<TKey, TValue>SortedDictionary<TKey, TValue> et Dictionary<TKey, TValue> implémentent les mêmes interfaces. 

  1. Quand devrions-nous opter pour SortedList et SortedDictionary sur Dictionary?
  2. Quelle est la différence entre SortedList et SortedDictionary en termes d'application?
77
Sunder
  1. Lors d'une itération sur les éléments de l'un ou l'autre, les éléments seront triés. Pas si avec Dictionary<T,V>.

  2. MSDN adresse la différence entre SortedList<T,V> et SortedDictionary<T,V>

La classe générique SortedDictionary (TKey, TValue) est une recherche binaire arbre avec récupération O (log n), où n est le nombre d'éléments dans le dictionnaire. À cet égard, il est similaire à la classe générique SortedList (TKey, TValue). Les deux classes ont des modèles d'objet similaires, et les deux ont une récupération O (log n). La différence entre les deux classes est en utilisation de la mémoire et vitesse d'insertion et de retrait:

SortedList (TKey, TValue) utilise moins de mémoire que SortedDictionary (TKey, TValue).

SortedDictionary (TKey, TValue) a une insertion et une suppression plus rapides opérations pour les données non triées: O (log n) par opposition à O(n) pour SortedList (TKey, TValue).

Si la liste est remplie en une fois à partir de données triées, SortedList (TKey, TValue) est plus rapide que SortedDictionary (TKey, TValue).

82
Szymon Rozga

enter image description here

Je mentionnerais la différence entre les dictionnaires.

L'image ci-dessus montre que Dictionary<K,V> est égal ou plus rapide dans tous les cas que Sorted analogique, mais si l'ordre des éléments est requis, par ex. pour les imprimer, Sorted on choisit.

Src: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dictionaries.html

56
Lev

Pour résumer les résultats d'un Performance Test - SortedList vs SortedDictionary vs Dictionary vs Hashtable , les résultats du meilleur au pire pour différents scénarios:

Utilisation de la mémoire:

SortedList<T,T>
Hashtable
SortedDictionary<T,T>
Dictionary<T,T>

Insertions:

Dictionary<T,T>
Hashtable
SortedDictionary<T,T>
SortedList<T,T>

Opérations de recherche:

Hashtable
Dictionary<T,T>
SortedList<T,T>
SortedDictionary<T,T>

opérations de boucle foreach

SortedList<T,T>
Dictionary<T,T>
Hashtable
SortedDictionary<T,T>
19
NullReference
  1. Lorsque vous souhaitez que la collection soit triée par clé lorsque vous la parcourez. Si vous n'avez pas besoin que vos données soient triées, il vaut mieux utiliser un dictionnaire uniquement pour obtenir de meilleures performances.

  2. SortedList et SortedDictionary font à peu près la même chose, mais sont implémentées différemment et ont donc des forces et des faiblesses différentes expliqué ici .

8
Meta-Knight

En essayant d’attribuer un score performance à chaque cas présenté par @Lev, j’ai utilisé les valeurs suivantes:

  • O (1) = 3
  • O (log n) = 2
  • O (n) = 1
  • O (1) ou O(n) = 2
  • O (log n) ou O(n) = 1,5

Les résultats sont (plus haut = meilleur):

Dictionary:       12.0 
SortedDictionary:  9.0 
SortedList:        6.5

Bien entendu, chaque cas d'utilisation donnera plus de poids à certaines opérations.

0
Jaime