Vous êtes sur la page 1sur 27

République algérienne démocratique et populaire

Ministère de l’Enseignement Supérieur et de la Recherche


Scientifique

Ecole supérieure en sciences et


technologies de l’informatique et du
numérique

Méthodes d’hachage

Présenté par : Dr. Daoudi Meroua


Année universitaire: 2021/2022
Utilisation des tables d’hachage
1. Utiliser une table de hachage comme un index, en MC, pour accélérer
les accès aux fichiers de données.

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 5
Utilisation des tables d’hachage
2. Utiliser un index en MS, géré par une méthode de hachage.

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 6
Utilisation des tables d’hachage

3. Gérer le fichier de données par une méthode de hachage.

Fichier de données
en MS

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 7
Utilisation des tables d’hachage
Fichier avec hachage

L'adresse primaire de
l'enregistrement de
clé x est le bloc
numéro h(x)

Si le bloc est plein, on


utilise l'une des
méthodes de
résolution de
collisions.

La capacité d'un bloc


est de b
enregistrements

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 4
Méthodes de résolution de collisions

Méthodes de résolution de collisions

- Essai Linéaire
Séquence de tests : les blocs n° h(x) , h(x)-1 , h(x)-2 , … 0 , N-1 , …
<bloc_non_plein>

- Chaînage Externe
Séquence de tests : le bloc n° h(x) et ceux de sa liste de débordement qui se situent
en dehors de la zone adressable par la fonction h

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 8
Essai linéaire

Il doit toujours exister au


moins un bloc non plein

La séquence de tests peut


éventuellement être
circulaire

L’insertion se fait dans le 1er


bloc non plein, trouvé dans
la séquence de tests

La suppression Logique ou
Physique

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 9
Essai linéaire
- Algorithme de Recherche / Essai Linéaire -
Les caractéristiques :
1- N : le nombre de blocs formant le fichier
2- nbIns : le nombre de données insérées
Rech( entrée : x sorties : trouv, i, j )
// on suppose que le fichier F est déjà ouvert
i ← h(x) ; trouv ← faux ; stop ← faux ; N ← Entete( F, 1 )
TQ ( Non trouv && Non stop )
LireDir( F, i, buf )
j ← 1 // Recherche interne dans le bloc i
TQ ( j ≤ buf.NB && Non trouv )
SI ( x = buf.tab[ j ].cle ) trouv ← vrai SINON j ← j+1 FSI
FTQ
SI ( buf.NB < b ) // Si présence d'une case vide (bloc non plein)
stop ← vrai // Alors fin de la séquence de tests
SINON i ← i - 1 ; SI ( i < 0 ) i ← N-1 FSI // Sinon on continue les tests
FSI
FTQ
2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 10
Essai linéaire
- Algorithme d’Insertion / Essai Linéaire -
Les caractéristiques :
1- N : le nombre de blocs formant le fichier
2- nbIns : le nombre de données insérées
Ins( entrée : e )
// on suppose que le fichier F est déjà ouvert
N ← Entete( F, 1 ) ; nbIns ← Entete( F, 2 )
SI ( nbIns = N * b – 1 ) Insertion impossible // pas de place disponible
SINON
Rech( e.clé , trouv , i , j )
SI ( Non trouv )
buf.NB++ // buf contient déjà le contenu
buf.tab[ buf.NB ] ← e // du bloc i (voir Rech)
EcrireDir( F, i, buf )
Aff_Entete( F , 2 , nbIns+1 )
FSI
FSI
2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 11
Chainage externe

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 12
Chainage externe

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 12
Chainage externe
- Algorithme de Recherche / Chaînage Externe -
On suppose que F contient la zone principale (les blocs entre 0 et N-1) et la zone de
débordement (les blocs à partir du numéro N jusqu’à la fin du fichier)
Les caractéristiques :
1- N : le nombre de blocs formant la zone principale
2- M : le nombre total de blocs dans F (zone principale + zone de débordement)
3- nbIns : le nombre de données insérées
Rech( entrée : x sorties : trouv, i, j )
// on suppose que le fichier F est déjà ouvert
i ← h(x) ; trouv ← faux ; stop ← faux ; LireDir( F, i, buf )
TQ ( Non trouv && Non stop )
j ← 1 // Recherche interne dans le bloc i
TQ ( j ≤ buf.NB && Non trouv )
SI ( x = buf.tab[ j ].cle ) trouv ← vrai SINON j++ FSI
FTQ
SI ( Non trouv )
SI ( buf.lien <> -1 ) i ← buf.lien ; LireDir( F, i, buf ) SINON stop ← vrai FSI
FSI
FTQ
2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 13
Chainage externe
- Algorithme d’Insertion / Chaînage Externe -
Ins( entrée : e , nomFich : chaîne )
Ouvrir( F , nomFich , ‘A’ )
Rech( e.clé, trouv, i, j )
SI ( Non trouv )
// s’il y a de la place dans le dernier blocs visité, on y insère e
SI ( buf.NB < b )
buf .NB++ ; buf.tab[ buf.NB ] ← e ; EcrireDir( F, i, buf )
SINON
// si le dernier blocs est déjà plein, on alloue un nouveau bloc en débordement
nouvBloc ← Entete( F , 2 ) + 1
buf.lien ← nouvBloc // chaîner le nouveau bloc avec le précédent (i)
EcrireDir( F, i, buf )
buf .NB ← 1 ; buf.tab[ 1 ] ← e // insérer e dans le nouveau bloc
buf.lien ← -1
EcrireDir( F, nouvBloc, buf )
Aff_Entete( F , 2 , Entete( F , 2 ) + 1 ) // le nombre total de blocs
FSI
Aff_Entete( F , 3 , Entete( F , 3 ) + 1 ) // le nombre d’insertions
FSI Fermer( F ) 2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 14
Hachage dynamique
Fichier avec hachage Dynamique

