Aller au contenu

Numérique et sciences informatiques (spécialité) · TerminaleBac

Dictionnaires et tables de hachage : exercices de Terminale NSI

Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur

L'essentiel

  • Un dictionnaire associe à chaque clé une seule valeur : il stocke des couples clé:valeur 13.
  • Une fonction de hachage h calcule à partir d'une donnée sa position dans une table 2.
  • La recherche dans une table de hachage est en O(1) en moyenne, mais peut atteindre O(n) dans le pire des cas 3.
  • Une table de hachage ne conserve pas l'ordre des clés, contrairement à un arbre équilibré 3.
  • Les exercices vont de la lecture d'un dictionnaire jusqu'à l'écriture d'une fonction qui transforme un dictionnaire.

Comment utiliser ces exercices

Cette série t'entraîne sur les dictionnaires et les tables de hachage, juste après les listes chaînées, les piles et les files. Les exercices sont rangés par difficulté croissante : le niveau 1 vérifie que tu lis correctement un dictionnaire, le niveau 2 te fait calculer à la main avec une fonction de hachage, le niveau 3 te demande de raisonner ou d'écrire du code.

Pour progresser, cherche d'abord seul, sur papier. Ouvre un indice seulement quand tu es bloqué, puis compare ta démarche avec la correction étape par étape. Si ton résultat final est juste mais que ta méthode diffère, relis quand même la correction : au bac, c'est le raisonnement qui est noté.

Les exercices

Exercice 1 Lire un dictionnaire de notes

★☆☆Environ 5 min

Un professeur range les notes de trois élèves dans un dictionnaire Python :

notes = {"Léa": 14, "Tom": 9, "Inès": 16}
  1. Quelles sont les clés ? Quelles sont les valeurs ?
  2. Que renvoie notes["Tom"] ?
  3. Calcule la moyenne des trois notes.
Indice 1

Un dictionnaire contient des couples clé:valeur : la clé est à gauche des deux-points 1.

Indice 2

Pour la moyenne, additionne toutes les valeurs puis divise par le nombre de clés.

Voir la correction pas à pas
  1. Les clés sont les noms : "Léa", "Tom" et "Inès". Les valeurs sont les notes : 14, 9 et 16.

  2. L'expression notes["Tom"] cherche la valeur associée à la clé "Tom". Elle renvoie 9.

  3. On additionne les valeurs : 14+9+16=3914 + 9 + 16 = 39.

  4. On divise par le nombre d'élèves : 393=13\dfrac{39}{3} = 13.

La moyenne de la classe est 13. Retiens que l'accès notes[clé] donne la valeur, et qu'on ne peut pas chercher un nom à partir d'une note avec cette syntaxe.

Exercice 2 Compter les lettres d'un mot

★☆☆Environ 8 min

On exécute ce programme :

mot = "banane"
compteur = {}
for lettre in mot:
    if lettre in compteur:
        compteur[lettre] = compteur[lettre] + 1
    else:
        compteur[lettre] = 1
  1. Donne le contenu final de compteur.
  2. Quelle est la somme de toutes les valeurs du dictionnaire ?
Indice 1

Déroule la boucle lettre après lettre : la première fois qu'une lettre apparaît, on crée la clé avec la valeur 1.

Indice 2

La somme des valeurs correspond au nombre de passages dans la boucle.

Voir la correction pas à pas
  1. b : absente, on crée {"b": 1}.

  2. a : absente, on obtient {"b": 1, "a": 1}.

  3. n : absente, on ajoute "n": 1.

  4. Le deuxième a est déjà une clé : sa valeur passe à 2. Le deuxième n passe aussi à 2.

  5. e : absente, on ajoute "e": 1. Le contenu final est {"b": 1, "a": 2, "n": 2, "e": 1}.

  6. La somme des valeurs vaut 1+2+2+1=61 + 2 + 2 + 1 = 6, soit la longueur du mot.

Le dictionnaire compte 6 lettres au total, réparties sur 4 clés. Chaque lettre n'a qu'une seule valeur : son nombre d'apparitions 3.

Exercice 3 Calculer une position avec une fonction de hachage

★★☆Environ 10 min

Une fonction de hachage associe à une donnée sa position dans une table 2. On définit ici une fonction très simple pour des mots en majuscules : h(mot)h(\text{mot}) est le reste de la division par 7 de la somme des rangs des lettres dans l'alphabet (A = 1, B = 2, ..., Z = 26). La table possède 7 cases, numérotées de 0 à 6.

Rappel de quelques rangs : A = 1, C = 3, E = 5, H = 8, L = 12, N = 14, O = 15, R = 18, S = 19, T = 20, U = 21.

