Combien de seaux de hachage
Si je remarque que d'une table de hachage (ou de toute autre structure de données construite sur une table de hachage) est à remplir, à quel moment devriez-vous construire une nouvelle table avec plus de seaux. Et étant donné n les éléments de la table jusqu'à présent, comment pouvez-vous savoir comment beaucoup de compartiments à utiliser dans la nouvelle?
Donc, disons que j'ai 100 seaux. Dois-je réorganiser quand il y a 50 éléments-t-il? 500? 5000? Ou dois-je regarder pour la plupart-baquet et la clé sur qui? Puis, quand j'ai frappé à ce point, quelle taille dois-je faire de cette nouvelle table de hachage?
À ce propos, si vous savez à l'avance à peu près combien d'éléments vont dans, il est un moyen de calculer le nombre de seaux d'eau pour obtenir une bonne performance moyenne?
Je sais que la vraie réponse dépend de beaucoup d'autres considérations comme quelle est l'importance de vitesse par rapport à la taille dans un exemple spécifique, mais je suis à la recherche d'général guildlines.
Je sais aussi que je ne devrais pas être l'optimisation de ce genre de chose, à moins que les bonnes profilage a indiqué que c'est un goulot d'étranglement. Je suis juste à y penser un projet qui pourrait utiliser un grand nombre de tables de hachage et se demandait comment aborder cette.
OriginalL'auteur Matt | 2008-10-22
Vous devez vous connecter pour publier un commentaire.
Une bonne règle du pouce (pas toujours idéal, eh bien, juste une règle du pouce) est de re-hachage si la table de hachage est rempli jusqu'à 80%. Cela signifie que si vous avez 100 seaux et 80 articles à l'intérieur, quel que soit le nombre de collision avant, il se fait temps d'en augmenter la capacité.
Quelle quantité faut-il l'augmenter? Eh bien, il n'y a également aucune valeur parfaite. La plus simple solution consiste à doubler la capacité de chaque augmentation. Donc, il va à 200, 400, 800, et ainsi de suite. Si vous pensez que c'est trop (après tout, il passera de 8 MO de mémoire de 16 MO lorsque la table de hachage est vraiment grand et vous pouvez ne jamais remplir le 16 MO), choisir un petit facteur de croître. Au moins 1/3 est recommandé (en croissance de 100 à 133), je dirais que, peut-être le laisser croître de 50% à chaque fois comme un compromis.
Noter que tout cela dépend aussi comment les collisions sont gérées. Une façon simple de travailler avec eux (mon préféré) est de stocker les éléments dans une liste, quand il y a une collision. Si 3 éléments sont placés à la même clé, il y a encore seulement jusqu'à 3 compare à trouver. Depuis liés liste sont très inefficaces pour la recherche, vous pouvez augmenter la capacité antérieure, par exemple, si 60% de la capacité est utilisée pour garder la table de hachage rapide. Otoh, que, vous pouvez faire quelque chose de plus sophistiqué et garder des stats sur le nombre de collisions. Tant que vous n'ont presque pas de collisions (si vous avez une très bonne fonction de hachage, il n'est pas nécessaire de re-hachage à tous, même si 99% de ses capacités, est en cours d'utilisation. Aussi, si vous gérer les collisions de manière sophistiquée (par exemple, chaque nœud est de nouveau un tableau trié et vous pouvez effectuer une recherche binaire dans ces) de votre recherche peut encore être assez rapide si la table est chargé à 200% (donc vous avez deux fois autant d'éléments que de la capacité). Dans ce cas, vous pouvez garder les stats comment big le plus grand tableau trié est et quand il est plus grand que, disons, 8 entrées, vous pensez que c'est trop lent et puis vous re-hachage.
Re-hachage est très lente, donc il faut éviter le plus souvent possible. Donc si vous avez besoin de re-hachage, ne suffit pas de cultiver la capacité de trop peu, sinon, vous devrez re-hachage de nouveau très bientôt lors de l'ajout de plusieurs éléments. Lorsque vous avez besoin de re-hachage, faire de la capacité considérablement plus grand que le nombre d'éléments actuellement dans la table, tout le reste est trop peu de capacité.
OriginalL'auteur Mecki
Généralement, vous guettez le facteur de charge (de manière informelle, vous avez déjà dit que), qui est officiellement défini comme α = n / N, c'est à dire le ratio utilisé pour le total des seaux. Pour une table de hachage pour fonctionner correctement (ou au moins à la raison sur sa performance en termes mathématiques), il convient de α < 1.
Tout le reste est vraiment à des tests empiriques: Si vous voyez que votre table de hachage n'est pas bon de commencer à α > 0.5, alors assurez-vous de rester en dessous de cette valeur. Cette valeur dépend aussi de votre résolution de collision techique. Le hachage avec chaînage peut exiger d'autres facteurs de charge de hachage à adressage ouvert. Pourtant, un autre facteur est la localité de cache. Si votre table est trop grande, elle ne rentre pas dans la mémoire principale. Depuis votre accès dans le tableau est aléatoire, le chargement de la mémoire cache peut devenir un goulot d'étranglement.
OriginalL'auteur Konrad Rudolph
Il y a généralement deux types de tables de hachage: ouvert et fermé.
Dans un table de hachage, vous trouverez le compartiment basé sur le hachage, et ensuite établir une liste des éléments qui pendent que seau.
Dans un fermé de table de hachage, vous trouverez la première seau à l'aide de la valeur de hachage, et si il est occupé vous de la sonde pour la prochaine valeur. Dans le cas simpliste, vous pouvez le faire par la recherche de la prochaine free seau, ou vous pouvez créer une deuxième valeur de hachage à partir de votre point d'étape et par qui (bien que vous devez vous assurer que c'est le premier modulo la taille des tables de hachage afin de vous visiterez tous les seaux).
Ouvert d'une table de hachage est généralement pas redimensionnée. Vous définissez la taille initiale à ce que vous vous sentez est raisonnable pour le problème. Comme d'autres l'ont souligné, vous pourriez redimensionner sur une table de hachage, mais le raisonnement sur les performances de cette structure de données devient très dur. Si vous redimensionnez lorsque la longueur d'un seau est L, alors vous pourrait en fin de redimensionnement sur L les éléments dans l'ensemble de la table de hachage, ce qui est très inefficace.
Fermé table de hachage est redimensionnée lorsque le facteur de charge (pas de. d'éléments dans la table de hachage /non. des seaux) frappe une valeur prédéfinie. J'ai tendance à utiliser 80%, mais la valeur exacte est peu probable d'être trop critique.
L'avantage d'une table de hachage est que le amorti coût de l'insertion d'un objet est toujours en O(1) (en supposant une bonne fonction de hachage). L'insertion d'un élément particulier peut être O(N) en raison du coût de redimensionnement, mais ça se fait très rarement.
OriginalL'auteur Rob Walker
Dépend du type de table de hachage en cours de création. Si vous utilisez un tableau fixe en fonction de la table de hachage (par opposition aux listes de seaux), vous devez redimensionner le tableau, soit quand la table est pleine ou lorsque vous avez frappé un max de la sonde de comptage (selon que vous vous souciez plus de la vitesse ou de la mémoire). Si vous utilisez des listes liées, la mémoire n'est pas un sujet de préoccupation depuis et n'ont pas de sonde pour des espaces vides, de sorte que le redimensionnement n'est pas que les grandes d'un accord.
La clé avec les tables de hachage est l'algorithme de hachage, pas le nombre de compartiments. Idéalement, vous voulez toujours plus d'un élément dans chaque seau, de sorte que vous devrait idéalement être le redimensionnement lorsque le nombre d'éléments dans la table de hash = le nombre de compartiments. Si vos données n'est pas uniformément répartie, vous êtes mieux avec un meilleur algorithme de hachage de mieux redimensionner stratégie.
OriginalL'auteur jezell
Si vous utilisez une fonction Linéaire de Hachage, la table elle-même prend automatiquement soin de redimensionnement, en maintenant constant le facteur de charge.
OriginalL'auteur George V. Reilly