Les méthodes de hachage que l'on vient de voir sont dites « statiques »,
car si le nombre d'insertion devient important, les performances se
dégradent à cause des nombreuses données en débordement.

Dans les méthodes du hachage dynamique, la fonction de hachage h


change dynamiquement pour s'adapter à la taille du fichier, ce qui permet
de garder de bonnes performances même si le nombre d'insertion (ou de
suppression) augmente.

Le Hachage Linéaire est l'une des méthodes du hachage dynamique


parmi les plus performantes

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 15
Hachage dynamique
Le fichier est formé par une suite de blocs principaux et une zone de débordement
(chaque bloc avec sa liste de débordement est appelé « case »).
Etape i=0:
 Initialement le schéma d’hachage est composé de:
 Un ensemble de blocs N, étiquetés de 0..N-1.
 Une fonction d’hachage qui permet de mapper n’importe quelle clé x dans l’un des
N blocs, par exemple (x)= x mod (dans ce cas i=0)
 Un pointeur n initialisé à 0 vers la case qui sera divisée à chaque génération d’une
zone de débordement

 La division d ’une case:


 Lorque le premier débordement se produit, la case pointé par n (intialament la case
0) est divisée en deux cases, la case d’origine 0 et une nouvelle case N à la fin du
fichier
 Les enregistrements de la case sont redistribués entres les deux case (0 et N) en
utilisant la nouvelle fonction (x)= x mod
 Incrementer n: au fur et à mesure que d’autres enregitrements sont insérés, le
reste des cases de 1 à N-1 est divisé dans l’ordre linéaire et le fichier aura 2*N et à
ce stade, c’est le début du tour 1.
2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 15
Hachage dynamique
D’une manière générale
 Le tour i représente le nombre de fois que le fichier à doublé de taille, il est
incrémenté à chaque fois n attient
 Le pointeur n représente le numéro du bloc qui subira l’opération d’éclatement, il
est initialisé à 0 et incrémenté à chaque éclatement de bloc. Ce paramètre est
réinitialisé à 0 à chaque fois le fichier double de volume
 Deux fonction d’hachage sont utilisées dans le tour i:
(x)= x mod (dans ce cas i=0)
(x)= x mod

 Le nombre de cases augmente et diminue en fonction des insertions et des


suppressions
 Les caractéristiques du fichiers sont le N, i et n.

