web-dev-qa-db-fra.com

Processus de rehachage dans hashmap ou hashtable

Comment se déroule le processus de rehachage dans une table de hachage ou une table de hachage lorsque la taille dépasse la valeur de seuil maximum?

Toutes les paires sont-elles simplement copiées dans un nouveau tableau de compartiments?

MODIFIER:

Qu'arrive-t-il aux éléments dans le même compartiment (dans la liste chaînée) après le rehachage? Je veux dire, resteront-ils dans le même seau après avoir ressuscité?

17
a Learner

Le seuil maximum dans la question est appelé facteur de charge.

Il est conseillé d'avoir un facteur de charge d'environ 0,75. Le facteur de charge est défini comme (m/n) où n est la taille totale de la table de hachage et m est le nombre préféré d'entrées qui peuvent être insérées avant qu'un incrément de taille de la structure de données sous-jacente soit requis.

Le ré-hachage peut se faire dans deux cas:

  1. Lorsque le rapport m '/ n actuel augmente au-delà du facteur de charge

  2. Le rapport M '/ n tombe à une valeur très faible, par exemple 0,1

Dans les deux cas, m 'est le nombre actuel d'entrées. De plus, les deux cas exigent le déplacement des entrées actuelles dans une table de hachage plus grande ou plus petite.

Dans le contexte de la question, le rehachage est le processus d'application d'une fonction de hachage aux entrées pour les déplacer vers une autre table de hachage. Il est possible d'utiliser la fonction de hachage qui a été utilisée précédemment ou d'utiliser une nouvelle fonction tout à fait.

Remarque: le ré-hachage est également effectué en cas de collision. (C'est aussi un moyen de gérer les collisions.)

Pour ajouter un peu plus de contexte et une discussion détaillée, veuillez visiter mon blog Hashing Basics

19
dharam

Le ré-hachage d'une carte de hachage est effectué lorsque le nombre d'éléments dans la carte atteint la valeur de seuil maximale.

Habituellement, la valeur du facteur de charge est de 0,75 et la valeur de capacité initiale par défaut est de 16. Une fois que le nombre d'éléments atteint ou franchit 0,75 fois la capacité, le remaniement de la carte a lieu. Dans ce cas, lorsque le nombre d'éléments est de 12, le ré-hachage a lieu. (0,75 * 16 = 12)

En cas de ré-hachage, une nouvelle fonction de hachage ou même la même fonction de hachage peut être utilisée, mais les compartiments auxquels les valeurs sont présentes peuvent changer. Fondamentalement, lors du ré-hachage, le nombre de compartiments est approximativement doublé et, par conséquent, le nouvel indice auquel la valeur doit être définie change.

Lors du ressassage, la liste chaînée de chaque compartiment est inversée dans l'ordre. Cela se produit car HashMap n'ajoute pas le nouvel élément à la queue au lieu de cela, il ajoute le nouvel élément à la tête. Ainsi, lors du ressassement, il lit chaque élément et l'insère dans le nouveau compartiment en tête, puis continue d'ajouter les éléments suivants de l'ancienne carte en tête de la nouvelle carte, ce qui entraîne l'inversion de la liste liée.

S'il y a plusieurs threads gérant la même carte de hachage, cela pourrait entraîner une boucle infinie.

Une explication détaillée indiquant comment la boucle infinie se produit dans le cas ci-dessus peut être trouvée ici: http://mailinator.blogspot.hu/2009/06/beautiful-race-condition.html

Si les éléments insérés dans la carte doivent être triés par rapport aux clés, alors TreeMap peut être utilisé. Mais HashMap serait plus efficace si l'ordre des clés n'avait pas d'importance.

14
Melwin

Hashing - Rehashing et Race condition

Fondamentalement, lors de la création d'une carte de hachage, la collection lui attribue une capacité par défaut (de 2 ^ 4 soit 16). Étape ultérieure lorsque des éléments sont ajoutés dans la carte et après une certaine étape lorsque vous approchez de votre capacité initiale définie, il est nécessaire de ReHashing pour conserver les performances.

Il y a LoadFactor défini pour la collection (dit être bon comme 0,75) et cela spécifie le bon index pour le temps et l'espace.

  • PLUS GRAND facteur de charge => consommation d'espace réduite mais recherches plus importantes
  • PLUS PETIT Facteur de charge => Plus grande consommation d'espace par rapport au nombre d'éléments requis.

La spécification Java suggère que la valeur du bon facteur de charge est de 0,75

Par conséquent, supposons que vous ayez une exigence maximale pour stocker 10 éléments dans le hachage, puis en tenant compte du bon facteur de charge .75 = Le ressassement se produirait après l'ajout de 7 éléments dans la collection. Dans le cas où votre exigence, dans ce cas, n'accéderait pas à 7, alors le ressassement n'aurait jamais lieu.

S'il n'y a vraiment aucun grand nombre d'éléments à stocker dans la table de hachage, il est toujours bon de créer HashMap avec une capacité suffisante; ceci est plus efficace que de le laisser effectuer un ré-hachage automatique.

Condition RACE: lors de la reprise des éléments internes qui sont stockés dans une liste chaînée pour un compartiment donné. Ils s'inversent dans l'ordre. Supposons que deux threads rencontrent la condition de concurrence en même temps, alors il y a des chances que le second puisse passer en boucle infinie pendant la traversée depuis que l'ordre a été changé.

10
Manjul