Académique Documents
Professionnel Documents
Culture Documents
V1
I Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
II Le type dict en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
II.1 Déclaration littérale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
II.2 Lecture de valeur, ajout de clef et modification de valeur . . . . . . . . 1
II.3 Suppression d’une clef . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
II.4 Itérations sur les clefs et les valeurs . . . . . . . . . . . . . . . . . . . . 2
II.5 Test d’appartenance avec le mot clef in . . . . . . . . . . . . . . . . . 2
II.6 Copie d’un dictionnaire . . . . . . . . . . . . . . . . . . . . . . . . . . 2
II.7 Restriction sur les clefs et les valeurs . . . . . . . . . . . . . . . . . . . 3
III Exercices sur les dictionnaires . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
III.1 Exercice 1 : QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
III.2 Exercice 2 : notation d’un QCM . . . . . . . . . . . . . . . . . . . . . 4
III.3 Exercice 3 : Fréquence d’apparition des lettres dans un texte . . . . . 4
IV Fonctionnement interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
IV.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
IV.2 Fonction de hashage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
IV.3 Collision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
IV.4 Résolution des collisions par chaı̂nage . . . . . . . . . . . . . . . . . . 6
IV.5 Exercice 4 : Hashage et Collisions . . . . . . . . . . . . . . . . . . . . . 8
1
Informatique commune PSI
I Présentation
En informatique, un tableau associatif (aussi appelé dictionnaire ou table d’association est un type
de données associant à un ensemble de clefs, un ensemble correspondant de valeurs. Chaque clef est
associée à une seule valeur (au plus). On peut citer par exemple :
— annuaire : les noms sont les clés et les valeurs sont les numéros de téléphone et les adresses ;
— dictionnaire : les mots sont les clés et les définitions sont les valeurs ;
— inventaire : les produits sont les clés et les quantités sont les valeurs.
1 >>> d1 = {} ; d2 = dict ()
2 >>> type ( d1 ) ; type ( d2 )
3 < class ’ dict ’ >
4 < class ’ dict ’ >
Si on souhaite directement avoir un tableau rempli, le format est le suivant : {clef1: valeur1,
clef2: valeur2, ... }.
1 >>> lettres = { ’m ’: 1 , ’s ’: 4 , ’p ’: 2 , ’i ’: 4}
2 >>> lettres
3 { ’m ’: 1 , ’s ’: 4 , ’p ’: 2 , ’i ’: 4}
4 >>> type ( lettres )
5 < class ’ dict ’ >
1 >>> lettres = { ’m ’: 1 , ’s ’: 4 , ’p ’: 2}
2 >>> lettres [ ’i ’] = 4 # création d’un nouveau couple clef, valeur dans lettres
3 >>> lettres [ ’m ’] # accès en lecture de la valeur correspondant à la clef ’m’
4 1
5 >>> lettres [ ’s ’] = 2 # changement de la valeur correspondant à la clef ’s’
6 >>> print ( lettres )
7 { ’m ’: 1 , ’s ’: 2 , ’p ’: 2 , ’i ’: 4}
www.upsti.fr 1/8
Informatique commune PSI
1 >>> ’k ’ in lettres
2 False
3 >>> ’i ’ in lettres
4 True
1 >>> d1 = { ’m ’: 1 , ’s ’: 4 , ’p ’: 2 , ’i ’: 4}
2 >>> d2 = d1 ; d3 = d1 . copy ()
3 >>> d1 [ ’m ’] = 0 ; d2 [ ’o ’] = 2
4 >>> print ( d1 ) ; print ( d2 ) ; print ( d3 )
5 { ’m ’: 0 , ’s ’: 4 , ’p ’: 2 , ’i ’: 4 , ’o ’: 2}
6 { ’m ’: 0 , ’s ’: 4 , ’p ’: 2 , ’i ’: 4 , ’o ’: 2}
7 { ’m ’: 1 , ’s ’: 4 , ’p ’: 2 , ’i ’: 4}
www.upsti.fr 2/8
Informatique commune PSI
www.upsti.fr 3/8
Informatique commune PSI
A) mon_dict[cle] = valeur
B) mon_dict(cle) = valeur
C) mon_dict[valeur] = cle
D) mon_dict.append(cle,valeur)
Question 8 : Pour effacer une clé et sa valeur, on utilise
A) del(mon_dic[cle])
B) mon_dic.del(valeur)
C) del(mon_dic,valeur)
D) del(mon_dic[valeur])
Question 9 : Pour parcourir les clés d’un dictionnaire, on utilise
A) for cle in mon_dic.keys()
B) for cle in range(len(mon_dic))
C) for cle in mon_dic.values()
D) for val in mon_dic.values()
Question 10 : Pour parcourir les valeurs d’un dictionnaire, on utilise
A) for val in mon_dic.keys()
B) for cle in range(len(mon_dic))
C) for cle in mon_dic.values()
D) for val in mon_dic.values()
IV Fonctionnement interne
IV.1 Généralités
Bien évidemment, on souhaite avoir la rapidité en même temps que la souplesse d’utilisation. Pour
cela, un dictionnaire est organisé en interne de la manière suivante :
— on garde une structure indicée comme une liste ou un tableau, ce qui garantit un temps d’accès
à une valeur quelconque en temps constant (en O(1)) ;
— on a besoin d’une fonction dont le rôle est de calculer un indice sur la base de la clé. Cette fonction
est appelée fonction de hashage. On la notera h dans la suite du cours telle que h : K → N.
www.upsti.fr 4/8
Informatique commune PSI
Tableau contenant
Ensemble des clés
les valeurs associées
h(k2 )
h(k3 )
k1
k0
h(k4 )
h(k1 )
k4 k2
h(k0 )
k3
Figure 1 – Schéma représentant les liens entre l’ensemble des clés et les indices d’un tableau grâce à
la fonction de hashage.
Elle calcule l’indice correspondant à la clé en un temps très court pour ne pas dégrader les
performances des primitives (un exemple très simple est exposé plus loin).
Une représentation du fonctionnement vous est fournie à la figure 1. Les clés sont notées kn avec
n ∈ N. La fonction de hachage calcule un indice h(kn ) de type entier ce qui permet de faire le lien
(matérialisé par une flèche) entre une clé et un indice du tableau, Dans la suite, et pour simplifier
notre exemple, nous partons avec des clés de type chaı̂ne de caractères et des valeurs de type entier
(à ne pas confondre avec les indices du tableau qui sont aussi des entiers). La structure pour stocker
les paires clé-valeur sera un tableau. En suivant la syntaxe python, notre dictionnaire aura l’allure
suivante : {"key20":45 , "key31":2678 , "key2":954 , "key17":4269 , "key58":329}.
www.upsti.fr 5/8
Informatique commune PSI
1 def h ( chaine , n ):
2 s =0
3 for c in chaine :
4 s += ord ( c ) # ord() est la fonction ascii() définie auparavant.
5 # elle est présente nativement dans python.
6 return s % n
h: K → VP
n−1
c 7→ i=0 ascii(ci ) mod n
avec c une chaı̂ne de caractères, ci le caractère d’indice i de c et ascii() une fonction prenant un
caractère et retournant son code ASCII. Le code python d’une telle fonction est donnée à la figure 2.
Pour l’exemple donné plus haut avec un tableau de sept éléments, cela donne la représentation de la
figure 3.
IV.3 Collision
Dans notre exemple avec des clés de type chaı̂ne de caractères, l’ensemble est de cardinal infini. De
l’autre côté, le tableau possède un nombre fini d’indices. La fonction ne peut donc être injective. Quelle
que soit la taille de ce tableau, il y a forcément au moins un cas où pour deux clés différentes, la fonction
de hachage produira le même entier. Dans ce cas, on dit qu’il y a collision. Un exemple est représenté
à la figure 4 en ajoutant deux nouvelles paires clé-valeur à notre dictionnaire exemple (les deux
dernières). Nous avons maintenant {"key20":45 , "key31":2678 , "key2":954 , "key17":4269
, "key58":329 , "key33":97 }. Les clés "key58" et "key33" comme paramètre de la fonction h
donnent le même entier.
www.upsti.fr 6/8
Informatique commune PSI
Tableau conte-
Ensemble des clés nant les valeurs
associées aux clés
45
954
”key31”
2678
”key20” Indices
croissants
329
”key58” ”key2”
”key17”
4269
”key20” :45
”key2” :954
”key31”
”key31” :2678
”key20”
”key58” ”key2”
”key17”
”key17” :4269
”key33”
www.upsti.fr 7/8
Informatique commune PSI
puisque la taille du tableau est un des paramètres. Toutes les données sont relogées dans le nouveau
tableau avec une répartition bien meilleure, ce qui permet de garder des complexités intéressantes
pour les primitives. Seules la création de ce nouveau tableau et la nouvelle répartition des données
”coûtera” du temps, mais ce temps consommé ne sera que ponctuel, le reste du temps les opérations
seront à coût constant.
www.upsti.fr 8/8