Je construis une application qui nécessitera une collection pour tenir environ 10 km de chaînes. P>
La collection sera utilisée comme file d'attente. P>
Ainsi, je cherchais à travers différents types de collecte en C # mais ne pouvait pas déterminer lequel une meilleure performance vis-à-vis de la vitesse de faire et d'obtenir une opération dans la file d'attente. Devrait également être capable de ne pas permettre des doublons dans la file d'attente / la collection. P>
Modifier en fonction des commentaires .. p>
Toute collection existante sera utile. Ou une collection personnalisée qui pourrait exercer une collection existante sera excellente. P>
merci p>
3 Réponses :
Avez-vous l'esprit de passer de la mémoire O (2n)? Vous pouvez utiliser une file d'attente <> en combinaison avec un dictionnaire <,>. La file d'attente gérerait les opérations de la file d'attente et de la dequeuse et le dictionnaire garantirait des entrées uniques. Une classe d'enveloppe simple pourrait combiner ces deux, et cela vous donnerait une file d'attente et de la détresse.
Exemple: p> un insert dans cette donnée personnalisée Structure Vérifiez si le dictionnaire contient déjà l'élément. Cette opération utilise la méthode ContainkeyKey qui est une opération O (log n). Si l'article était déjà contenu dans la structure de données que la méthode des sorties. Si l'élément n'est pas contenue, l'élément sera inséré dans la file d'attente qui est une opération constante O (1). Il sera également ajouté au dictionnaire. Lorsque le nombre de dictionnaire est inférieur à la capacité, cela abordera également une durée d'insertion constante, O (1). Le temps de file d'attente total sera donc O (log n). P> La même chose va la méthode de déséquilibre. P> Cette solution est fondamentalement identique à la structure de données intégrée commandée par la structure de données intégrée, Cependant, étant donné que cette solution utilise générique, il n'y a pas de surcharge dans la boxe / la boîte deboxication dans ses opérations, ce qui le rend grogne plus rapide. P> P>
C'est une solution possible .... ou je pourrais faire, c'est avoir le dictionnaire avec toutes les données de collecte et utiliser la file d'attente comme tampon pour définir des données du dictionnaire. Des commentaires.
Vous pouvez utiliser un hashset au lieu d'un dictionnaire <,>, pas sûr de votre valeur dans un dictionnaire si la chaîne est la clé.
Je ne sais pas ce que vous voulez dire en utilisant la file d'attente comme tampon pour sous-définir des données du dictionnaire?
@Qua Désolé d'être incertain mais utilisez le dictionnaire comme une collection, puis extrayez un groupe de données du dictionnaire et stockez-le dans la file d'attente pour effectuer une opération par article. Au fur et à mesure que la file d'attente le fasse vite et même lors de l'insertion de valeurs au dictionnaire. Collectez toutes les entrées dans une file d'attente, puis insérez une collection au dictionnaire. Mais je ne sais pas si le dictionnaire sera capable de faire des inserts de groupe et d'extraire comme ArrayList.
Itération sur toutes les données stockées dans le dictionnaire est une opération lente. Y a-t-il une raison pour laquelle vous ne garderiez pas les deux synchronisés à tout moment comme je l'ai fait dans le code exemple? Je pense que vous devez être plus précis sur ce que vous cherchez vraiment à faire. Si les entrées sont uniques ou si des entrées identiques sont-elles regroupées?
Le plus rapide et l'efficacité n'est pas reflété dans cette réponse Deux données de données sont non efficaces b> par aucune mesure. @KDHULESHIA B> Vous devez supprimer ATLEAST EFFICACE code> mot de votre question.
S'il vous plaît dites-moi pourquoi cette solution ne serait pas efficace? Notez comment cette solution résout toutes les exigences de la question tout en offrant une grande performance. O (journal n) Inserts, O (log n). Ne va pas mieux.
Oui, c'est efficace. Des moyens efficaces fournissant une solution avec un effort minimal gaspillé. Essayez de proposer une solution qui utilise moins d'espace tout en offrant de meilleures performances.
Ma solution exerce la réponse acceptée par une magnitude et utilisent tous les deux la même quantité de mémoire.
@Qua - Modifier la réponse à expliquer (brièvement) comment elle surpasse la réponse acceptée et je vais uppoter cela. Je ne sais pas pourquoi la réponse a été évitée. (N'était-ce pas moi. Je n'ai pas assez de points.)
J'ai édité mon entrée. Cette structure de données est exactement identique à la commande ordonnée. Toutefois, OD est une ancienne structure de données qui ne profitent pas des génériques et il faut donc une énorme performance touchée par la boxe / la boîteboxing.
@Sanjeevakumar Hiremath et @Qqua: Ce ne serait pas de l'espace de 2n. La chaîne de la chaîne de .NET signifie que vous ne doubliez pas la mémoire de mémoire si vous réutilisez des chaînes entre deux collections. Vous auriez les frais généraux de deux fois plus de pointres, mais cela n'est nulle part près de la taille des chaînes d'origine.
@Dan, le nombre de références dans la collection serait toujours 2n? Si c'était INT ou tout autre objet ou même des chaînes, stipez-vous, mais les références doivent-elles être ajoutées dans la collection. BTW La contrainte d'unicité annulerait l'avantage interne B>. :)
Comment l'unique serait-il annulé l'avantage interne? Avec interne, vous stockiez la chaîne une fois et deux références - qui sont généralement beaucoup plus petites par rapport à la chaîne d'origine. Il n'est nulle part près de 2n stockage (en supposant que vos chaînes sont au moins quelques personnages de longueur) - Si c'était le cas, il n'y aurait pas besoin de cruche!
Dans cette question, OP ne veut que des chaînes uniques, l'interne n'est utile que lorsque deux références sont pointées vers une chaîne, mais la détection en double dans cette question spécifique ne vous laisserait pas profiter de l'interne.
Eh bien, il serait probablement encore plus efficace d'utiliser un hashset <> code> au lieu du dictionnaire
<> code>. En ce qui concerne la boxe / la boîte de consigne: il utilise des cordes afin qu'il n'y ait pas de boxe impliquée. J'essaie habituellement de coller aux structures de données-cadres si possible - une personne a déjà écrit le code et l'a testé - à moins d'avoir un avantage éprouvé de rouler votre propre implémentation.
Si vous recherchez des performances élevées et obtenez lors de la vérification de unicité forte> (vérification dupliquer) mais la commande ne comporte pas (pas une file d'attente) puis utilisez Si la fonction de file d'attente est plus importante, utilisez un Je ne pense pas qu'il y ait quelque chose qui offre les deux. p> hashset
p>
Queue
Il cherchait une solution rapide pour avoir un système de file d'attente avec des entrées uniques. Vous avez fourni une solution à l'une de ces conditions mais pas à la fois à la fois.
J'ai dit que ce n'est pas possible à la fois avec une source de données. N'est-ce pas le cas?
+1 Basé sur la manière dont la question est indiquée, c'est une réponse correcte. La question semble rechercher un type de collecte existant. Il ne résout pas l'intention i> derrière la question initiale, mais nous ne pouvons pas lire son esprit.
Notez la modification: "Tout type de données personnalisé qui surperformez les solutions existantes". La solution que j'ai affichée résout toutes les exigences tout en offrant une grande performance.
Il y a le classedDdictionner classe qui maintient l'ordre d'insertion mais Vous permet de rechercher des valeurs par clé. p>
Que diriez-vous d'utiliser un tableau en tant que FIFO?
pensé à la graisse, mais ils jouent très mal lors de la recherche de la dictionnaire vs qui sont très bons lors de la recherche, mais ils nécessitent beaucoup plus de ressources et de temps à faire de ....
S'il y aurait une collection la plus rapide, tous les autres seraient inutiles :) S'il vous plaît dites-nous si vous en avez besoin que vous en avez besoin rapidement pour insérer de nouveaux éléments à ou un qui est rapide à lire (si vous ne le construisez qu'une seule fois et que vous ne le construisez que cela fait une énorme différence). En outre, l'utilisation de la mémoire est-elle un problème? Combien de temps sont les cordes?
C'est une question non sensible. Il suggère qu'il y a quelque chose qui ne va pas avec la file d'attente <> mais ne dit jamais quoi. S'il y avait un meilleur moyen de mettre en œuvre une file d'attente, bien sûr, les programmeurs .NET Framework l'auraient utilisé. Vous ne pouvez pas faire un meilleur travail, seulement pire.