0
votes

Comment pouvons-nous personnaliser notre propre fonction de hachage pour C ++ Unorded Set pour obtenir un ordre spécifique?

Dans le codage concurrentiel, nous sommes confrontés à de nombreuses questions où nous devons fournir la production dans un ordre de saisie. Nous devons donc faire la propre fonction de hachage. Aucune idée de comment pourrais-je écrire ma propre fonction de hachage?


2 commentaires

Vous voulez un ensemble ou une carte non ordonnée à commander?


Si vous trouvez une fonction de hachage qui dispose d'un mappage de 1 par 1, vous pouvez ensuite trouver que c'est inverse également qui vous donnera la commande originale.


3 Réponses :


1
votes

Comment pouvons-nous personnaliser notre propre fonction de hachage pour C ++ non ordonné défini pour obtenir un ordre spécifique?

Vous ne pouvez pas de manière fiable faire ce que vous voulez.

Mais pourquoi n'utilisez-vous pas std :: Ensemble (ou std: : mapper ) pour un tel but? Regardez dans Cette référence C ++ et lisez un bon Livre de programmation C ++ (et la norme C ++ 11 N3337 ), pour plus.

Nous ne savons pas quel est votre cas d'utilisation réelle, mais je pourrait suggérer de faire votre propre classe , après le C ++ règle de cinq , et avoir les deux A std :: map et un std :: hash_map pour la même relation mathématique. xxx

Bien sûr, si vous codez un programme multi-threadé, vous devez avoir un champ std :: mutex dans la classe ci-dessus pour sérialiser l'accès en utilisant std :: lock_guard < / code> ....

N'importe quelle idée Comment puis-je écrire ma propre fonction de hachage?

écrire une bonne fonction de hachage est généralement facile.

écrire une fonction de hachage très efficace pourrait toujours vous donner un doctorat, et vous trouverez de nombreux papiers dans ACM parrainé conférences sur ce sujet.

Voici un simple et Naive Fonction de hachage sur les chaînes: xxx

Vous pouvez remplacer le bitwise exclusif ou ^ avec un + et lire sur Identité de Bézout . < H2> Recommandation: Etude existant Open Source Code

I STORTS Recommandez à la recherche, pour inspiration, dans le code open source existant en C ++ (y compris le code de GCC et clang , bo les compilateurs C ++; ou de fltk ou Qt ) disponible sur les sites Web tels que Github ou gitlab . Vous devriez avoir besoin de demander la permission à votre responsable d'étudier ce code.

Recommandation: lire la documentation

Je vous invite à lire la documentation de votre compilateur C ++ (peut-être GCC ou Clang ), de votre lieur (peut-être Binutils ), de votre Editeur de code source (j'aime GNU EMACS ), de votre système de contrôle de version (par exemple, GIT < / a>). Si vous êtes autorisé à le faire, je suggère d'utiliser un gnou / Système Linux (par exemple, Debian ou ubuntu ) Sur votre ordinateur (car Linux est principalement composé de composants open source, dont le code source que vous pouvez télécharger et étudier).

Voir aussi http://linuxfromscratch.org/ et HTTPS: // Norvig .com / 21-days.html


0 commentaires

1
votes

... vous ne pouvez pas. Un Unommked_sed_set est non ordonné . Écrire votre propre fonction de hachage ne changera pas cela. Une implémentation de bibliothèque standard particulière peut contenir une commande pour une fonction de hachage particulière et un ensemble particulier de données stockées dans ce non ordonnée_sed_sed . Mais ce code ne sera pas tout simplement portable, la commande peut changer simplement en ajoutant plus de choses à cet ensemble.

Si vous devez fournir une sortie dans l'ordre de l'entrée, vous devez utiliser un conteneur qui conserve la commande que vous lui donnez, comme un vecteur . .


0 commentaires

1
votes

Étant donné que les implémentations de conteneurs non ordonnés utilisent des tables de hachage (elles sont à peu près nécessaires à la norme) avec une chaînage séparée avec des listes liées, si vous vous assurez que le nombre de godets dépasse la plage de votre fonction de hachage (en utilisant la réserve () ) alors il est raisonnablement probable - bien que non garanti - que des éléments seront stockés dans l'ordre de leur valeur hachage et des éléments de la même valeur de hachage dans l'ordre d'insertion.

Je réitére que ceci est non garanti mais dans un concours de codage où vous connaissez la mise en œuvre, vous pouvez vous en tirer.

En outre, cela est bien sûr inefficace puisque vous devez soit réserver un grand nombre de seaux, nécessitant une utilisation élevée de la mémoire, soit restreindre la plage de votre fonction de hachage entraînant des collisions. Vous seriez beaucoup mieux à utiliser les conteneurs commandés.


0 commentaires