2020/2021
2ème année CP Pr Hidouci W.K. (http://hidouci.esi.dz) / SFSD / ESI 15
Hachage dynamique
Insertion des valeurs 32, 44, 36, 9, 25, 5, 14, 18, 10, 30, 31, 35, 7 et 11 avec N=4

 Tour i=0
 n=0 n=0
 (x)= x mod

2020/2021
2ème année CP 15
Hachage dynamique
Insertion de 43:

 Tour i=0
n=0
 n=0
 (x)= x mod
 (43)=3 mais le bloc 3 est plein
 Ajouter une page de
débordement

 Diviser bloc 0 pointé par n et


ajouter un nouveau bloc
 Redistribuer les enregistrements n=1
de bloc 0 entre le bloc 0 et 4 en
utilisant la fonction (x)= x mod
 Incrémenter n

2020/2021
2ème année CP 15
Hachage dynamique
Insertion de 37:

 Tour i=0
 n=1
 (x)= x mod
 (37)=1

n=1

2020/2021
2ème année CP 15
Hachage dynamique
Insertion de 29:

 Tour i=0
 n=1
 (x)= x mod
 (29)=3 mais le bloc 1 est plein
 Aucune page de débordement
n'est nécessaire car nous n=2
divisons le même bloc.

 Diviser bloc 1 pointé par n et


ajouter un nouveau bloc 5
 Redistribuer les enregistrements
de bloc 1 entre le bloc 1 et 5 en
utilisant la fonction (x)= x mod
 Incrémenter n

2020/2021
2ème année CP 15
Hachage dynamique
Insertion de 22:

 Tour i=0
 n=2
 (x)= x mod
 (22)=2 mais le bloc 2 est plein
 Aucune page de débordement
n'est nécessaire car nous
n=3
divisons le même bloc.

 Diviser bloc 2 pointé par n et


ajouter un nouveau bloc 6
 Redistribuer les enregistrements
de bloc 2 entre le bloc 2 et 6 en
utilisant la fonction (x)= x mod
 Incrémenter n

2020/2021
2ème année CP 15
Hachage dynamique
Insertion de 66:

 Tour i=0
 n=3
 (x)= x mod
 (66)=2
 Mais 2 < n donc calculer 66)
 66)= x mod 8 = 2, même résultat
n=3
donc insérer 66 dans le bloc 2 ( si
le résultat de h1 est différent donc
insérer l’élément dans le numéro
de bloc retourné par la fonction
h1)

2020/2021
2ème année CP 15
Hachage dynamique
Insertion de 34:

 Tour i=0
 n=3
 (x)= x mod
 (34)=2
 Mais 2 < n donc calculer )
 )= x mod 8 = 2, même résultat
n=3
donc insérer 34 dans le bloc 2

2020/2021
2ème année CP 15
Hachage dynamique
Insertion de 50: n=0

 Tour i=0
 n=3
 (x)= x mod
 (50)=2
 Mais 2 < n donc calculer )
 )= x mod 8 = 2, même résultat donc
insérer 34 dans le bloc 2 mais le bloc 2
est plein
 Ajouter une page de débordement dans
le bloc 2
 Diviser bloc 3 pointé par n et
ajouter un nouveau bloc 7
 Redistribuer les enregistrements Tour i=1
de bloc 3 entre le bloc 3 et 7 en (x)= x mod
utilisant la fonction (x)= x mod (x)= x mod
 Incrémenter n =4 donc incrémenter n=0
i et rénitialiser n
2020/2021
2ème année CP 15
Hachage dynamique
Les enregistrements sont insérés dans un fichier f en utilisant deux fonctions d’hachage et
définies comme suit:

(x)= x mod (dans ce cas i=0)


(x)= x mod

Lors de l’insertion d’un enregistrement de clé x, le numéro de bloc à utiliser est calculer
avec l’algorithme ‘Adr’ suivant :
Adr(x)
a ← hi(x) ;
SI ( a < n )
a ← hi+1(x) ;
FSI
return a ; // a représente le num de bloc où devrait se trouver x
Si le bloc numéro a n’est pas plein, l’enregistrement de clé x est inséré dans a.
Sinon (si le bloc a est déjà plein) l’enregistrement de clé x est inséré séquentiellement en zone
de débordement associé au bloc a.

2020/2021
2ème année CP 15
Hachage dynamique
La recherche :

L’algorithme Adr(x) est aussi utilisé pour rechercher les enregistrements :


Rech(x)
a = Adr(x)
LireDir( F, a , buf )
SI ( x est dans buf )
trouv ← vrai
SINON
// continuer séquentiellement dans la liste de blocs de débordement de a.
i ← buf.lien ; trouv ← faux
TQ ( Non trouv && i <> -1 )
LireDir(F , i, buf )
SI ( x est dans buf ) trouv ← vrai SINON i ← buf.lien FSI
FTQ
FSI

2020/2021
2ème année CP 15
Hachage dynamique
A chaque insertion on vérifie que si un bloc pointé par n doit être éclaté, si oui donc:
1. Rajouter un nouveau bloc à la fin du fichier F (le numéro de ce bloc sera
2. Re-hacher avec la fonction tous les enregistrements du bloc a et éventuellement, ceux de sa
liste de débordement (si elle n’est pas vide). Cela a pour effet de déplacer, un certain nombre
d’enregistrements vers le nouveau bloc ( ). (ceux pour lesquels (enreg.clé) a retourné ( )
3. Incrémenter n
4. SI ( n == )
n ← 0 ; // réinitialiser n à 0
i++ // à chaque incrémentation de i, la taille de F aura doublé
FSI

2020/2021
2ème année CP 15

Vous aimerez peut-être aussi