Calcule la position de la clé "CHAT".

Indice 1

Écris d'abord le rang de chaque lettre, puis additionne.

Indice 2

Divise la somme par 7 et garde seulement le reste.

Voir la correction pas à pas
  1. Rangs des lettres : C = 3, H = 8, A = 1, T = 20.

  2. Somme : 3+8+1+20=323 + 8 + 1 + 20 = 32.

  3. Division par 7 : 32=4×7+432 = 4 \times 7 + 4, donc le reste est 4.

  4. On range donc la clé "CHAT" dans la case numéro 4.

La position de "CHAT" est la case 4. Le reste de la division garantit un résultat entre 0 et 6, c'est-à-dire une case qui existe.

Exercice 4 Repérer une collision

★★☆Environ 12 min

On reprend la fonction de l'exercice précédent (somme des rangs, puis reste de la division par 7). On insère dans l'ordre les clés "CHAT", "LUNE", "TOUR" et "ROSE" dans la table de 7 cases.

  1. Calcule la position de chaque clé.
  2. Deux clés sont-elles envoyées dans la même case ? Si oui, combien de clés contient cette case ?
Indice 1

Tu connais déjà la position de "CHAT". Calcule les trois autres de la même façon.

Indice 2

Une case qui reçoit plusieurs clés peut simplement contenir une liste de couples.

Voir la correction pas à pas
  1. "LUNE" : 12+21+14+5=5212 + 21 + 14 + 5 = 52 et 52=7×7+352 = 7 \times 7 + 3, position 3.

  2. "TOUR" : 20+15+21+18=7420 + 15 + 21 + 18 = 74 et 74=10×7+474 = 10 \times 7 + 4, position 4.

  3. "ROSE" : 18+15+19+5=5718 + 15 + 19 + 5 = 57 et 57=8×7+157 = 8 \times 7 + 1, position 1.

  4. Avec "CHAT" en position 4, on constate que "CHAT" et "TOUR" visent la même case : c'est une collision.

  5. On compte les clés de la case 4 : "CHAT" et "TOUR", soit 2 clés.

La case 4 contient 2 clés. Une collision n'est pas une erreur du programme : une table de hachage doit prévoir ce cas, par exemple en gardant une petite liste dans chaque case. Quand beaucoup de clés se regroupent, la recherche ne se fait plus en une seule étape ; c'est ce qui explique le pire cas en O(n) de certaines tables de hachage 3.

Exercice 5 Taille d'une empreinte

★★☆Environ 8 min

Pour vérifier qu'un document n'a pas été modifié, on utilise une fonction de hachage qui calcule une empreinte du document 2. La fonction MD5 produit des empreintes de 128 bits, et SHA-1 des empreintes de 160 bits 2. Un octet vaut 8 bits.

De combien d'octets l'empreinte SHA-1 est-elle plus longue que l'empreinte MD5 ?

Indice 1

Convertis d'abord chaque taille en octets.

Indice 2

Fais ensuite la différence.

Voir la correction pas à pas
  1. Empreinte MD5 : 1288=16\dfrac{128}{8} = 16 octets.

  2. Empreinte SHA-1 : 1608=20\dfrac{160}{8} = 20 octets.

  3. Différence : 20−16=420 - 16 = 4 octets.

L'empreinte SHA-1 est plus longue de 4 octets. Une empreinte a toujours une taille fixe, quelle que soit la taille du document de départ ; elle sert à détecter une modification, pas à retrouver le document.

Exercice 6 Comparer deux structures de recherche

★★☆Environ 10 min

Un arbre équilibré et une table de hachage peuvent représenter un tableau associatif de nn éléments. Dans le pire des cas, la recherche dans un arbre équilibré est en O(log⁡n\log n), alors que la table de hachage est en O(1) en moyenne 3. On suppose qu'un arbre équilibré contient n=1024n = 1024 éléments et que le nombre de comparaisons dans le pire des cas est de l'ordre de log⁡2n\log_2 n.

  1. Estime ce nombre de comparaisons.
  2. Pour quel besoin choisirais-tu l'arbre plutôt que la table de hachage ?
Indice 1

Cherche la puissance de 2 égale à 1024.

Indice 2

Pense à ce que l'arbre garde et que la table ne garde pas 3.

Voir la correction pas à pas
  1. On cherche xx tel que 2x=10242^x = 1024.

  2. Comme 210=10242^{10} = 1024, on a log⁡2(1024)=10\log_2(1024) = 10 : environ 10 comparaisons dans le pire des cas.

  3. Les arbres équilibrés préservent l'ordre des clés, ce qui permet de les parcourir dans l'ordre ou de trouver une clé proche d'une valeur donnée ; les tables de hachage ne le permettent pas 3.

  4. On choisit donc l'arbre quand l'ordre des clés compte, ou quand on veut une borne garantie même dans le pire des cas.

