web-dev-qa-db-fra.com

Pourquoi la taille 127 (prime) est-elle meilleure que 128 pour une table de hachage?

En supposant un simple hachage uniforme, cela étant, toute valeur donnée est également comparable à un hachage dans l'un des emplacements du hachage. Pourquoi est-il préférable d'utiliser une table de taille 127 et non de 128? Je ne comprends vraiment pas quel est le problème avec la puissance de 2 nombres. Ou comment cela fait réellement une différence.

Lorsque vous utilisez la méthode de division, nous évitons généralement certaines valeurs de m (taille de la table). Par exemple, m ne doit pas être une puissance de 2, car si m = 2 ^ p, alors h(k) n'est que les p bits de poids faible de k.

Supposons que les éléments possibles soient compris entre 1 et 10000 et que la taille de la table soit de 128. Comment 127 peut-il être meilleur? Donc 128 est 2 ^ 6 (1000000) et 127 est 0111111. Quelle différence cela fait-il? Tous les nombres (une fois hachés) seront toujours les p bits les plus faibles de k pour 127 également. Ai-je eu quelque chose de mal?

Je cherche des exemples car je ne comprends vraiment pas pourquoi c'est si grave. Merci beaucoup d'avance!

PS: Je suis au courant de: Table de hachage: pourquoi la taille devrait être primordiale?

51
Clash

Tous les nombres (une fois hachés) seront toujours les p bits les plus faibles de k pour 127 également. 

C'est faux (ou j'ai mal compris ..). k % 127 dépend de tous les bits de k. k % 128 ne dépend que des 7 bits les plus bas. 


MODIFIER:

Si vous avez une distribution parfaite entre 1 et 10 000. 10,000 % 127 et 10,000 % 128 feront tous les deux une excellente distribution plus petite. Tous les compartiments contiendront 10 000/128 = 78 (ou 79) articles.

Si vous avez une distribution entre 1 et 10 000 qui est biaisée, car {x, 2x, 3x, ..} se produisent plus souvent. Ensuite, une taille initiale donnera une distribution bien meilleure, comme expliqué dans ce réponse . (Sauf si x est exactement cette taille.)

Ainsi, couper les bits hauts (en utilisant une taille de 128) ne pose aucun problème if la distribution dans les bits inférieurs est suffisante. Mais, avec de vraies données et de vraies fonctions de hachage mal conçues, vous aurez besoin de ces bits élevés.

21
Ishtar

Méthode de division

"Lorsque vous utilisez la méthode de division, nous évitons généralement certaines valeurs de m (Taille de la table). Par exemple, m ne doit pas être une puissance de 2, car si m = 2p, alors h(k) est p bits de poids faible de k ". 

--CLRS

Pour comprendre pourquoi m = 2p utilise uniquement les p plus petits bits de k, vous devez d'abord comprendre la fonction de fonction de hachage modulo h(k) = k % m.

La clé peut être écrite en termes de quotient q et reste r.

k = nq + r

Choisir le quotient comme étant q = m nous permet d'écrire k % m simplement comme le reste de l'équation ci-dessus:

k % m = r = k - nm,  where r < m

