Page 1
CHAPITRE VI:
HACHAGE STATIQUE
Université Saad Dahlab de Blida
Faculté des Sciences
Département d’Informatique
Licence d’Informatique
Semestre 4 (2ème année)
Algorithmique et Structures de Données
Mme AROUSSI
2014-2015
Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/
Page 2
Introduction
Principe du hachage
Terminologie
Fonctions de Hachage
Méthodes de résolution de collisions
Estimation des débordements
Conclusion
2
PLAN DU CHAPITRE V
Page 3
3
Problématique: Supposons que l'on veuille ranger
des données (enregistrements) qui arrivent dans un
ordre quelconque dans un tableau.
Solutions Possibles: Il existe, en général, deux façons
de les ranger :
1. Si le tableau est non ordonné alors
Recherche est séquentielle O(n) Lent
Insertion se fait à la fin du tableau O(1) Rapide
INTRODUCTION
Page 4
4
Solutions Possibles: Il existe, en général, deux façons
de les ranger :
1. Si le tableau est non ordonné alors
Recherche est séquentielle O(n) Lent
Insertion se fait à la fin du tableau O(1) Rapide
2. Si le tableau est ordonné alors
Recherche est dichotomique O(Log2(n)) Rapide
Insertion provoque un décalage des éléments du tableau O(n)
Lent
INTRODUCTION
Page 5
5
Une troisième possibilité de ranger une donnée dans un
tableau :
Ranger la donnée « x » à un emplacement « y » calculé par une
fonction « h » tel que y = h(x)
On parle ici de table de rangement dispersé ou technique de
HACHAGE ( en anglais "Hashing" ).
Dans ce type de rangement, que ce soit pour insérer ou
rechercher une donnée, on procédera toujours aussi rapidement (
O(c) )
INTRODUCTION
Page 6
6
PRINCIPE
x2
x4
x8
x6
x5
x1
x3
x7
x3 x8
x5
x2
x1 x7
x4
x6
0
1
2
3
4
5
6
..
N-1
..
..
Table de
Hachage « TH »
h(x)
Données à stocker
Rangement par
calcul d'adresse
La fonction « h » doit
retourner des valeurs
comprises entre 0 et N-1
Le calcul d'adresse permet de stocker des
données (x) dans une table (TH) de
taille N, en utilisant une fonction (h)
x5 ?
Page 7
7
La fonction h est appelé fonction de hachage.
L’adresse primaire (h(x)) d’une donnée x est le résultat
retourné par la fonction de hachage h
Les synonymes sont les données qui ont la même adresse
primaire, i.e. x1 et x2 sont des synonymes ssi h(x1) = h(x2). On
dit aussi que x1 et x2 sont en collisions.
On parle de débordement lorsqu’il y a une donnée qui n’est
pas dans son adresse primaire. On dit aussi qu'elle est rangée
dans une adresse secondaire.
L’adresse secondaire est déterminé par une méthode donnée,
on parle de méthode de résolution de collisions
TERMINOLOGIE
Page 8
8
PRINCIPE
x2
x4
x8
x6
x1
x3
x7
x3 x8
x5
x2
x1 x7
x4
x6
0
1
2
3
4
5
6
..
N-1
..
..
Table de
Hachage « T »
h(x)
Données à stocker
Rangement par
calcul d'adresse
Pour utiliser une technique de hachage, on doit
donc définir:
1. une fonction de hachage « h »
2. une méthode de résolution des collisions
x5 ?
Page 9
9
Il s’agit de trouver une fonction h tels que 0 ≤ h(x) < N qui
réduit au maximum le nombre de collisions.
L'idéal, c'est d'avoir une fonction de hachage bijective c'est à dire
une fonction qui attribue pour chaque donnée à insérer un
nouvel emplacement dans le tableau.
Le pire des cas, c'est lorsque toute donnée est hachée en une
même adresse.
Une solution acceptable est une solution où certaines données
partagent la même adresse (h est surjective).
FONCTIONS DE HACHAGE
Page 10
10
Il existe plusieurs fonctions de hachage, les plus utilisées:
1. La fonction de division
2. La fonction dite du milieu du carré « middle square »
3. La fonction dite du « transformation radix »
FONCTIONS DE HACHAGE
Page 11
11
1. La fonction de division: h(x) = x MOD N
Elle retourne le reste de la division par N où N est la taille de la
table
C’est une fonction facile et rapide à calculer mais sa qualité
dépend de la valeur de N.
Il est démontré que :
c'est très mauvais de choisir N une puissance de 2.
N premier constitue généralement un bon choix.
FONCTIONS DE HACHAGE
Page 12
12
1. La fonction de division: h(x) = x MOD N
Exemple: calculer la fonction de hachage des données
suivantes:
FONCTIONS DE HACHAGE
X N = 10 N = 11
5 5 5
55 5 collision 0
23 3 1
453 3 collision 2
Pas de collisions dans le cas où N=11 car N est un
nombre premier
Page 13
13
2. La fonction du milieu du carré « middle square »
On élève la donnée x au carré x2 et on prend les chiffres du milieu
Cette méthode donne de bons résultats si le nombre au carré n’a
pas de zéros.
Exemple: calculer la fonction de hachage des données suivantes :
FONCTIONS DE HACHAGE
X X2 N = 10 N = 100
500 250000 0 0
12 144 4 14 ou 44
453 205209 5 ou 2 52
Page 14
14
3. La fonction de transformation radix : h(x) = (x)b MOD N
On convertit la donnée « x » dans une base de numération « b » et
on prend le reste de la division sur « N ».
Exemple: calculer la fonction de hachage des données suivantes
dans le cas où b = 11 et N = 10 ou 100 :
FONCTIONS DE HACHAGE
X10 X11 N = 10 N = 100
12 11 1 11
453 382 2 82
Page 15
15
En conclusion, il n’y a pas de fonction de hachage
universelle.
Cependant, une bonne fonction doit être:
rapide à calculer
répartit uniformément les éléments
Elle dépend donc:
de la machine
des éléments
Mais aucune fonction n’évite les collisions, qu’il va falloir
traiter.
FONCTIONS DE HACHAGE
Page 16
16
Exercice 1: Soit E = {a, b, c, d, e, f, g, h} un ensemble
d’enregistrement. On veut insérer ces enregistrements dans une
table de hachage de 10 cases selon leur clé:
1. Calculer l’adresse primaire de chaque enregistrement dans les cas
où la fonction de hachage est une fonction :
a. De division, i.e : h(x) = x MOD N
b. Du milieu du carré, i.e on élève la donnée x au carré x2 et on
prend le chiffre du milieu
c. De transformation radix, i.e : (x)b MOD N et b = 11
FONCTION DE HACHAGE
Enregistrement a b c d e f g h
Clé 5 51 23 453 500 12 38 42
Page 17
17
Exercice 1: Soit E = {a, b, c, d, e, f, g, h} un ensemble
d’enregistrement. On veut insérer ces enregistrements dans une
table de hachage de 10 cases selon leur clé:
1. Calculer l’adresse primaire de chaque enregistrement
FONCTIONS DE HACHAGE
Enregistrement a b c d e f g h
Clé ou x 5 51 23 453 500 12 38 42
x MOD N 5 1 3 3 0 2 8 2
Milieu du
carré
2 6 2 5 0 4 4 7
5 0 2 6
(x)11 MOD N 5 7 1 2 5 1 5 9
Page 18
18
Lors de l'insertion de x, si l'adresse primaire h(x) est déjà
utilisée par une autre donnée, la méthode de résolution
de collision permet de trouver un autre emplacement
(libre) pour x.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 19
19
Pour résoudre les collisions, deux stratégies se
présentent:
a. Les méthodes directes ou le hachage par calcul de
l’emplacement:
1. Essai linéaire
2. Double hachage
b. Les méthodes indirectes ou le hachage par chainage:
3. Chainage séparée
4. Chainage interne
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 20
20
1. Essai linéaire:
S’il se produit une collision sur la case h(x), on essaie les
cases qui la précèdent : h(x)-1, h(x)-2, h(x)-3,..., 0, N-1,
N-2, …, jusqu'à trouver une case vide.
La rencontre d'une case vide indique que la donnée
n'existe pas.
Il faudra sacrifier une case vide dans la table de hachage
pour que la séquence de test soit finie.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 21
21
1. Essai linéaire: Exercice 1 (Question2. a):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
Indice Vide enregistrement
0 V
1 V
2 V
3 V
4 V
5 V
6 V
7 V
8 V
9 V
Etat initial de Table de Hachage
Indice Vide enregistrement
0 V
1 F b
2 V
3 F c
4 V
5 F a
6 V
7 V
8 V
9 V
Après l’insertion
de a, b et c
Page 22
22
1. Essai linéaire: Exercice 1 (Question2. a):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
Indice Vide enregistrement
0 V
1 F b
2 F d
3 F c
4 V
5 F a
6 V
7 V
8 V
9 V
↑ collision
Calcul de h(d) -1 = 2 case vide
Page 23
23
1. Essai linéaire: Exercice 1 (Question2. a):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
Après
l’insertion
de e
Indice Vide enregistrement
0 F e
1 F b
2 F d
3 F c
4 V
5 F a
6 V
7 V
8 V
9 V
↑ collision
Calcul de h(f) - 1 = 1 case pleine
Calcul de h(f) - 2 = 0 case pleine
Calcul de h(f) - 3 + 10 = 9 case vide
Page 24
24
1. Essai linéaire: Exercice 1 (Question2. a):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
Après
l’insertion
de f, g
Indice Vide enregistrement
0 F e
1 F b
2 F d
3 F c
4 V
5 F a
6 V
7 V
8 F g
9 F f
↑ collision
Calcul de h(j) - 1 = 1 case pleine
Calcul de h(j) - 2 = 0 case pleine
Calcul de h(j) - 3 + 10 = 9 case pleine
Calcul de h(j) - 4 + 10 = 8 case pleine
Calcul de h(j) - 5 + 10 = 7 case vide
Page 25
25
1. Essai linéaire: Exercice 1 (Question2. a):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
Après
l’insertion
de j
Indice Vide enregistrement
0 F e
1 F b
2 F d
3 F c
4 V
5 F a
6 V
7 F j
8 F g
9 F f
Page 26
26
1. Essai linéaire:
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide
0 F e
1 F b
2 F d
3 F c
4 V
5 F a
6 V
7 F j
8 F g
9 F f
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
Adresse Primaire P P Secondaire P S P S
La recherche de « k » (tel que h(k) = 2) s'arrête
avec un échec dans la case vide d‘indice 6 la
séquence de test est : 2, 1, 0, 9, 8, 7
Si on devait insérer « k », la donnée serait
affectée à la case 6 (si c'est pas la dernière case
vide).
La table est remplie quand le nombre d’éléments
insérés égale à N-1 sacrifice d’une case vide
Page 27
27
1. Essai linéaire:
La recherche d’une donnée x se déroule comme suit:
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » de table de hachage contient la donné
x alors la recherche est terminée.
c. Sinon rechercher la donnée x dans les cases qui la
précèdent : i-1, i-2, i-3,..., 0, N-1, N-2, …, jusqu'à
trouver la donnée x ou une case vide.
d. Si on s’arrête avec une case vide, cela signifie que la
donnée n’existe pas.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 28
28
1. Essai linéaire: Exercice 2 (Question 1.a)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Type Tcase = Structure
Donnée: TQQ
Vide: booléen initialisé à vrai
Fin
Var TH: Tableau [0 .. N-1] de Tcase
Page 29
29
1. Essai linéaire: Exercice 2 (Question 1. b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure rechercher_TH_EL(TH: tableau de hachage, x: TQQ,
Var i:entier, Var trouve : booléen)
i H(x.clé) // calculer l’adresse primaire
TQ (TH[i].vide = faux) et (TH[i] .donnée≠ x) faire
DTQ
ii-1
Si i<0 alors i i+N
FTQ
Si (TH[i]. Vide = faux) et (TH[i].donnée = x) alors trouve vrai
Sinon trouve faux
Page 30
30
1. Essai linéaire:
L’insertion d’une donnée x se déroule comme suit:
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » de table de hachage est vide alors insérer x
dans cette case et la marquer comme non vide.
c. Sinon, parcourir les cases qui la précèdent : i-1, i-2, i-3,...,
0, N-1, N-2, …, jusqu'à trouver une case vide (soit « j »).
d. Insérer « x » dans la case « j » et la marquer comme non
vide.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 31
31
1. Essai linéaire: Exercice 2 (Question 1. b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure insérer_TH_EL(Var TH: tableau de hachage, x: TQQ)
Debut
Si non TH_rempli (TH) alors // vérifier que le TH n’est pas rempli
i H(x.clé) // calculer l’adresse primaire
TQ (TH[i].vide = faux) faire
DTQ
ii-1
Si i<0 alors i i+N
FTQ
TH[i].donnée x
TH[i].vide faux
Fsi
Fin
Fonction TH_remplie( TH: tableau de hachage) : booléen
Cpt 0
Pour i 0 à N-1 faire
Si TH[i]. vide = vrai alors Cpt ++
Retourner (Cpt =1) // on sacrifie d’une case libre.
Page 32
32
1. Essai linéaire:
La suppression physique d'une donnée
x, génère une case vide
Cette nouvelle case vide risque de
rendre d'autres données inaccessibles.
Par exemple, si on supprime b en
vidant la case 1, on perd du même coup
la donnée f (h(f) = 2) car elle n'est plus
accessible.
On doit alors faire des tests avant de
vider une case
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide
0 F e
1 V b
2 F d
3 F c
4 V
5 F a
6 V
7 F j
8 F g
9 F f
Page 33
33
1. Essai linéaire:
Le principe de la suppression d'une donnée x est donc :
a. Rechercher l'adresse i de x
b. Parcourir toutes les cases qui la précèdent : j = i-1, i-
2, i-3,..., 0, N-1, N-2, …, jusqu’à trouver une case
vide. Pour chaque case j, vérifier que sa donnée reste
accessible si la case i sera vidée.
c. Si toutes les cases j restent accessibles en vidant i,
alors on vide la case i et on s'arrête
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 34
34
1. Essai linéaire:
Le principe de la suppression d'une donnée x est donc :
d. Sinon, déplacer la case j dans la case i et tenter de vider son
emplacement en testant les cases au dessus qui n'ont pas
encore été testées. C'est le même principe qu'on vient
d'appliquer pour la case i.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
i
j
0
N-1
i
j
0
N-1
Page 35
35
1. Essai linéaire:
Par exemple, si on supprime b en vidant la case 1,
On va décaler la donnée f (h(f) = 2) à la case 1 et, la donnée j (h(j)
= 2) à la case 9.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide
0 F e
1 F f
2 F d
3 F c
4 V
5 F a
6 V
7 V
8 F g
9 F j
Indice Vide
0 F e
1 V b
2 F d
3 F c
4 V
5 F a
6 V
7 F j
8 F g
9 F f
Page 36
36
1. Essai linéaire: Exercice 2 (Question 1. b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure supprimer_TH_EL(Var TH: tableau de hachage, x: TQQ)
Rechercher (TH, x, i, trouve)
Si trouve = vrai alors
j i-1
Si j<0 alors jj+N
TQ (T[j]. vide ≠ vrai)
DTQ
// calculer l’adresse primaire de la donnée j
k H(TH[j].donnée.clé)
Si ((i>j) et (k ≥i ou k<j)) ou ((i<j) et (i≤k<j))
TH[i]T[ j];
ij
jj-1
Si j<0 alors jj+N
FTQ
T[i].vide vrai
i
j
0
N-1
i
j
0
Cas 2 Cas 1
N-1
Page 37
37
1. Essai linéaire:
Un moyen simple consiste à faire une
suppression logique, c'est à dire le
positionnement d'un bit pour indiquer si la
donnée a été effacée ou pas.
Chaque case renferme donc 2 bits :
Vide indiquant une case vide
Effacé indiquant un effacement logique
(la case n'est pas vide) exemple: b est
supprimée logiquement
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide Effacé donnée
0 F F e
1 F V b
2 F F d
3 F F c
4 V V
5 F F a
6 V V
7 F F j
8 F F g
9 F F f
Page 38
38
1. Essai linéaire:
Un moyen simple consiste à faire une
suppression logique, c'est à dire le
positionnement d'un bit qu'on rajoute au
niveau des entrées de la table.
Pour récupérer l'espace perdu à cause des
effacements logiques, on effectue des
réorganisations périodiques. C.à.d.
réinsérer les données non effacées dans une
nouvelle table.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide Effacé donnée
0 F F e
1 F V b
2 F F d
3 F F c
4 V V
5 F F a
6 V V
7 F F j
8 F F g
9 F F f
Page 39
39
1. Essai linéaire:
Un moyen simple consiste à faire une
suppression logique, c'est à dire le
positionnement d'un bit qu'on rajoute au
niveau des entrées de la table.
Pour récupérer l'espace perdu à cause des
effacements logiques, on effectue des
réorganisations périodiques. C.à.d.
réinsérer les données non effacées dans une
nouvelle table.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide Effacé donnée
0 F F e
1 F V b
2 F F d
3 F F c
4 V V
5 F F a
6 V V
7 F F j
8 F F g
9 F F f
Page 40
40
1. Essai linéaire: Exercice 2 (Question 2. a)
La recherche doit retourner vrai si (TH[i]. Effacé =
faux) et (TH[i].donné = x) au lieu (TH[i]. Vide = faux)
et (TH[i].donné = x)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Type Tcase = Structure
Donnée: TQQ
Vide: booléen initialisé à vrai
Effacé: booléen initialisé à vrai
Fin
Var TH: Tableau [0 .. N-1] de Tcase
Page 41
41
1. Essai linéaire: Exercice 2 (Question 2. b)
L’insertion peut se faire dans une case effacée
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure insérer_TH_EL(Var TH: tableau de hachage, x: TQQ)
Si non TH_rempli (TH) alors // vérifier que le TH n’est pas rempli
i H(x.clé) // calculer l’adresse primaire
TQ (TH[i].effacé = faux) faire
DTQ
ii-1
Si i<0 alors i i+N
FTQ
TH[i].donnée x
TH[i].vide faux
TH[i].effacéfaux
Page 42
42
1. Essai linéaire: Exercice 2 (Question 2. b)
La suppression consiste à positionner l’indicateur «
effacé » à vrai
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure supprimer_TH_EL(Var TH: tableau de hachage, x: TQQ)
Debut
Rechercher_TH_EL (TH, x, i, trouve)
Si trouve = vrai alors T[i].effacé vrai
Fin
Page 43
43
1. Essai linéaire: Exercice 2 (Question 2. b)
La réorganisation consiste à réinsérer les données non
effacées dans une nouvelle table.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure réorganiser _TH(Var TH: Tableau de hachage)
Var Tmp: Tableau de Hachage; i: entier
Debut
Pour i0 à N-1 faire
Si (TH[i].effacé = faux) alors
Insérer_TH (Tmp, TH[i].donné)
//recopier le tableau Tmp dans TH
Pour i0 à N-1 faire
THi] Tmp[ [i]
Fin
Page 44
44
2. Double Hachage :
Cette méthode est presque analogue à la méthode d’essai
linéaire mais au lieu que la séquence soit linéaire, elle est
construite par une autre fonction de hachage soit h’.
Soient h(x) la fonction utilisée pour le calcul de l'adresse
primaire et h'(x) la seconde fonction de hachage qui calcule
le pas de la séquence: h(x), h(x)-h'(x), h(x)-2h'(x), h(x)-
3h'(x), ...
Pour que cette séquence soit circulaire, on rajoute N au
nouvel indice s’il est négatif.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 45
45
2. Double Hachage : Exercice 1 (Question2):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
h‘(x) 2 4 1 3 3 1 5 2
Indice Vide donné
0 V
1 V
2 V
3 V
4 V
5 V
6 V
7 V
8 V
9 V
Après l’insertion
de a, b et c
Indice Vide donné
0 V
1 F b
2 V
3 F c
4 V
5 F a
6 V
7 V
8 V
9 V
Page 46
46
2. Double Hachage : Exercice 1 (Question2):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
h‘(x) 2 4 1 3 3 1 5 2
Indice Vide donné
0 V
1 F b
2 V
3 F c
4 V
5 F a
6 V
7 V
8 V
9 V
↑ collision
Calcul de h(d) -h’(d) = 0 case vide
Page 47
47
2. Double Hachage : Exercice 1 (Question2):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
h‘(x) 2 4 1 3 3 1 5 2
Indice Vide donné
0 F d
1 F b
2 V
3 F c
4 V
5 F a
6 V
7 V
8 V
9 V
↑ collision
Calcul de h(e) -h’(e) + 10 = 7 case vide
Page 48
48
2. Double Hachage : Exercice 1 (Question2):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
h‘(x) 2 4 1 3 3 1 5 2
Indice Vide donné
0 F d
1 F b
2 V
3 F c
4 V
5 F a
6 V
7 F e
8 V
9 V
Après l’insertion
de f et g
Indice Vide donné
0 F d
1 F b
2 V f
3 F c
4 V
5 F a
6 V
7 F e
8 V g
9 V
Page 49
49
2. Double Hachage : Exercice 1 (Question2):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
h‘(x) 2 4 1 3 3 1 5 2
Indice Vide donné
0 F d
1 F b
2 V f
3 F c
4 V
5 F a
6 V
7 F e
8 V g
9 V
↑ collision
Calcul de h(j) – h’(j) = 0 case pleine
Calcul de h(j) - 2 h’(j) + 10= 8 case pleine
Calcul de h(j) - 3 h’(j) + 10 = 6 case vide
Page 50
50
2. Double Hachage : Exercice 1 (Question2):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
h‘(x) 2 4 1 3 3 1 5 2
Indice Vide donné
0 F d
1 F b
2 V f
3 F c
4 V
5 F a
6 F j
7 F e
8 V g
9 V
La recherche de « k » (tel que h(k) = 2 et h’(k) = 2)
s'arrête avec un échec dans la case vide d‘indice 4
la séquence de test est : 2, 0, 8, 6
Si on devait insérer « k », la donnée serait
affectée à la case 4 (si c'est pas la dernière case
vide).
La table est remplie quand le nombre d’éléments
insérés égale à N-1 sacrifice d’une case vide
Page 51
51
2. Double Hachage : Exercice 1 (Question2):
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Enregistrement a b c d e f g j
h (x) 5 1 3 3 0 2 8 2
h‘(x) 2 4 1 3 3 1 5 2
Indice Vide donné
0 F d
1 F b
2 V f
3 F c
4 V
5 F a
6 F j
7 F e
8 V g
9 V
La recherche de « k » (tel que h(k) = 2 et h’(k) = 5)
génère une boucle infinie la séquence de test est :
2, 7, 2, 7, 2, 7, 2, 7, ….. On s’arrête après avoir
visité (N-1) cases.
Pour que la couverture soit totale (passer par
toutes les cases), il faut choisir la taille de la table
N un nombre premier
Page 52
52
2. Double Hachage :
Le principe de la recherche est analogue à celui
de l'essai linéaire.
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » de table de hachage contient la donné x alors la
recherche est terminée.
c. Sinon rechercher la donnée x dans les cases qui la précèdent : j=
i-h'(x), i-2h'(x), i-3h'(x),…. [si j<0 alors j j+N] jusqu'à trouver
la donnée x ou une case vide ou visiter N-1 cases.
d. Si on s’arrête avec une case vide ou après avoir visité N-1 cases,
cela signifie que la donnée n’existe pas.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 53
53
2. Double Hachage : Exercice 2 (Question 2. a)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure rechercher_TH_DH(TH: tableau de hachage, x: TQQ,
Var i:entier, Var trouve : booléen)
i h(x.clé) // calculer l’adresse primaire
Cpt 0 // compter le nombre des cases visitées
TQ (TH[i].vide = faux) et (TH[i] . donnée≠ x) et (Cpt < N-1) faire
DTQ
ii-h’(x)
Si i<0 alors i i+N
Cpt ++;
FTQ
Si (TH[i]. Vide = faux) et (TH[i].donné = x) alors trouve vrai
Sinon trouve faux
Page 54
54
2. Double Hachage :
L’insertion d’une donnée x se déroule comme suit:
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » de table de hachage est vide alors insérer x
dans cette case et la marquer comme non vide.
c. Sinon, parcourir les cases qui la précèdent : j= i-h'(x), i-
2h'(x), i-3h'(x),…. [si j<0 alors j j+N], jusqu'à trouver
une case vide (soit « j ») ou visiter N-1 cases.
d. Si on trouve une case vide alors insérer « x » dans la case «
j » et la marquer comme non vide.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 55
55
2. Double Hachage : Exercice 2 (Question 2. a)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure insérer_TH_DH(Var TH: tableau de hachage, x: TQQ)
Debut
Si non TH_rempli (TH) alors // vérifier que le TH n’est pas rempli
i h(x.clé) // calculer l’adresse primaire
Cpt 0 // compter le nombre des cases visitées
TQ (TH[i].vide = faux) et (Cpt < N-1) faire
DTQ
ii-h’(x.clé)
Si i<0 alors i i+N
Cpt ++;
FTQ
Si (TH[i].vide = vrai) alors // on a trouvé une case vide
TH[i].donnée x
TH[i].vide faux
Fin
Page 56
56
2. Double Hachage :
Le principe de la suppression (logique et physique) est
analogue à la méthode d’essai de linéaire.
La seule différence que dans la suppression physique, le
pas de la séquence est calculé par la seconde fonction de
hachage: j= i-h'(x), i-2h'(x), i-3h'(x),…. [si j<0 alors j j+N].
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 57
57
2. Double Hachage :
Exemple d’une suppression physique: supprimer la donnée « c »
Cette suppression entraine le déplacement de la donnée « d » à la case
3 et la donnée « e » à la case 0
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide donné
0 F d
1 F b
2 V f
3 F c
4 V
5 F a
6 F j
7 F e
8 V g
9 V
Indice Vide donné
0 F e
1 F b
2 V f
3 F d
4 V
5 F a
6 F j
7 V
8 V g
9 V
Page 58
58
2. Double Hachage : Exercice 2 (Question 2. a)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure supprimer_TH_DH(Var TH: tableau de hachage, x: TQQ)
Rechercher (TH, x, i, trouve)
Si trouve = vrai alors
j i-h’(x.donnée.clé)
Si j<0 alors jj+N
TQ (T[j]. vide ≠ vrai)
DTQ
// calculer l’adresse primaire de la donnée j
k H(TH[j].donnée.clé)
Si ((i>j) et (k ≥i ou k<j)) ou ((i<j) et (i≤k<j))
TH[i]T[ j];
ij
jj-h’(x.donnée.clé)
Si j<0 alors jj+N
FTQ
T[i].vide vrai
i
j
0
N-1
i
j
0
Cas 2 Cas 1
N-1
Page 59
59
3. Chaînage séparé :
Les données en débordement (en cas de collisions) sont stockés dans
un espace non «adressable» par la fonction de hachage. Par
exemple à l'extérieur de la table sous forme de Liste Linéaire
Chaînée (LLC).
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide donné lien
0 F e Null
1 F b Null
2 F f
3 F c
4 V Null
5 F a Null
6 V Null
7 V Null
8 F g Null
9 V Null
d Null
j k Null
h(f) = h(j) = h(k) = 2
h(c) = h(d) = 3
Le champ « lien » lie les
données en cases primaires
avec leurs synonymes en
débordement.
Le nombre de données
insérées peut dépasser la
taille de la table (N)
Page 60
60
3. Chaînage séparé :
La recherche d’une donnée x se déroule comme suit:
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » de table de hachage contient la donné
x alors la recherche est terminée.
c. Sinon continuer la recherche séquentielle dans la
liste « lien »
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 61
61
3. Chaînage séparé : Exercice 2 (Question 1.a)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Type Maillon = Structure
Val: TQQ
Suiv: * Maillon initialisé à NULL
Fin
Type Tcase = Structure
Donnée: TQQ
Lien : *Maillon
Vide: booléen initialisé à vrai
Fin
Var TH: Tableau [0 .. N-1] de Tcase
Page 62
62
3. Chaînage séparé : Exercice 2 (Question 1.b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure rechercher_TH_CS(TH: tableau de hachage, x: TQQ):
booléen
i H(x.clé) // calculer l’adresse primaire
Si TH[i].vide = faux alors
Si TH[i].donnée = x alors
retourner (vrai)
Sinon
Retourner (Rechercher_LLC(TH[i].lien, x))
Sinon
retourner (faux)
Page 63
63
3. Chaînage séparé :
L’insertion d’une donnée x se déroule comme suit:
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » est vide alors insérer la donné dans
cette case.
c. Sinon insertion (au début) dans la liste associée à
cette case
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 64
64
3. Chaînage séparé : Exercice 2 (Question 1.b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure insérer_TH_CS(Var TH: tableau de hachage, x: TQQ)
i H(x.clé) // calculer l’adresse primaire
Si TH[i].vide = vrai alors
TH[i].donnée x
TH[i].Vide faux
Sinon // insertion au debut de la liste
Insérer_Debut_LLC(TH[i].Lien, x)
FSI
Page 65
65
3. Chaînage séparé :
La suppression d’une donnée x se déroule comme suit:
a. Rechercher la donné x dans la table de hachage
b. Si x se trouve dans son adresse primaire (la donnée de la
case h(x)) alors
i. Si la liste « lien » n'est pas vide alors déplacer le
premier élément de la liste dans la case h(x) (en
écrasant x)
ii. Sinon vider la case h(x)
c. Sinon (x se trouve en débordement dans une liste) alors la
supprimer de cette liste
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 66
66
3. Chaînage séparé : Exercice 2 (Question 1.b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure supprimer _TH_CS(Var TH: tableau de hachage, x: TQQ)
Trouve Rechercher_TH_CS (TH, x);
ih(x.clé)
Si (trouve = vrai) alors
Si TH[i].donné= x alors
Si TH[i].Lien = Null alors
TH[i].Vide vrai
Sinon
PTH[i].Lien
TH[i].donnée Valeur(P)
TH[i].Lien suivant (P)
Libérer (P)
Sinon // supprimer x de la liste
Supprimer_LLC(TH[i].Lien, x)
FSI
Page 67
67
4. Chaînage interne :
Les données en débordement (en cas de collisions) sont stockés dans
la table (dans le même espace « adressable » par la fonction) en
gardant le chaînage entre les synonymes
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide donné lien
0 F e -1
1 F b -1
2 F f 6
3 F c 4
4 F d -1
5 F a -1
6 V j 7
7 V k -1
8 F g -1
9 V -1
Le champ « lien » lie les données en cases
primaires avec leurs synonymes en
débordement.
La table est remplie quand le nombre
d’éléments insérés égale à N-1 sacrifice
d’une case vide
Page 68
68
4. Chaînage interne :
Comme dans le chaînage séparée, la recherche d’une
donnée x se déroule comme suit:
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » de table de hachage contient la donné
x alors la recherche est terminée.
c. Sinon continuer la recherche séquentielle dans la
liste « lien »
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 69
69
4. Chaînage interne :
Comme dans le chaînage séparée, la recherche d’une
donnée x se déroule comme suit:
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » de table de hachage contient la donné
x alors la recherche est terminée.
c. Sinon continuer la recherche séquentielle dans la
liste « lien »
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 70
70
4. Chaînage interne :
L’insertion d’une donnée x se déroule comme suit:
a. Calculer l’adresse primaire de x (soit i = h(x))
b. Si la case « i » est vide alors insérer la donné dans
cette case.
c. Sinon trouver une case vide, insérer la donnée dans
cette case ensuite la chaine à la queue de liste de « i
».
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 71
71
4. Chaînage interne :
La suppression d’une donnée x se déroule comme suit:
a. Rechercher l’adresse i de la donné, ainsi que son
prédécesseur k dans la liste.
b. Rechercher le successeur de i (soit j) où h(j) = i [son
adresse primaire égale à i]
c. Si un tel successeur existe alors on le déplace vers i et on
tente de vider son emplacement (ij)
d. Sinon (il n'y a pas de problèmes avec les successeurs), on
vide la case i en mettant à jour son prédécesseur j pour
qu’il pointe le successeur immédiat de i
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 72
72
4. Chaînage interne :
Les difficultés rencontrés dans cette méthode peuvent se
résumer en deux points:
Insertion: rechercher la queue de la liste « i »
Suppression: garder le prédécesseur de « i » qui
n’existe pas toujours (la première case n’a pas de
prédécesseur)
La solution est d’utiliser une liste circulaire où la
première case pointe la dernière case.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 73
73
4. Chaînage interne :
Si le champs « lien » égale à -1 cela indique que la liste est vide.
Sinon il indique l’indice de la case suivante
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Indice Vide donné lien
0 F e -1
1 F b -1
2 F f 6
3 F c 4
4 F d 3
5 F a -1
6 V j 7
7 V k 2
8 F g -1
9 V -1
Indice Vide donné lien
0 F e -1
1 F b -1
2 F f 6
3 F c 4
4 F d -1
5 F a -1
6 V j 7
7 V k -1
8 F g -1
9 V -1
Page 74
74
4. Chaînage interne : Exercice 2 (Question 1.a)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Type Tcase = Structure
Donnée: TQQ
Lien : entier initialisé à -1
Vide: booléen initialisé à vrai
Fin
Var TH: Tableau [0 .. N-1] de Tcase
Page 75
75
4. Chaînage interne : Exercice 2 (Question 1.b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure rechercher_TH_CI(TH: tableau de hachage, x: TQQ):
booléen
i H(x.clé) // calculer l’adresse primaire
Si TH[i].vide = faux alors
Si TH[i].donnée = x alors
retourner (vrai)
Sinon
jTH[i].lien
TQ (j≠ -1) et (j ≠ i ) faire
Si TH[j].donnée = x alors retourner (vrai)
Sinon j TH[i].lien
Sinon
retourner (faux)
Page 76
76
3. Chaînage séparé : Exercice 2 (Question 1.b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure insérer_TH_CS(Var TH: tableau de hachage, x: TQQ)
i H(x.clé) // calculer l’adresse primaire
Si TH[i].vide = vrai alors
TH[i].donnée x
TH[i].Vide faux
Sinon // insertion au debut de la liste
k trouver_case_vide(TH)
Si (k ≠ -1) alors
TH[k].donnée x
TH[k].Vide faux
Si TH[i].lien = -1 alors
TH[k].lien i ;
Sinon
TH[k].lien TH[i].lien;
TH[i].lien k
FSI
Page 77
77
4. Chaînage interne :
La suppression d’une donnée x se déroule comme suit:
a. Rechercher l’adresse i de la donné, ainsi que son
prédécesseur k dans la liste.
b. Rechercher le successeur de i (soit j) où h(j) = i [son
adresse primaire égale à i]
c. Si un tel successeur existe alors on le déplace vers i et on
tente de vider son emplacement (ij)
d. Sinon (il n'y a pas de problèmes avec les successeurs), on
vide la case i en mettant à jour son prédécesseur j pour
qu’il pointe le successeur immédiat de i
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Page 78
78
4. Chaînage interne : Exercice 2 (Question 1.b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Procédure supprimer _TH_CS(Var TH: tableau de hachage, x: TQQ)
Trouve Rechercher_TH_CS (TH, x);
ih(x.clé)
Si (trouve = vrai) alors
Si TH[i].Lien = -1 alors // cela implique TH[i].donné= x
TH[i].Vide vrai
Sinon // rechercher le prédécesseur k et le premier successeur j tel que h(j) = i
Répéter
lTH[i].Lien
existe faux
TQ (l≠ i) faire
Si ((h(TH[l].donné.clé) = i) et (non existe) alors
jl; existe vrai
k l; l TH[l].lien
FTQ
Si existe alors
TH [i] TH[j]; ij
Sinon ……
Page 79
79
4. Chaînage interne : Exercice 2 (Question 1.b)
MÉTHODES DE RÉSOLUTION DE COLLISIONS
Sinon // rechercher le prédécesseur k et le premier successeur j tel que h(j) = i
Répéter
lTH[i].Lien
existe faux
TQ (l≠ i) faire
Si ((h(TH[l].donné.clé) = i) et (non existe) alors
jl; existe vrai
k l; l TH[l].lien
FTQ
Si existe alors
TH [i] TH[j]; ij
Sinon
TH[i].vide vrai
Si TH[i].lien = k alors TH[k].lien -1
Sinon TH[k].lien TH[i].lien
Jusqu’à non existe
FSI
Page 80
80
La figure suivante résume les courbes des nombres moyens de tests
pour une recherche par rapport au chargement de la table (M/N, M
étant le nombre des éléments présents dans la table) pour les
quatre méthodes présentées.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
L : essai linéaire
D : double hachage
C : chaînage interne
S : chaînage séparé
Page 81
81
Comme la figure le montre, les méthodes de chaînage semblent les
meilleures. Cependant, leur inconvénient réside dans le champ
additionnel représentant les liens.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
L : essai linéaire
D : double hachage
C : chaînage interne
S : chaînage séparé
Page 82
82
Pour l'essai linéaire par exemple, même quand la table est remplie
à 90%, le nombre de tests est au voisinage de 5.
Pour avoir un temps rapide (de l'ordre de 1), on convient de ne pas
dépasser un chargement de 70%.
MÉTHODES DE RÉSOLUTION DE COLLISIONS
L : essai linéaire
D : double hachage
C : chaînage interne
S : chaînage séparé
Page 83
83
Soit une table de N cases, et on aimerait insérer r
données. Le pourcentage de remplissage (la densité) est
donc: d = r / N
Soit P(x) la probabilité que x données parmi r soient «
hachées » vers la même case
La fonction de Poisson en est une bonne approximation,
en supposant une fonction de hachage uniforme
ESTIMATION DES DÉBORDEMENTS
Page 84
84
La fonction de Poisson en est une bonne approximation,
en supposant une fonction de hachage uniforme
N*P(x) est donc une estimation du nombre de cases
ayant été choisies x fois durant l'insertion des r données
dans la table
Le nombre total de données en débordement est alors
estimé à :
ESTIMATION DES DÉBORDEMENTS
Page 85
85
Exemple numérique:
Lors de l'insertion de 1000 données dans une table de
1000 cases (densité = 1), on estime que :
N.P(0) = 368 cases ne recevront aucune données
N.P(1) = 368 cases auront été choisies 1 seule fois
N.P(2) = 184 cases auront été choisies 2 fois
N.P(3) = 61 cases auront été choisies 3 fois
N.P(4) = 15 cases auront été choisies 4 fois
N.P(5) = 3 cases auront été choisies 5 fois
N.P(6) = 0 cases auront été choisies 6 fois
ESTIMATION DES DÉBORDEMENTS
Page 86
86
Exemple numérique:
Le nombre de données en débordement est proche de :
184 + 2*61 + 3*15 + 4*3 = 363 soit 36% des données
contre 631 (368 + 184 + 61 + 15 + 3) données dans leurs
adresses primaires
Pour une densité = 0.5, (ex r = 500 et N = 1000), on
aurait eu 21% de données en débordement et 79% de
données rangées dans leur adresse primaire.
ESTIMATION DES DÉBORDEMENTS
Page 87
87
Les méthodes de hachage donnent des résultats excellents en
moyenne O(1), mais lamentables dans le pire cas O(n), car il
n'est pas possible d'éviter les collisions.
En particulier, le choix de la fonction de hachage est
fondamental.
Il existe plusieurs façons de réduire les collisions :
trouver une fonction de hachage qui distribue bien les données
c'est a dire de façon aléatoire.
augmenter l'espace des adresses possibles.
mettre plus d'une donnée par adresse possible (si on accepte
par exemple b données par adresse donc d = r/(b*N).
CONCLUSION
Page 88
SOURCES DE CE COURS
N. EL-ALLIA , Cours d’Algorithmique et Structures de données dynamiques, Ecole
nationale Supérieure d’Informatique (ESI), 2014.
Djamel Eddine ZEGOUR, Cours de Structures de Données, Ecole nationale
Supérieure d’Informatique (ESI), Disponible sur
http://zegour.esi.dz/Cours/Cours_sdd.htm
W. K. Hidouci, Cours Structures De Données et Fichiers, École nationale Supérieure
d’Informatique, Disponible sur hidouci.esi.dz/algo/
88