Quelle est la complexité du temps de recherche de HashSet & lt; T & gt; (IEqualityComparer & lt; T & gt;)?
Dans C#.NET, j'aime HashSets en raison de leur supposée O(1) temps de complexité pour les recherches. Si j'ai un grand ensemble de données qui va être interrogé, j'ai préfèrent le plus souvent à l'aide d'un HashSet à une Liste, car il a cette fois de la complexité.
Ce qui me confond est le constructeur de la HashSet, qui prend IEqualityComparer comme argument:
http://msdn.microsoft.com/en-us/library/bb359100.aspx
Dans le lien ci-dessus, les remarques notez que le constructeur est un O(1)," mais si c'est le cas, je suis curieux de savoir si la recherche est toujours en O(1).
En particulier, il me semble que, si je devais écrire un Comparateur à passer dans le constructeur d'un HashSet, à chaque fois que j'effectue une recherche, le Comparateur code devra être exécutée sur chaque touche pour vérifier pour voir si il y avait un match. Ce ne serait pas en O(1) O(n).
La mise en œuvre interne de la construction d'une table de recherche lorsque des éléments sont ajoutés à la collection?
En général, comment pourrais-je vérifier les informations à propos de la complexité de l' .NET des structures de données?
source d'informationauteur Kirby
Vous devez vous connecter pour publier un commentaire.
Un
HashSet
œuvres par l'intermédiaire de hachage (viaIEqualityComparer.GetHashCode
) les objets que vous insérez et jette les objets dans des seaux par le code de hachage. Les compartiments eux-mêmes sont stockées dans un tableau, donc en O(1) la partie.Par exemple (ce n'est pas nécessairement exactement comment le C# de la mise en œuvre des travaux, il donne juste une idée), il prend le premier caractère de la valeur de hachage et jette le tout avec un hash à partir de 1 dans le seau 1. Hachage de 2, seau de 2, et ainsi de suite. À l'intérieur de ce compartiment est un autre tableau de seaux que allégées par le deuxième caractère dans la table de hachage. Ainsi de suite pour chaque caractère dans la table de hachage....
Maintenant, quand vous regardez quelque chose, il hache, et saute à travers les appropriée des seaux. Il a à faire plusieurs tableau recherches (un pour chaque caractère dans la table de hachage) mais ne pousse pas comme une fonction de N, le nombre d'objets que vous avez ajouté, donc en O(1) notation.
À votre autre question, voici un blog avec la complexité d'un certain nombre de collections opérations: http://c-sharp-snippets.blogspot.com/2010/03/runtime-complexity-of-net-generic.html
Appelons la valeur que vous êtes à la recherche de la "requête" de la valeur.
Pouvez-vous expliquer pourquoi vous croyez que la comparaison doit être exécutée sur chaque touche pour voir si elle correspond à la requête?
Cette croyance est fausse. (Sauf si bien sûr le code de hachage fourni par le comparateur est le même pour chaque clé!) L'algorithme de recherche exécute le comparateur d'égalité sur tous les principaux dont le code de hachage correspond à la requête code de hachage de l', modulo le nombre de compartiments dans la table de hachage. C'est la façon dont les tables de hachage obtenir O(1) recherche du temps.
Oui.
Lire la documentation.
Il serait dépend de la qualité de la fonction de hachage (
GetHashCode()
) votreIEqualityComparer
mise en œuvre fournit. Idéal en fonction de hachage doit fournir bien aléatoire distribué un ensemble de codes de hachage. Ces codes de hachage sera utilisé comme un indice qui permet de cartographier la clé à une valeur, afin de rechercher une valeur par clé devient de plus en plus efficace, en particulier lorsqu'une clé est un objet complexe/structure.Ce n'est pas la façon dont la table de hachage des œuvres, c'est une sorte de simple bruteforce de recherche. Dans le cas de la table de hachage, vous auriez plus intelligente approche qui utilise la recherche par index (code de hachage).
De recherche est toujours en O(1) si vous passez un IEqualityComparer. L'ensemble de hachage utilise toujours la même logique que si vous ne pas passer un IEqualityComparer; il utilise juste le IEqualityComparer implémentations de GetHashCode et est Égal à la place des méthodes d'instance de Système.L'objet (ou les remplacements prévus par l'objet en question).