88
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 M me AROUSSI 2014-2015 Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/

Chapitre 6 hachage statique

Embed Size (px)

Citation preview

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/

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

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

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

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

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 ?

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

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 ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

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)

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

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

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 ……

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

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é

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é

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é

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

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

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

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

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

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