Académique Documents
Professionnel Documents
Culture Documents
Hachage
Hachage
Méthodes d’hachage
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
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)
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
- 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
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.
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
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
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.
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.
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:
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 :
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