IndexDe trop lent sur la liste. Une solution plus rapide?
J'ai génériques de la liste qui doit être préservée de commande afin que je puisse récupérer l'index d'un objet dans la liste. Le problème est IndexOf est beaucoup trop lent. Si je commente la IndexOf, le code s'exécute rapidement que possible. Est-il une meilleure façon, comme un préservé ordonné de hachage liste pour c#?
Grâce,
Nate
- Modifier -
L'ordre dans lequel les éléments sont ajoutés/inséré est l'ordre qu'il doit être. Pas de tri est nécessaire. Aussi cette liste a le potentiel d'être souvent mis à jour, ajouter, supprimer, insérer. Essentiellement, j'ai besoin de traduire un objet à un indice en raison de leur être représenté dans une grille de contrôle afin que je puisse effectuer des opérations sur la grille de contrôle sur la base d'index.
source d'informationauteur NastyNateDoggy
Vous devez vous connecter pour publier un commentaire.
Si ce n'est pas triée, mais l'ordre doit être préservéalors vous pourriez avoir un
Dictionary<YourClass, int>
qui contiendra l'index de chaque élément.Si vous voulez une liste triée, puis vérifier les messages précédents - vous pouvez utiliser
SortedList<Tkey, TValue>
.Net 3.5, ou de les trier et de les utiliser BinarySearch en plus .Net versions.[Edit] Vous pouvez trouver des exemples similaires sur le web, par exemple: OrderedList. Cela on utilise en interne une liste de tableaux et d'une table de hachage, mais vous pouvez facilement vous rendre générique.
[Edit2] Ooops.. l'exemple que je vous ai donné n'est pas de mettre en œuvre IndexOf la façon dont je l'ai décrit au début... Mais vous obtenez le point - une liste devrait être commandés, l'autre celui utilisé pour la recherche rapide.
De tri à l'aide de
List<T>.Trier
puis utilisez leList<T>.BinarySearch
méthode: "Recherche à l'ensemble triésList(T)
pour un élément [...] Cette méthode est un O(log n), où n est le nombre d'éléments dans la gamme."Voir le bas de cet article ici.
Il semble que la rédaction de votre propre méthode pour récupérer l'indice est beaucoup plus rapide que d'utiliser la méthode IndexOf, en raison du fait que l'appel d'une méthode virtuelle selon le type.
Quelque chose comme cela peut donc améliorer vos performances. J'ai écrit une petite unité de test pour vérifier que cela améliore les performances de la recherche, et il n'a, par environ 15x dans une liste avec les 10 000 éléments.
Peut-être vous êtes à la recherche pour
SortedList<TKey, TValue>
?Je vous suggérons d'utiliser le
SortedList<TKey, TValue>
ouSortedDictionary<TKey, TValue>
classe si vous avez besoin des éléments triés. Les différences sont les suivantes.Si vous voulez juste pour préserver la commande, vous pouvez simplement utiliser un
Dictionnaire<TKey, TValue>
et stocker l'élément clé et l'index de la valeur. L'inconvénient est que la remise en ordre des éléments, des insertions ou de suppression sont très coûteux à faire.Bien il n'y a aucune raison que vous ne devrait jamais avoir à commander un hachage de la liste...c'est le genre de point. Toutefois, une table de hachage liste devrait faire le tour assez facilement.
Si vous êtes à l'aide de la Liste de classe puis vous pouvez utiliser la méthode de Tri pour trier après est initialement rempli d'utiliser ensuite la Méthode BinarySearch pour trouver le bon élément.
Je ne suis pas sûr au sujet des particularités en C#, mais vous pourriez être en mesure de faire le tri (QuickSort?) et puis utiliser une recherche binaire (BinarySearch performance est O(log2(N)), par rapport à Séquentielle, comme indexOf, qui est O(n)). (IMPORTANT: Pour une Recherche Binaire, votre structure doit être triée)
Lorsque vous insérez des éléments de la structure de données, vous pouvez essayer une version modifiée de recherche binaire pour trouver le point d'insertion, ou si vous êtes l'ajout d'un grand groupe, vous pouvez ajouter et ensuite de les trier.
Le seul problème est que l'insertion sera plus lent.
Si l'ordre des objets dans la liste a être préservée, alors la seule façon que je peux penser à où vous allez obtenir le plus rapidement possible l'accès est-à-dire l'objet que sa position d'index est quand il ajouté, etc à la liste. De cette façon, vous pouvez interroger l'objet pour obtenir son index dans la liste. Le revers de la médaille, et c'est un gros point négatif à mon avis, est que les objets insérés maintenant avoir une dépendance sur la liste.