Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Tables de hachage

Après cette leçon: Je peux expliquer comment une table de hachage retrouve une clé rapidement.

Leçon de 55 min3 commandesLab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

Retrouver une fiche parmi 30 000

Une table de hachage range des paires clé-valeur et retrouve une clé en quelques étapes, sans tout parcourir. C’est la structure qui se cache derrière un dictionnaire Python.

La bibliothèque d’une université garde 30 000 fiches d’étudiants. Dans une liste non triée, trouver un numéro demande jusqu’à 30 000 étapes. Une table de hachage calcule d’abord où regarder.

À la fin de cette leçon

Remarque

Je peux expliquer comment une table de hachage retrouve une clé rapidement.

Mots-clés

MotCe que ça veut direExemple
Table de hachageune structure qui retrouve une valeur à partir de sa clé
Cléce que l’on cherche, comme un numéro d’étudiant"Lea"
Fonction de hachageun calcul qui transforme une clé en numéro d’alvéole
Alvéoleune case de la table, qui peut contenir plusieurs paires
Collisiondeux clés qui tombent dans la même alvéole
Chaînagegarder dans chaque alvéole la liste de ses paires

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une fonction de hachage donne l’alvéole

Une table de hachage est un tableau d’alvéoles. Pour ranger une clé, une fonction de hachage la transforme en numéro d’alvéole.

Notre fonction simple additionne les codes des lettres, puis garde le reste de la division par le nombre d’alvéoles. Le même calcul retrouve la clé plus tard : on ne cherche qu’au bon endroit.

Exemple travaillé : hacher des prénoms (7 alvéoles)

CléSomme des codesReste modulo 7Alvéole
Lea274274 = 39 × 7 + 11
Max294294 = 42 × 7 + 00
Tom304304 = 43 × 7 + 33
Eva284284 = 40 × 7 + 44
Ines399399 = 57 × 7 + 00
Zoe302302 = 43 × 7 + 11

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Calculer une alvéole dans le labo

Python donne le code d’une lettre avec ord. La première commande affiche les codes de A et de a. La deuxième additionne les codes de Lea et garde le reste modulo 7, ce qui donne son alvéole.

La troisième affiche le hachage de deux entiers : pour un entier, Python rend l’entier lui-même.

Le code d’une lettre

Commande
python3 -c "print(ord('A'), ord('a'))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

L’alvéole de Lea

Commande
python3 -c "print(sum(ord(c) for c in 'Lea') % 7)"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Le hachage de deux entiers

Commande
python3 -c "print(hash(42), hash(7))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une collision : deux clés dans une alvéole

Dans le tableau ci-dessus, Max et Ines tombent tous deux dans l’alvéole 0. C’est une collision. Elle est normale, car il y a bien plus de clés possibles que d’alvéoles.

Le chaînage la règle : chaque alvéole garde une petite liste de paires. Pour chercher, on calcule l’alvéole, puis on regarde les quelques paires qu’elle contient.

Exemple travaillé : la table après les six ajouts

AlvéolePaires rangées
0Max, Ines
1Lea, Zoe
2Vide
3Tom
4Eva
5Vide
6Vide

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un dictionnaire Python à lancer

Code: python
# Un dictionnaire Python est une table de hachage.
notes = {}
notes["Lea"] = 15
notes["Max"] = 12
notes["Ines"] = 17
print(notes["Max"])
print("Tom" in notes)
# Ajoutez Tom avec la note 9, puis relancez.

Une table assez grande reste rapide

Si la fonction répartit bien les clés, chaque alvéole en contient peu. Chercher coûte alors quelques étapes, même avec un million de clés. Il faut seulement agrandir la table quand elle se remplit.

Avec une très mauvaise fonction, toutes les clés tombent dans la même alvéole. La table devient alors une simple liste, lente à parcourir.

Exemple travaillé : le remplissage de la table

ClésAlvéolesPaires par alvéole en moyenne
1001010
1001001
1001 0000,1
1001, mauvaise fonction100

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Erreur fréquente

Attention

Beaucoup d’étudiants pensent qu’une collision est une erreur, ou que la seconde clé écrase la première. Ce n’est pas vrai. Avec le chaînage, les deux paires partagent l’alvéole et restent toutes deux là. Une collision ne perd aucune donnée.

Pour aller plus loin

Avec la somme des codes, les mots abc, cba et bca tombent toujours dans la même alvéole. Dites pourquoi.

Proposez une fonction de hachage qui les sépare, par exemple en multipliant le code de chaque lettre par sa position. Testez-la sur ces trois mots.

À propos de ce labo et de sa source: Lab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.