Cette réponse résume des parties de TAoCP Vol 3, Ch 6.4.
Supposons que nous ayons un ensemble de valeurs , que nous voulons stocker dans un tableau de taille . Nous employons une fonction de hachage ; typiquement,. Nous appelons le facteur de charge de . Ici, nous supposerons le naturel ; dans les scénarios pratiques, nous avons , cependant, et doivent cartographier jusqu'à nous.n A m h : V → [ 0 .. M ) M ≪ | V | α = nVnAmh:V→[0..M)M≪|V| Am=Mm≪Mmα=nmAm=Mm≪Mm
La première observation est que même si présente des caractéristiques uniformes¹, la probabilité que deux valeurs aient la même valeur de hachage est élevée; c’est essentiellement un exemple du fameux paradoxe des anniversaires . Par conséquent, nous devrons généralement faire face à des conflits et abandonner tout espoir de pire des cas.O ( 1 )hO(1)
Qu'en est-il du cas moyen, cependant? Supposons que chaque clé de se produit avec la même probabilité. Le nombre moyen d'entrées vérifiées (recherche réussie) resp. (recherche infructueuse) dépend de la méthode de résolution de conflit utilisée.C S n C U n[0..M)CSnCUn
Chaînage
Chaque entrée de tableau contient (un pointeur sur l'en-tête de) une liste liée. C'est une bonne idée car la longueur de liste attendue est petite ( ), même si la probabilité d'avoir des collisions est élevée. Au final, nous obtenons
Cela peut être légèrement amélioré en stockant les listes (partiellement ou complètement) dans la table. C S n ≈1+αnm
CSn≈1+α2 and CUn≈1+α22.
Palpage linéaire
Lorsque vous insérez (ou cherchez une valeur) , vérifiez les positions
dans cet ordre jusqu'à une position vide (resp. ) est trouvé. L'avantage est que nous travaillons localement et sans structures de données secondaires; cependant, le nombre d'accès moyens diverge pour :
Pour , toutefois, les performances sont comparables à celles du chaînage².v
h(v),h(v)−1,…,0,m−1,…,h(v)+1
vα→1α<0,75CSn≈12(1+11−α) and CUn≈12(1+(11−α)2).
α<0.75
Double hachage
Similaire à sonder linéaire mais la taille de l' étape de recherche est commandée par une seconde fonction de hachage qui est premier à . Aucune dérivation formelle n'est donnée, mais des observations empiriques suggèrent que
Cette méthode a été adaptée par Brent. Cette variante amortit les coûts d’insertion accrus par des recherches moins coûteuses.C S n ≈ 1M
CSn≈1αln(11−α) and CUn≈11−α.
Notez que le retrait d'éléments des tables et leur extension présentent des difficultés variables pour les méthodes respectives.
En bout de ligne, vous devez choisir une implémentation qui s'adapte bien à vos cas d'utilisation typiques. Le temps d'accès attendu dans est possible s'il n'est pas toujours garanti. En fonction de la méthode utilisée, maintenir low est essentiel; vous devez faire un compromis entre le temps d'accès (prévu) et les frais généraux. Un bon choix pour est aussi central, évidemment.O(1)hαh
1] Etant donné que les programmeurs non avertis arbitrairement muets peuvent fournir , toute hypothèse concernant sa qualité n’est pas pratique dans la pratique.
2] Notez comment cela coïncide avec les recommandations d'utilisation de Java .h
Hashtable