0% ont trouvé ce document utile (0 vote)
78 vues6 pages

TD Hachage

Le document traite des tables de hachage, une structure de données essentielle pour implémenter des dictionnaires, en expliquant le concept de fonction de hachage et la gestion des collisions par sondage linéaire. Il présente également des questions pratiques sur l'implémentation, la recherche, l'insertion et la suppression d'éléments, ainsi qu'une analyse mathématique de la complexité des opérations. Enfin, il souligne l'importance historique de cette étude dans le domaine de l'informatique et l'analyse des algorithmes.

Transféré par

oroukobizime
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
78 vues6 pages

TD Hachage

Le document traite des tables de hachage, une structure de données essentielle pour implémenter des dictionnaires, en expliquant le concept de fonction de hachage et la gestion des collisions par sondage linéaire. Il présente également des questions pratiques sur l'implémentation, la recherche, l'insertion et la suppression d'éléments, ainsi qu'une analyse mathématique de la complexité des opérations. Enfin, il souligne l'importance historique de cette étude dans le domaine de l'informatique et l'analyse des algorithmes.

Transféré par

oroukobizime
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

1

Tables de hachage

I. Introduction
Une structure de donnée impérative très utile pour implémenter un dictionnaire
est la table de hachage.
L’idée est d’utiliser un tableau de taille 𝑚 et d’avoir une fonction (de hashage)
h : 'a -> int qui, à chaque élément de type 'a, associe un entier indiquant la
case où stocker la donnée. Ainsi, une donnée d sera stockée dans la case numéro
h d (ou, plus précisément, (h d) mod m) du tableau.
Cependant, en pratique, on ne peut pas utiliser directement cette idée, à cause
d’éventuelles collisions. On dit que deux données provoquent une collision si
elles ont la même clé. On est obligé de gérer la possibilité de collisions dans
l’implémentation d’une table de hashage.

Remarque La possibilité d’une collision et les probabilités associées sont


proches du paradoxe des anniversaires qui dit, que pour une assemblé d’au
moins 23 personnes, il y a au moins 50% de chances que deux personnes soient
nées le même jour de l’année. D’ailleurs, savez-vous retrouver ce résultat ?
En termes de table de hashage, pour un tableau avec 365 cases, il suffit de
vouloir stocker 23 éléments pour avoir au moins une chance sur deux d’obtenir
une collision. Cela montre à quel point la gestion des collisions est importante.

Dans la suite de ce TD, nous allons étudier une méthode de gestion des collisions.
Pour illustrer la méthode utilisée, nous allons supposer que nous utilisons une
table de dix cases (allant de 0 à 9) et que nous y insérons les chaînes de caractères
suivantes, dans l’ordre et les cases indiqués :

Élément Clé de hashage


1. Il 7
2. en 0
3. faut 5
4. peu 5
5. pour 7
6. être 6
7. heureux 7
Les clés successives à insérer forment la séquence de hachage (7, 0, 5, 5, 7, 6, 7).
Les insertions successives dans le tableau se déroulent ainsi :
2

M Si la case correspondant à la clé de hachage est vide, on insère la valeur dans


la case.
M Sinon, il y a collision et on doit chercher une autre case disponible (on sup-
pose qu’il y en a une). Pour cela, nous allons procéder par sondage linéaire
(linear probing) : on examine les cases suivantes dans l’ordre en sélectionnant la
première case vide. Si l’on arrive au bout du tableau, on revient au début.
Ainsi, lorsque l’on veut insérer « peu » de clé 5, comme la case correspondante est
déjà occupée, on mets le mot dans la case disponible suivante, ici la 6.
La séquence d’insertion des mots précédents peut donc se représenter ainsi :

0 0 en 0 en
1 1 1 heureux
2 2 2
3 3 3
4 4 4
… …
5 5 faut peu 5 faut
6 6 6 peu
7 Il 7 Il 7 Il
8 8 8 pour
9 9 9 être

Cette méthode s’appelle sondage linéaire (linear probing en anglais), puisqu’à


