Les tables de hachage sont des structures de données très courantes utilisées pour les problèmes de codage présentés dans la programmation / entretiens compétitifs. P>
Les tables de hachage prennent des paires de la valeur clé afin que vous puissiez consulter une clé et obtenir la valeur. Cependant, je me trouve souvent besoin d'avoir besoin du Si j'ai besoin de savoir si des strings code> code> ont été utilisés précédemment, je pourrais les brancher dans une table de hachage avec la clé Quels sont les côtés en bas de faire quelque chose comme ça? Existe-t-il d'autres structures de données qui donnent une recherche O (1) qui n'ont pas besoin d'une paire de valeur clé? P> O (1) code> Recherche d'une clé et de ne pas vraiment se soucier de la valeur. P>
: chaîne code>,
valeur: bool < / code> où la valeur du bool est toujours vraie. P>
3 Réponses :
Si le seul but de ce conteneur de tester si une chaîne a déjà été utilisée, alors Unorded_set (collection de clés uniques, hachée par les clés) ferait le tour. P>
Un ensemble non ordonné est un conteneur associatif contenant un ensemble de Objets de clé de type uniques. La recherche, l'insertion et l'élimination ont Complexité moyenne de temps constante. P> blockQuote>
Vous devez utiliser une structure de données comme elle est destinée à être utilisée. Et vous pouvez ensuite profiler votre code pour voir si la performance est adéquate. Si ce n'est pas le cas, optimisez les goulots d'étranglement. P>
Cela dit, une meilleure structure de données à vérifier si une chaîne a déjà été utilisée serait STD :: Unommanded_set ou std :: Ensemble . Votre cas d'utilisation est un cas d'utilisation typique pour une structure de données définie. Wikipedia : P>
En informatique, un ensemble est un type de données abstrait qui peut stocker valeurs uniques, sans ordre particulier. C'est un ordinateur Mise en œuvre du concept mathématique d'un ensemble fini. contrairement à la plupart des autres types de collecte, plutôt que de récupérer un élément spécifique à partir d'un ensemble, on teste généralement une valeur pour l'appartenance à un ensemble. P> blockQuote>
sauf si vous avez un algorithme de hachage parfait, vous aurez des collisions. À ce stade, vous devez examiner votre mise en œuvre actuelle de la table de hachage. Quelles ont chacun leurs avantages et leurs inconvénients, actuellement tous std :: nonOrdered_map code> (et
std :: unomment_sed_set code>?) Sont implémentés sous forme de godets avec des listes liées, qui rend ensuite votre o ( 1) dans un pire des cas de O (n).
La moyenne est toujours O (1), de sorte que si votre système n'est pas important et que vous utilisez un bon hachage, il y a quelques années, le hachage pour les chaînes a utilisé un bon algorithme académique accepté, puis utilisez un ensemble de hachage. Si vous ne pouvez en aucun cas accepter un pire cas o (n) recherche d'utilisation
std :: map code> ou
std :: set code>. P>.
Il existe de nombreux types de Tables OH HASH, toutes avec leurs propres caractéristiques de performance. Y a-t-il un type particulier qui vous intéresse? Par exemple, un
std :: nonOrdered_map code> a essentiellement B mis en œuvre comme une éventail de listes liées, et je suis sûr que vous connaissez la pénalité de performance existant pour traverser une liste.
Unorded_set Code> est une généralisation d'un CODE> Tableau de hachage avec O (1) Recherche / Insert. Il n'y a pas de véritable inconvénient de l'utiliser. Comme pour toute classe de collecte en C ++, YMMV sur la performance en ce qui concerne la mise en œuvre et la répartition de la mémoire.
@selbie n'était pas au courant de cela, TY
Toutes les implémentations de la table de hachage ont une mauvaise performance pire des cas. Beaucoup dépend de la répartition de vos valeurs de hachage.
Vous pouvez également essayer d'autres ensembles de données avec
O (logn) code> pour les petites entrées Le
C code> constante peut être plus petit et donner une meilleure performance. Essaye le.
La complexité moyenne des cas est
Commander (1) Code> et la complexité du pire des cas est
O (n) code>.
Les tables de hachage ont besoin de plus de bélier que de listes ou d'arbres. C'est un peu un bélier pour la vitesse de distribution de vitesse, à moins que vous n'ayez un hachage parfait. Vous aurez également besoin de faire le hasch et une chaîne de comparaison par chaîne dans un "godet" - à moins que votre hachage est parfait.