Par conséquent, k % m équivaut à soustraire en continu m un total de n fois (jusqu'au r < m):

k % m = k - m - m - ... - m,  until r < m

Essayons de hacher la clé k = 91 avec m = 24 = 16.

  91 = 0101 1011
- 16 = 0001 0000
----------------
  75 = 0100 1011
- 16 = 0001 0000
----------------
  59 = 0011 1011
- 16 = 0001 0000
----------------
  43 = 0010 1011
- 16 = 0001 0000
----------------
  27 = 0001 1011
- 16 = 0001 0000
----------------
  11 = 0000 1011

Ainsi, 91 % 24 = 11 est simplement la forme binaire de 91 avec seulement les bits p=4 les plus bas restants.


Distinction importante:  

Cela concerne spécifiquement la méthode de division du hachage. En fait, l'inverse est vrai pour la méthode de multiplication comme indiqué dans CLRS:

"Un avantage de la méthode de multiplication est que la valeur de m n'est pas critique ... Nous choisissons généralement [m] pour une puissance de 2, car nous pouvons ensuite facilement implémenter la fonction sur la plupart des ordinateurs."

5
bcorso

Tout d'abord, il ne s'agit pas de choisir un nombre premier. Pour votre exemple, si vous savez que votre ensemble de données sera compris entre 1 et 10 000, choisir 127 ou 128 ne changera rien car c'est un choix de conception médiocre. 

Au lieu de cela, il est préférable de choisir un nombre premier TRÈS grand, comme 3967, afin que chaque donnée ait sa propre paire clé/valeur. Vous voulez juste aussi minimiser les collisions. Choisir 127 ou 128 dans votre exemple ne changera rien car tous les seaux 127/128 seront remplis de manière uniforme (ceci est mauvais et va dégrader le temps d'exécution de l'insertion et de la consultation O(1) à O(n)) par opposition à 3967 (qui préservera les O(1) temps d'exécution)

EDIT # 4

La conception de la "fonction de hachage" est un peu comme un art noir. Il peut être Fortement influencé par les données que Est destiné à être stocké dans la structure de données Basée sur le hachage, ainsi la discussion sur Sur un hachage raisonnable peut souvent déboucher sur une discussion de sur des entrées spécifiques.

Pourquoi les nombres premiers sont-ils "préférés", il faut Envisager une analyse "par l'adversaire", qui suppose que j'ai conçu une structure de données générale basée sur , Comment serait-il performant étant donné la pire entrée d'un adversaire. Puisque la performance Est dictée par des collisions de hachage, la question Devient de savoir quel est le hachage à utiliser pour Qui minimise la collision dans le pire état de . Une de ces conditions est Lorsque l'entrée est toujours un nombre Divisible par un nombre entier, disons 4. Si Vous utilisez N = 128, alors tout nombre Divisible par 4 Le mod 128 est toujours divisible par 4, ce qui signifie que seuls seaux 4, 8, 12, ... sont toujours utilisés , ce qui permet d'utiliser 25% de la structure de données. De manière efficace, les primes Réduisent la probabilité qu'un tel scénario Se produise, avec un nombre> N.

3
Matthew Chan

Nick a raison de dire qu'en général, la taille de la table de hachage n'a pas d'importance. Toutefois, dans le cas particulier où un adressage ouvert avec un double hachage est utilisé (dans lequel l’intervalle entre les sondes est calculé par une autre fonction de hachage), il est préférable de choisir une table de hachage de la taille d'un nombre premier Les entrées de table de hachage sont disponibles pour un nouvel élément (comme mentionné par Corkscreewe.)

3
Neil G

Wikipedia en fait un bon résumé:

http://en.wikipedia.org/wiki/Hash_table

Ils soulignent que certaines fonctions de hachage sont conçues pour fonctionner UNIQUEMENT avec des nombres premiers. Cet article explique pourquoi les puissances à deux sont mauvaises:

http://www.concentric.net/~Ttwang/tech/primehash.htm

2
user236520

Si vous avez une fonction de hachage parfaite avec une distribution égale, alors cela n'a pas d'importance.

2
Nick ODell

Je ne peux plus le prouver, bien que je me souvienne d'avoir été obligé de le faire lors d'un examen universitaire il y a un million d'années, mais les tailles de hachage optimales ne sont pas simplement primordiales. Vous voulez choisir un nombre premierNtel que N = 4*M − 1 (oùMest également un entier). 

Cela fait 31 un meilleur nombre de seaux que 29.Mest 8 quandNest 31, mais il n'y a pas d'intégraleMquandNa 29 ans.

Comme je l'ai dit, je ne me souviens plus des calculs pour le prouver. C’était dans un cours théorique dispensé par Rachel Manber, la femme d’Udi, il ya environ 25 ans.

0
tchrist

voici une façon de comprendre "k% 127 dépend de tous les bits de k. k% 128 ne dépend que des 7 bits les plus bas". .
k% 128 est égal à k & (2 ^ 7-1). Par exemple: 129% 128 = 1, en binaire: 1000 0001 & 0111 1111 = 0000 0001, tout bit de poids fort de (2 ^ 7 -1) sera 0, ce qui signifie que peu importe la position haute. mais cette traduction n'est pas valide pour les nombres qui ne sont pas égaux à 2 ^ n.
Voyons maintenant comment nous procédons dans la division en décimal 129% 127, examinons d’abord la position la plus élevée 1, inférieure à 127, puis nous obtiendrons le point suivant 2 combinant avec le poing nous obtenons 12, 12 est inférieur que 127, alors combinez avec 9 ce qui signifie 129, divisé par 127 le reste est égal à 2, nous pourrions écrire ceci en math: 129 = 1 * 127 +2, donc nous avons 2 [tout cela s'appelle Long_division] et c'est la même chose dans la division binaire, maintenant, nous savons que k% 127 dépend de tous les bits de k

0
paxi

Je pense que cela tient simplement au fait que les ordinateurs fonctionnent avec En base 2. Quelque chose de similaire se produit avec la base 10.

...

Choisir un nombre assez grand, sans puissance de deux, garantira que la fonction de hachage est vraiment une fonction de tous les bits d'entrée, plutôt que de Un sous-ensemble d'entre eux.

De Pourquoi les tables de hachage doivent utiliser une taille de nombre premier .

0
Ste_95