partir de la case correspondant à la clé, on sonde les cases dans l’ordre (en cyclant
éventuellement) jusqu’à trouver une case vide.
On suppose qu’il y a toujours une case vide dans la table lorsque l’on fait un
insertion, une suppression ou une recherche.

II. Implémentation
1. Mise en place
Nous allons représenter une table de hachage par un table d’élements optionels,
donc de type 'a option array. Ainsi, la représentation de la table précédente
est :
[| Some ”en”; Some ”heureux”; None; None; None; Some ”faut”;
Some ”peu”; Some ”Il”; Some ”pour”; Some ”être” |]
3

On rappelle que le type 'a option est défini par :


type 'a option = None | Some of 'a

La fonction de hachage pour des données de type 'a, de type 'a -> int, est pas-
sée en argument à chaque appel de fonction la nécessitant. Les entiers renvoyés
pouvant être quelconques, on utilisera le reste de la division par la taille de la
table pour obtenir un indice convenable.

2. Recherche et insertion

Question 1 Écrire la fonction


val est_présent: 'a option array -> ('a -> int) -> 'a -> bool

telle que est_présent t h e retourne true ou false suivant que l’élément e est
présent dans la table t en utilisant la fonction de hachage h.
Question 2 Écrire la fonction
val insérer: 'a option array -> ('a -> int) -> 'a -> unit

3. Suppression

Question 3 Reprenons l’exemple de table précédent, et supposons que l’on retire


la valeur « pour » donnant la table suivante :
[| Some ”en”; Some ”heureux”; None; None; None; Some ”faut”;
Some ”peu”; Some ”Il”; None; Some ”être” |]

La recherche de la valeur « être » va donner une réponse négative, pourquoi ?


Comment y remédier ? Et que dire de la recherche de « heureux » ?
Question 4 Écrire la fonction
val supprimer: 'a option array -> ('a -> int) -> 'a -> unit

III. Analyse mathématique


Dans la suite, nous noterons 𝑛 le nombre d’éléments présents dans la table de
hachage et 𝑚 la taille de la table de hachage. On suppose que l’on a toujours
𝑛 < 𝑚, autrement dit que la table comporte toujours au moins une case vide.
Notons tout d’abord que la complexité de ces opérations peut être, dans le pire
4

des cas, en 𝑂(𝑛).


Question 5 Donner un exemple d’insertion nécessitant 𝑛 + 1 tests.
Nous allons montrer qu’en moyenne cependant, on peut avoir une complexité
constante. Par en moyenne, nous allons supposer que toutes les 𝑚𝑛 séquences de
hachage sont équiprobables et, lors d’une recherche d’un élément présent, que
tous les éléments recherchés sont équiprobables.

1. Recherche infructueuse

Question 6 Avec les notations précédentes, on a donc supposé que l’on a inséré 𝑛
valeurs dans la table de taille 𝑚 (initialement vide).
1. Combien y-a-t’il de cellules vides dans la table ?
2. En déduire que le nombre de séquences de hachage laissant vide la dernière
case est
𝑘
𝑛𝑘 (1 − )
𝑛

Question 7 Montrer que le nombre de séquences de hachage laissant la case 0


vide, les cases 1 à 𝑘 remplies et la case 𝑘 + 1 vide est

𝑛 𝑘 𝑛−𝑘
𝑔(𝑘, 𝑛, 𝑚) = ( )(𝑘 + 1)𝑘 (1 − )(𝑚 − 𝑘 − 1)𝑛−𝑘 (1 − )
𝑘 𝑘+1 𝑚−𝑘−1

Question 8 Montrer que la probabilité qu’une recherche infructueuse nécessite


de parcourir 𝑘 cellules pleines est :
1 𝑛
𝑝(𝑘, 𝑛, 𝑚) = ∑ 𝑔(𝑖, 𝑛, 𝑚)
𝑚𝑛 𝑖=𝑘

Question 9 Montrer que le nombre moyen de tests nécessaire pour une recherche
infructueuse est : 𝑛
𝐶 ′ (𝑛, 𝑚) = ∑ (𝑘 + 1)𝑝(𝑘, 𝑛, 𝑚)
𝑘=0

