La table de hachage est implémentée comme un tableau t dont les cases vont contenir les objets. Initialement, la table est vide, c'est-à-dire chaque case contient un objet spécial vide (par exemple, un objet dont la clé est la chaîne vide "").
data t[N]; data empty_data = {""} ; int is_empty(data d) { return strlen(d.key) == 0; } void init() { int i; for (i=0; i<N; i++) { t[i] = empty_data; } }
Puis des opérations d'insertion sont réalisées. Si un objet de clé x doit être inséré, et que t[h(x)] est vide, alors l'insertion se fait à cette place ; si par contre t[h(x)] est déjà occupé, et que le contenu a une clé différente de x, alors on calcule des valeurs de hachage supplétives h1(x), h2(x), ...jusqu'à ce que l'on trouve t[hi(x)] vide ou contenant un objet de clé x.
Pour générer ces nouvelles valeurs de hachage, la méthode la plus simple
est le hachage linéaire , qui choisit
, ce qui revient à essayer les cases suivant
t[h(x)]. Il y a d'autres méthodes (hachage quadratique, double
hachage, hachage aléatoire) qui ont de meilleures capacités de
dispersion.
int insert(data d) { int v = h(d.key); int i = 0; for (i=0; i<N; i++) { if (is_empty (t[(v+i)%N])) { t[(v+i)%N] = d; break; } else if (!strcmp(t[(v+i)%N].key, d.key)) { break; /* ou bien, mise à jour des autres champs */ } } if (i == N) { return 0; /* table pleine, insertion non réalisée */ } else return 1; /* objet déjà dans la table ou inséré */ }
De même, pour chercher un objet de clé x, on teste les objets en t[h(x)], et éventuellement en t[h1(x)], t[h2(x)], etc, jusqu'à ce que la clé de l'objet qui s'y trouve soit égale à x, ou bien que l'objet soit vide. Dans le cas où la table permet aussi des suppressions, il faut remplacer un objet supprimé par un objet spécial supprimé , distinct de l'objet vide ; en insertion, on utilisera la première case vide ou supprimé, tandis qu'en recherche, on ne s'arrêtera qu'à la première case vide.
data search(const char s[]) { int v = h(s); int i = 0; for (i=0; i<N; i++) { if (is_empty (t[(v+i)%N])) { return empty_data; } else if (!strcmp(t[(v+i)%N].key, s)) { return t[(v+i)%N]; } } return empty_data; /* objet non trouvé */ }
Il est clair que la complexité dans le pire des cas est de N
opérations, N étant la taille de la table. On définit le taux
de chargement d'une table
de hachage de taille N contenant n objets comme la fraction ; on a toujours
. Pour donner une estimation
asymptotique de la complexité des opérations, on fait tendre n et N
vers l'infini, à
constant. On montre que, sous une hypothèse
d'uniformité, le nombre moyen d'accès nécessaires pour une recherche
négative est d'au plus
et pour une recherche positive de
. Par
exemple pour une table à moitié pleine, on doit s'attendre à faire 2
accès pour la recherche d'un objet ne se trouvant pas dans la table, et
et à faire 3,387 accès s'il s'y trouve. Il s'agit bien d'un algorithme
en
.