Numérique et sciences informatiques (spécialité) · TerminaleBac
Dictionnaires et tables de hachage : cours de Terminale NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Un dictionnaire (tableau associatif) range des couples clé : valeur ; chaque clé est associée à une seule valeur au plus.3
- Une table de hachage est une façon de l'implémenter : une fonction de hachage calcule, à partir de la clé, la position de la donnée dans un tableau.2
- Deux clés différentes peuvent donner le même indice : c'est une collision, qu'il faut gérer (chaînage, adressage ouvert).
- Recherche et insertion coûtent en moyenne, mais peuvent coûter dans le pire des cas ; l'ordre des clés n'est pas conservé.3
- Face à un arbre équilibré : table de hachage plus rapide en moyenne, arbre meilleur dans le pire des cas et capable de parcourir les clés dans l'ordre.3
Pourquoi a-t-on besoin des dictionnaires ?
Imagine que tu gères les notes d'une classe. Avec une liste Python, tu peux ranger les notes dans l'ordre, mais pour retrouver celle de « Camille » tu dois parcourir la liste jusqu'à tomber sur le bon élève. Plus la classe est grande, plus la recherche est longue.
Ce que tu voudrais, c'est demander directement : « la note de Camille ? » et obtenir la réponse sans rien parcourir. C'est exactement le service que rend un dictionnaire. Dans ce chapitre, tu vas voir ce qu'est ce type de données, puis comment on arrive à le rendre très rapide grâce au hachage.
Tu as déjà rencontré des structures où l'on accède aux éléments par leur position (listes, listes chaînées) ou selon un ordre d'arrivée (piles, files). Ici, l'accès se fait par un nom, appelé clé, et non par un rang.
Les opérations sur un dictionnaire
Comme pour les piles et les files, on définit un dictionnaire par les opérations qu'il propose, sans parler de la mémoire. Les opérations de base sont les suivantes :
| Opération | Effet |
|---|---|
| créer un dictionnaire vide | on obtient une structure sans aucun couple |
| ajouter / modifier un couple | si la clé existe, sa valeur est remplacée ; sinon le couple est ajouté |
| lire la valeur d'une clé | on obtient la valeur associée, ou une erreur si la clé est absente |
| tester la présence d'une clé | on obtient un booléen |
| supprimer un couple | la clé et sa valeur disparaissent |
| parcourir | on passe en revue les clés, les valeurs ou les couples |
Le point important est que la clé joue le rôle d'identifiant unique : écrire deux fois avec la même clé ne crée pas deux couples, cela remplace la valeur précédente.3
Le principe du hachage
Comment retrouver une valeur sans parcourir tout le dictionnaire ? L'idée est de calculer l'endroit où la donnée est rangée, au lieu de le chercher.
On range les données dans un tableau (une zone de mémoire où l'on accède à une case par son indice en un temps constant). Il suffit alors d'avoir un moyen de transformer une clé en indice de ce tableau. Ce moyen s'appelle une fonction de hachage.
Dans un dictionnaire, la donnée dont on calcule l'adresse est la clé. Pour une table de cases numérotées de à , on veut donc une fonction qui, à toute clé, associe un entier entre et .
Une construction très courante se fait en deux temps :
- transformer la clé en un entier (pour une chaîne de caractères, on peut par exemple additionner les codes de ses caractères) ;
- ramener cet entier dans l'intervalle des indices avec un reste de division : .
- 1. La cléOn part de la clé, par exemple 25.
- 2. CalculOn applique h(k) = k mod 7.
- 3. IndiceOn obtient 25 mod 7 = 4.
- 4. LectureOn lit directement la case 4.
Les collisions et leur gestion
Il y a en général beaucoup plus de clés possibles que de cases dans la table. Par exemple, il existe une infinité de chaînes de caractères, mais la table n'a que cases. Il est donc impossible d'éviter que deux clés distinctes tombent sur la même case : on parle de collision.
Il existe deux grandes familles de solutions.
Le chaînage. Chaque case de la table ne contient pas une seule donnée mais une petite liste (souvent une liste chaînée, que tu connais) de tous les couples dont la clé tombe sur cette case. Pour chercher une clé, on calcule son indice puis on parcourt la petite liste de cette case.
L'adressage ouvert. Chaque case contient au plus un couple. Si la case visée est occupée, on essaie une autre case selon une règle fixée (par exemple la case suivante, en revenant au début à la fin du tableau). La recherche suit la même règle jusqu'à trouver la clé ou une case vide.
| Chaînage | Adressage ouvert | |
|---|---|---|
| Contenu d'une case | une liste de couples | au plus un couple |
| Collision | on ajoute à la liste de la case | on cherche une autre case libre |
| Nombre d'éléments | peut dépasser le nombre de cases | au plus égal au nombre de cases |
| Suppression | simple : on retire de la liste | délicate : il faut marquer la case |
| Indice | Contenu de la case |
|---|---|
| 0 | vide |
| 1 | vide |
| 2 | vide |
| 3 | 31 |
| 4 | 25 |
| 5 | 12 puis 19 (collision) |
| 6 | vide |
Complexité : pourquoi c'est rapide (et quand ça ne l'est plus)
Le grand intérêt de la table de hachage est la vitesse. Pour chercher un élément dans un dictionnaire, la complexité est en : la durée ne dépend pas du nombre d'éléments présents.1 Dans une liste non triée, au contraire, la recherche dans le pire des cas demande de regarder les éléments, soit .
Pourquoi ? Parce que les étapes sont : calculer (durée constante pour une clé de taille raisonnable), lire la case d'indice (accès direct dans un tableau), puis comparer avec très peu d'éléments si la répartition est bonne.
Le pire des cas arrive quand toutes les clés, ou presque, tombent sur la même case. Avec le chaînage, la table se réduit alors à une seule longue liste, qu'il faut parcourir en entier : on retrouve la recherche linéaire. Cette situation est improbable avec une bonne fonction de hachage, mais elle explique que soit une garantie en moyenne et non absolue.
Table de hachage ou arbre équilibré ?
Il existe une seconde façon efficace de représenter un dictionnaire : l'arbre équilibré.3 Tu étudieras bientôt les arbres binaires de recherche ; retiens pour l'instant les différences de comportement entre les deux choix, en notant le nombre d'éléments.
| Critère | Table de hachage | Arbre équilibré |
|---|---|---|
| Insertion et recherche en moyenne | ||
| Pire des cas | peut atteindre | |
| Ordre des clés | non conservé | conservé |
| Place en mémoire | souvent plus compacte | généralement moins compacte |
Les tables de hachage gagnent en moyenne sur l'insertion et la recherche, alors que les arbres équilibrés l'emportent dans le pire des cas.3 La représentation en mémoire d'une table de hachage est en général plus compacte.3
La différence qui compte le plus dans la pratique est celle de l'ordre. Les arbres équilibrés préservent l'ordre des clés : on peut parcourir les clés dans l'ordre ou repérer rapidement une clé proche d'une valeur donnée. Les tables de hachage ne gardent pas cet ordre.3
Erreurs fréquentes et méthode pour le bac
Exercices corrigés
Exercice 1 Calculer des indices dans une table
Une table de hachage contient cases (indices de à ). La fonction de hachage est . On insère dans l'ordre les clés , , et , avec un chaînage pour les collisions.
- Calcule l'indice de la clé .
- Y a-t-il une collision ? Entre quelles clés ?
Indice 1
Fais la division euclidienne de 25 par 7 et garde le reste.
Indice 2
Calcule l'indice des quatre clés et cherche celles qui partagent le même.
Voir la correction pas à pas
Pour : , donc .
Les autres indices : car ; car ; car .
Les clés et ont le même indice : c'est une collision.
Avec le chaînage, la case contient la liste des couples de clés puis .
La clé est rangée à l'indice . La collision concerne et , qui partagent la case .
Exercice 2 Hachage d'une chaîne de caractères
On définit le hachage d'un mot de la façon suivante : on additionne les codes ASCII de ses lettres, puis on prend le reste de la division par . Les codes sont : N = 78, S = 83, I = 73.
Calcule l'indice de la clé "NSI" dans la table de 10 cases.
Indice 1
Additionne d'abord les trois codes.
Indice 2
Le reste de la division par 10 est le chiffre des unités.
Voir la correction pas à pas
On additionne les codes : .
On calcule le reste de la division par : .
L'indice est donc , bien compris entre et .
La clé "NSI" est rangée à l'indice . Tout mot dont la somme des codes se termine par 4 tombe aussi sur cette case, ce qui montre pourquoi les collisions sont inévitables.
Exercice 3 Facteur de remplissage
Une table de hachage possède cases et contient couples. On décide d'agrandir la table dès que le facteur de remplissage atteint ou dépasse .
Calcule . La table doit-elle être agrandie ?
Indice 1
Divise le nombre de couples par le nombre de cases.
Indice 2
Compare le résultat au seuil de 0,75.
Voir la correction pas à pas
On applique la définition : .
On simplifie : .
Le seuil est atteint () : il faut agrandir la table.
Le facteur de remplissage vaut , donc la table doit être agrandie, puis toutes les clés sont replacées avec la nouvelle taille.
Exercice 4 Première lettre répétée
Écris une fonction premiere_repetee(mot) qui renvoie la première lettre qui apparaît pour la deuxième fois en lisant le mot de gauche à droite, ou None si toutes les lettres sont différentes. Utilise un dictionnaire et ne parcours le mot qu'une seule fois. Donne la complexité en moyenne, puis le résultat pour "informatique".
Indice 1
Utilise un dictionnaire des lettres déjà vues, et teste la présence avant d'ajouter.
Indice 2
Chaque test de présence et chaque ajout coûtent en moyenne.
Voir la correction pas à pas
On crée un dictionnaire vide
vues.On parcourt le mot lettre par lettre. Si la lettre est déjà une clé de
vues, on la renvoie immédiatement.Sinon, on l'ajoute :
vues[c] = True.Si la boucle se termine sans retour, on renvoie
None.Le mot est parcouru une fois et chaque opération sur
vuesest en en moyenne : la complexité est en pour un mot de lettres.Pour
"informatique": i, n, f, o, r, m, a, t sont nouvelles ; la lettre i, lue ensuite, est déjà dansvues, donc la fonction renvoie"i".
def premiere_repetee(mot):
vues = {}
for c in mot:
if c in vues:
return c
vues[c] = True
return None
La fonction est en en moyenne et renvoie "i" pour "informatique".
Quiz
7 questions · correction immédiate · ton score reste sur ton appareil.
-
Chaque clé est associée à une seule valeur au plus, ce qui en fait l'identifiant du couple.3 La valeur, elle, peut se répéter : deux élèves peuvent avoir la même note. L'indice est un détail interne de l'implémentation, pas ce que manipule l'utilisateur.
-
La fonction fournit l'adresse d'une donnée dans la table.2 La valeur associée est lue ensuite à cette adresse, elle n'est pas calculée par . Le nombre de collisions dépend de la fonction mais n'est pas sa sortie.
-
On a , donc le reste est . Le quotient est une erreur tentante : l'indice est le reste, pas le quotient.
-
Une collision désigne deux clés distinctes pour lesquelles donne le même résultat. Deux valeurs égales ne posent aucun problème : seules les clés déterminent l'emplacement.
-
En moyenne, la recherche dans une table de hachage est en .3 Le est celui des arbres équilibrés dans le pire des cas, et le celui d'une recherche linéaire ou d'une table mal répartie.
-
Les arbres équilibrés préservent l'ordre des clés alors que les tables de hachage ne le font pas.3 Le pire des cas d'une table de hachage peut monter à , donc la troisième proposition est fausse. Les collisions sont inévitables et ne traduisent pas une erreur.
-
C'est l'inverse : les noms sont les clés et les numéros les valeurs.3 On cherche un numéro à partir d'un nom, ce qui correspond au modèle usuel de l'annuaire.
Les questions qu'on se pose
Pourquoi une recherche dans un dictionnaire est-elle plus rapide que dans une liste ?
Dans une liste, il faut comparer l'élément cherché aux éléments un par un, ce qui coûte dans le pire des cas. Dans une table de hachage, on calcule l'adresse de la clé et on va directement à la bonne case, d'où une durée qui ne dépend pas du nombre d'éléments.1
Peut-on avoir deux fois la même clé dans un dictionnaire ?
Non. Chaque clé est associée à une seule valeur au plus.3 Si tu écris une seconde fois avec la même clé, la nouvelle valeur remplace l'ancienne. Si tu as besoin de plusieurs valeurs pour une même clé, mets une liste comme valeur.
Pourquoi les collisions sont-elles inévitables ?
Il y a beaucoup plus de clés possibles que de cases. Quand on range plus de clés que de cases, au moins deux clés partagent forcément une case. Même avec moins de clés que de cases, une fonction de hachage peut envoyer deux clés vers le même indice par hasard. L'important est de les gérer (chaînage, adressage ouvert) et de bien répartir les clés.
Que faut-il savoir pour le bac ?
Il faut savoir définir un dictionnaire, utiliser les opérations de base en Python, expliquer le rôle d'une fonction de hachage, remplir à la main une table avec gestion des collisions, et justifier la complexité moyenne en . Il faut aussi savoir comparer avec une autre structure, en particulier sur l'ordre des clés.
Sources
- Fiche NSI Terminale : Dictionnaire, Pixees (INRIA). Consulté le 7 novembre 2026.
- Hachage (encyclopédie technique), Universalis. Consulté le 7 novembre 2026.
- Tableau associatif, Wikipédia. Consulté le 7 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.