On admettra que
1 𝑛 𝑛!
𝐶 ′ (𝑛, 𝑚) = (1 + ∑ (𝑘 + 1) 𝑘 )
2 𝑘=0 𝑚 (𝑛 − 𝑘)!

On définit le facteur de charge 𝛼 = 𝑛/𝑚.


Question 10 Montrer que
5

1 1
𝐶 ′ (𝑛, 𝑚) ≤ (1 + )
2 (1 − 𝛼)2

2. Recherche fructueuse
On note 𝐶 (𝑛, 𝑚) le nombre moyen de tests nécessaires lors d’une recherche
fructueuse dans une table de hachage de taille 𝑚 contenant 𝑛 éléments.

Question 11
1. Justifier que 𝐶 ′ (𝑛 − 1, 𝑚) le nombre moyen de tests nécessaire pour insérer
une 𝑛-ème clé dans une table.
2. En déduire que
1 𝑛−1 ′
𝐶 (𝑛, 𝑚) = ∑ 𝐶 (𝑘, 𝑚)
𝑛 𝑘=0

Question 12 Montrer que

1 1
𝐶 (𝑛, 𝑚) ≤ (1 + )
2 1−𝛼

3. Conclusion
On a montré que la complexité des différentes opérations était majoré par le
facteur de charge, indépendemment de 𝑛 ou de 𝑚. En particulier, si l’on s’assure
que la facteur de charge sera toujours inférieur à une constante définie à l’avance.
On prendra en général comme facteur de charge maximal une valeur comme 0.5
ou 0.6 en s’assurant que la table de hachage a une taille convenable.
∗∗∗
Historiquement, cette étude est très importante. En effet, c’est l’un des premiers
résultats mathématiquement non triviaux d’analyse d’un algorithme. Plus pré-
cisément, c’est le premier résultat trouvé dans les années soixante par un jeune
mathématicien de 24 ans, un certain Donald Knuth. Ce résultat influencera énor-
mément sa carrière, puisqu’il décidera de consacrer sa vie à l’informatique et
plus particulièrement à l’analyse des algorithmes. L’un des conséquences directes
de ce choix sera l’écriture de la somme “The Art of Computer Programming ” qui
lui vaudra le prix Turing (équivalent informaticien du prix Nobel ou de la mé-
daille Fields) ainsi que, lors de la réédition du deuxième volume de The Art of
..., la création du langage TEX qui permet d’écrire facilement et élégamment des
documents scientifiques (même avec plein de formules mathématiques comme
dans le présent sujet de TD).
6

Notons de plus que l’écriture de The Art of ... a débuté dans les années soixante.
Prévu en sept volumes, le quatrième tome est paru en 2010. C’est que, entre le plan
initial prévu et la rédaction, l’étude de l’informatique a véritablement explosé.
Enfin, une phrase circule sur Internet, attribuée tantôt à Bill Gates et tantôt à
Steve Jobs, disant que si quelqu’un a lu, compris et assimilé The Art of Computer
Programming dans son intégralité, il n’a qu’à envoyer un CV, il sera embauché de
suite.

IV. Compléments mathématiques


Théorème - ... binomial d’Abel
Pour tous réels (ou complexes) 𝑥, 𝑦 et 𝑧,
𝑛 𝑛
∑ ( )𝑥(𝑥 − 𝑘𝑧)𝑘−1 (𝑦 + 𝑘𝑧)𝑛−𝑘 = (𝑥 + 𝑦)𝑛
𝑘=0 𝑘

Question 13 Prouver le théorème binomial d’Abel.


Question 14 En posant
𝑛 𝑛
𝑠(𝑛, 𝑥, 𝑦) = ∑ ( )(𝑥 + 𝑘)𝑘+1 (𝑦 − 𝑘)𝑛−𝑘−1 (𝑦 − 𝑛),
𝑘=0 𝑘

montrer que :

∀ 𝑛 ≥ 1, 𝑠(𝑛, 𝑥, 𝑦) = 𝑥(𝑥 + 𝑦)𝑛 + 𝑛𝑠(𝑛 − 1, 𝑥 + 1, 𝑦 − 1).

Question 15 Prouver l’étape admise.

Vous aimerez peut-être aussi