Le nombre de comparaisons est d'environ 10. Retiens ce compromis : la table de hachage est plus rapide en moyenne, l'arbre est plus régulier et ordonné 3.

Exercice 7 Valeur totale d'un stock

★★★Environ 12 min

Un magasin range son stock dans un dictionnaire : la clé est le nom du fruit, la valeur est un couple (quantité, prix unitaire en euros).

stock = {"pomme": (12, 0.50), "poire": (10, 0.80), "kiwi": (20, 0.25)}

def valeur_totale(d):
    total = 0
    for fruit in d:
        quantite, prix = d[fruit]
        total = total + quantite * prix
    return total
  1. Que contient la variable quantite lors du passage sur "poire" ?
  2. Quelle valeur renvoie valeur_totale(stock) ?
  3. Quelle instruction ajoute 5 bananes à 0,40 euro ?
Indice 1

Le parcours for fruit in d donne les clés ; la valeur s'obtient avec d[fruit].

Indice 2

Calcule la valeur de chaque fruit, puis additionne.

Voir la correction pas à pas
  1. Pour la clé "poire", d[fruit] vaut (10, 0.80). Le dépaquetage donne quantite = 10 et prix = 0.80.

  2. Valeur des pommes : 12×0,50=612 \times 0{,}50 = 6 euros.

  3. Valeur des poires : 10×0,80=810 \times 0{,}80 = 8 euros.

  4. Valeur des kiwis : 20×0,25=520 \times 0{,}25 = 5 euros.

  5. Total : 6+8+5=196 + 8 + 5 = 19 euros.

  6. Pour ajouter un élément, on affecte une nouvelle clé : stock["banane"] = (5, 0.40).

La fonction renvoie 19 euros. Ajouter une nouvelle clé se fait par une simple affectation ; si la clé existait déjà, sa valeur serait remplacée, puisqu'une clé n'a qu'une valeur 3.

Exercice 8 Regrouper des élèves par groupe

★★★Environ 15 min

Un dictionnaire associe chaque élève à son groupe :

groupes = {"Léa": "A", "Tom": "B", "Inès": "A"}

Écris une fonction inverser(d) qui renvoie un nouveau dictionnaire dont les clés sont les groupes et les valeurs sont les listes des élèves de ce groupe. Pour groupes, le résultat attendu est {"A": ["Léa", "Inès"], "B": ["Tom"]}.

Indice 1

Il faut parcourir les clés de d, puis regarder la valeur associée pour savoir dans quel groupe ranger l'élève.

Indice 2

Quand un groupe n'est pas encore une clé du résultat, crée-lui d'abord une liste vide.

Voir la correction pas à pas
  1. On crée un dictionnaire vide : resultat = {}.

  2. On parcourt les élèves : for eleve in d:.

  3. On lit le groupe de l'élève : g = d[eleve].

  4. Si ce groupe n'est pas encore une clé de resultat, on l'ajoute avec une liste vide : if g not in resultat: resultat[g] = [].

  5. On ajoute l'élève à la liste du groupe : resultat[g].append(eleve).

  6. On renvoie resultat à la fin de la fonction, hors de la boucle.

La fonction complète est :

def inverser(d):
    resultat = {}
    for eleve in d:
        g = d[eleve]
        if g not in resultat:
            resultat[g] = []
        resultat[g].append(eleve)
    return resultat

Il faut des listes en valeurs, car plusieurs élèves partagent un même groupe : une clé ne peut porter qu'une seule valeur 3. L'ordre d'affichage des clés ne doit jamais être utilisé pour raisonner.

Les questions qu'on se pose

Pourquoi la recherche dans un dictionnaire est-elle si rapide ?

La fonction de hachage calcule directement la position où se trouve la donnée dans la table 2. On ne parcourt donc pas tous les éléments : la durée de recherche ne dépend pas de leur nombre 1. Cette rapidité est une moyenne : dans le pire des cas, certaines tables de hachage atteignent O(n) 3.

Que faire quand deux clés ont la même position dans la table ?

C'est une collision. Elle est normale et une table de hachage correctement écrite la gère, par exemple en gardant plusieurs couples dans une même case, comme dans l'exercice 4. Plus il y a de collisions, plus la recherche ralentit, ce qui explique le pire cas en O(n) 3.

Sources

  1. Fiche NSI Terminale : Dictionnaire, Pixees (INRIA). Consulté le 7 novembre 2026.
  2. Hachage (encyclopédie technique), Universalis. Consulté le 7 novembre 2026.
  3. 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.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page