la complexité des classes de asymptote collection .NET
-
21-08-2019 - |
Question
Y a-t-il des ressources sur la complexité asymptotique (grand-O et le reste) des méthodes de classes de collection .NET (Dictionary<K,V>
, etc ... List<T>
)?
Je sais que la documentation de la bibliothèque C5 comprend des informations à ce sujet ( exemple ), mais je suis intéressé par les collections .NET standard aussi ... (et les informations de PowerCollections serait aussi bien).
La solution
MSDN ces listes:
-
Dictionary<,>
-
List<>
-
SortedList<,>
(edit: lien erroné , voici la version générique ) -
SortedDictionary<,>
etc. Par exemple:
Le SortedList (TKey, TValue) générique classe est un arbre de recherche binaire avec O récupération (log n), où n est le nombre d'éléments dans le dictionnaire. En cela, il est similaire à la SortedDictionary (TKey, TValue) générique classe. Les deux classes ont la même objet modèles, et les deux ont O (log n) récupération. Lorsque les deux classes différer est en cours d'utilisation de la mémoire et de la vitesse de insertion et le retrait:
SortedList (TKey, TValue) utilise moins La mémoire de SortedDictionary (TKey, TValue).
SortedDictionary (TKey, TValue) a plus rapide insertion et le retrait opérations de données non triés, O (log n) par opposition à O (n) pour SortedList (TKey, TValue).
Si la liste est peuplée à la fois à partir de données triées, SortedList (TKey, TValue) est plus rapide que SortedDictionary (TKey, TValue).
Autres conseils
Cette page résume quelques-unes des comlplexities de temps pour divers types de collections avec Java, mais ils doivent être exactement les mêmes pour .NET.
J'ai pris les tableaux de cette page et changeai / les élargi pour le framework .NET. Voir aussi les pages MSDN pour SortedDictionary et SortedList , qui décrivent en détail la complexité du temps requis pour diverses opérations.
Recherche
Type of Search/Collection Types Complexity Comments Linear search Array/ArrayList/LinkedList O(N) Unsorted data. Binary search sorted Array/ArrayList/ O(log N) Requires sorted data. Search Hashtable/Dictionary<T> O(1) Uses hash function. Binary search SortedDictionary/SortedKey O(log N) Sorting is automated.
Récupération et insertion
Operation Array/ArrayList LinkedList SortedDictionary SortedList Access back O(1) O(1) O(log N) O(log N) Access front O(1) O(1) N.A. N.A. Access middle O(1) O(N) N.A. N.A. Insert at back O(1) O(1) O(log N) O(N) Insert at front O(N) O(1) N.A. N.A. Insert in middle O(N) O(1) N.A. N.A.
La suppression doit avoir la même complexité que l'insertion de la collection associée.
SortedList a quelques particularités notables pour l'insertion et la récupération.
Insertion (méthode Add):
Cette méthode est une opération O (n) pour données non triés, où n est égal à Count. Il est une opération O (log n) si le nouveau élément est ajouté à la fin de la liste. Si l'insertion provoque un redimensionnement, l'opération est O (n).
Récupération (propriété d'objet):
Récupération de la valeur de cette propriété est une opération O (log n), où n est égal à Compter. Définition de la propriété est un opération O (log n) si la clé est déjà dans le SortedList <(Of <(TKey, TValue>)>). Si la clé est pas dans la liste, définissant la propriété est un O (n) opération pour les données non triés, ou O (log n) si on ajoute le nouvel élément à la fin de la liste. Si l'insertion provoque une redimensionner, l'opération est O (n).
Notez que équivaut à ArrayList
en termes de List<T>
la complexité de toutes les opérations.
Je ne sais pas en général (l'autre réponse vient peut-être vous donne affichée exactement ce que vous êtes après) - mais vous pouvez en tenir compte et d'autres méthodes de cours à l'aide ILSpy (un peu maladroit avec le code FSharp, true) et on obtient finalement cette fonction C #:
internal static a maximumElementAux<a>(SetTree<a> s, a n)
{
while (true)
{
SetTree<a> setTree = s;
if (setTree is SetTree<a>.SetOne)
{
break;
}
if (setTree == null)
{
return n;
}
SetTree<a>.SetNode setNode = (SetTree<a>.SetNode)s;
SetTree<a> arg_23_0 = setNode.item3;
n = setNode.item1;
s = arg_23_0;
}
return ((SetTree<a>.SetOne)s).item;
return n;
}
Bon alors ce n'est pas exactement le code « bon » en termes de C # - mais la présence de la boucle implique qu'il ne while(true)
peut être O (1) au moins; comme pour ce qu'il est réellement ... eh bien, ma tête me fait mal trop savoir:)
Cette page présente des notes courtes sur certains avantages clés et les inconvénients pour la plupart des collections .NET:
Il n'y a pas une telle chose que « la complexité des classes de collection ». Au contraire, les différentes opérations sur ces collections ont différentes complexités. Par exemple, l'ajout d'un élément à un Dictionary<K, V> rel="nofollow noreferrer"> ...
... approche d'un O (1) opération. Si la capacité doit être augmentée pour le nouvel élément, cette méthode devient O (n) opération, où est
n
Count
.
Alors que la récupération d'un élément d'un rel="nofollow noreferrer"> ...
... se rapproche d'une opération de O (1).
La documentation indique qu'il est construit sur un arbre binaire, et ne mentionne pas le suivi de l'élément maximal. Si la documentation est correcte, cela signifie qu'il doit être O (log n). Il y avait au moins une erreur dans la documentation des collections (en référence à une structure de données soutenue par tableau comme un arbre de recherche binaire), mais qui a été corrigé.