9
votes

Est énumérable.Elemente O (1) pour Hashset?

est la mise en œuvre dans hashset.Elementat O (1) et sinon, qu'est-ce que c'est?


0 commentaires

3 Réponses :


5
votes

Non, c'est o (n). Toutes les méthodes d'extension sur ienumerable sont, par nécessité O (n) (car la seule chose que ienumerable peut faire est ... Enumérer) . Bien que, comme indiqué dans les commentaires, ils tentent de se lancer dans une interface pouvant implémenter l'opération plus rapidement (par exemple, EMMETAT tenteront de lancer vers ilist afin de mettre en œuvre une opération O (1)). Non que cela aide dans le cas de hashset qui ne met pas en œuvre ilist de toute façon.

pour hashset Le concept de "ellementat" n'a aucun sens de toute façon, car il n'y a pas de "commande" comme tel. Vous venez d'obtenir un élément aléatoire.


12 commentaires

Ensuite, une chose plus intelligente serait de faire un toarray si vous devez utiliser Elementat sur beaucoup de lignes? N'est-il jamais possible d'obtenir la commande "correcte" avec un hachette?


Oui, un seul toarray puis plusieurs "éléments à" (via le [] opérateur) serait beaucoup plus rapide. Il n'y a pas d'ordre "correct" avec un hashset, car les éléments ne sont pas commandés de manière significative.


Bien, cependant, quand je le fais: {2, 3, 4} et initiez deux hashsets avec ceux-ci, je reçois la commande correcte lors de la marche à travers chaque élément.


@Dean: N'oubliez pas les optimisations de performance à l'intérieur du énumérable Classe pour tableau et liste Types. Pour ces types, certaines opérations sont en fait (1).


@FILIP: La commande n'est pas aléatoire. La commande sera exactement la même pour ces deux cas, toujours. Cependant, aucune garantie ne garantit que les éléments sont stockés dans le même ordre que vous leur fournissez. Je m'attends à ce que les résultats de votre expérience soient accidentellement dans cet ordre. En outre, la commande peut changer de version à la version.


@Filip: Ce que vous voyez est une coïncidence. Deux ensembles avec le contenu même auront la commande même , mais si vous ajoutez des éléments supplémentaires à l'ensemble, vous constaterez probablement que la commande change, puisque les godets Hashtable se déplacera lorsque l'ensemble grandit.


@Steven, je vois. Y a-t-il d'autres ensembles qui sont rapides et fournis chevauchements ?


@Dean: Ouvrir le réflecteur et regardez le ellementat , et dernier par exemple. C'est bien de voir ce qu'ils font. Bien sûr, ces optimisations viennent à un coût pour les petites collections.


Le premier paragraphe de cette réponse est tout simplement faux. Beaucoup de méthodes d'extension IEnumerables (y compris Elementat) tentent de lancer d'autres types (souvent ilist ) qui permettent un comportement plus rapide que O (n) dans la mesure du possible.


@WILL: C'est exactement ce que nous discutons ici dans les commentaires ;-)


@Filip: Qu'entendez-vous par «chevauchement»?


@Steven, juste remarqué intersects Cependant, je veux savoir s'il intersecte avec exactement le même ordre.



2
votes

Il n'y a pas de Méthode Méthode dans hashset Vous souhaitez probablement connaître les performances de la méthode énumérable. / code> méthode lorsqu'il est utilisé sur une instance de hashset .

Le énumérable.Elemente est une optimisation pour les types implémentant ilist . Dans ce cas, la performance est O (1). Cependant, HashSet ne met pas en œuvre cette interface, par conséquent, la performance est O (n).


5 commentaires

@Steven, il y a un élémenat Becuase Hashset dérive de l'Icollection.


@Filip: hashset est dérivé de icollection , mais icollection n'a pas de Elementat < / code> méthode. hashset n'est pas (au moins dans .NET 3.5SP1) contiennent un EMMETAT méthode.


@Steven, j'utilise .net 4.0 et Resharbeur me suggère d'utiliser icollection où je veux prendre un hashset . Quoi qu'il en soit, en utilisant toarray des choses rapidement accélérées beaucoup.


@FILIP: Je ne connais pas très bien .net 4.0 Mais je suis absolument sûr que Microsoft n'ajout d'aucune méthode à Icollection pour cette version (car ce serait une rupture sévère monnaie). RESHARPER vous suggère d'utiliser Icollection car tous les appels de méthode que vous vous trouvez sont basés sur cette interface ou sur des méthodes d'extension sur cette interface ou des interfaces de base ( ienumerable dans votre Cas).


@Filip: Peut-être que cette discussion n'est peut-être pas très utile pour vous. Vous ne vous souciez probablement pas d'où il est défini. Vous l'appelez, il compile, cela fonctionne :-). N'oubliez pas que vous appelez une méthode d'extension.



3
votes

Cela dépend du type de liste de sous-cycle. Le réflecteur montre que énumérable .Elementat (...) essaie de lancer à un ilist d'abord. Dans ce cas, ce serait O (1).

Un fournisseur de requêtes par exemple peut renvoyer quelque chose qui est un ilist . Mais les chances sont que si vous appliquez l'un des opérateurs LINQ, il se transformera en un iEnumerable , car ils sont construits simplement en utilisant des énumérateurs différents, et cela deviendra O (n).

EDIT: Je suralise le hashset . Un hashset ne met pas en œuvre ilist , donc c'est O (n).


0 commentaires