0
votes

Les côtés de l'abus de O (1) recherchent une table de hachage?

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.

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 O (1) Recherche d'une clé et de ne pas vraiment se soucier de la valeur.

par exemple:

Si j'ai besoin de savoir si des strings ont été utilisés précédemment, je pourrais les brancher dans une table de hachage avec la clé : chaîne , valeur: bool < / code> où la valeur du bool est toujours vraie.

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é?


7 commentaires

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 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 est une généralisation d'un 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) pour les petites entrées Le C constante peut être plus petit et donner une meilleure performance. Essaye le.


La complexité moyenne des cas est Commander (1) et la complexité du pire des cas est O (n) .


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.


3 Réponses :


3
votes

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.

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.


0 commentaires

3
votes

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.

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 :

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.


0 commentaires

0
votes

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 (et std :: unomment_sed_set ?) 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 ou std :: set . .

  • Note 1: Toutes les tables de hachage ont un talon Achille qui en fait le pire cas O (n), à moins que vos godets soient mis en œuvre comme arbre équilibré.
  • Note 2: Le hachage parfait est sans collision.
  • Note 3: Il y a une certaine littérature qui peut expliquer comment faire un hachage parfait des données connues, n'a pas encore vu pour des hachages parfaits pour des données inconnues.
  • Note 4: Si vous trouvez ce dernier, vous pourrez peut-être prouver p = np.

0 commentaires