Vous êtes sur la page 1sur 23

Tables de hachage

Tables de hachage:
Idée et exemples
Fonctions de hachage:
Génération d’adresses : code de hachage + fonction
de compression
Résolution des collisions:
 Chaînage
 Sondage linéaire
 Sondage quadratique
CSI2510
 Hachage double

Idée
Les tables de hachage sont des exemples du TAD MAP

Combine les avantages des tableaux et des listes chaînées

On accède aux données emmagasinées à partir de leurs


clés

Les clés sont emmagasinées, mais ne sont pas triées !

CSI2510

CSI2510 1
Révision - Le TAD Map: méthodes
findElement(k): si il y a un item avec clé k, retourner son
élément, autrement retourner l'élément spécial NO_SUCH_KEY

insertItem(k, o): insérer un item (k, o)

removeElement(k): si il y a un item avec clé k,


enlever-le et retourner son élément, autrement retourner l'élément
spécial NO_SUCH_KEY

size(), isEmpty()
keys(), Elements()

findAllElements(k), removeAllElements(k)
CSI2510

Exemple
Les rapports des étudiants sont
emmagasinés dans un tableau utilisant les 0 ∅
7 chiffres d’identification (ID) des 1 6120001
étudiants comme indices. 2 1010002
3 ∅

Si l’ID est utilisé sans altération, le


4 2290004

tableau doit avoir assez d’espace pour


loger les données des 10,000,000 9997 ∅
étudiants. 9998 7519998
9999 ∅
Alternative: les IDs des étudiants sont
hachés pour produire un entier (entre par
exemple 1 et 10,000) qui servira comme
indice dans le tableau. CSI2510

CSI2510 2
Problème

Puisque un nombre possible de


10,000,000 d’entrées peuvent être
insérées dans un tableau de seulement
10,000 emplacements, comment peut
on garantir que 2 IDs ne soient pas
emmagasinés dans un même endroit?

CSI2510

Principe du hachage

Problème 1 : Génération des adresses


 Construction d’une fonction de hachage h(ki) qui
associe une adresse à une clé:
 Simple à calculer
 Distribue uniformément les éléments dans
le tableau

Problème 2 : Résolution des collisions


 Quelle stratégie à adopter lorsque la fonction
de hachage attribue la même adresse à deux
clés différentes CSI2510

CSI2510 3
L’ idée:
Pour toute clé ki :

h ( ki ) = la position de ki dans le tableau

h ( ki ) = pos avec pos: entier


h ( ki ) ≠ h ( kg ) pour i ≠ g

T
Chercher la clé ki 0
1
2
3
O( 1 ) ! 4
5
6
Insertion M
M

CSI2510

Exemple d’une table de hachage

Hypothèse: 0
toutes les clés ont des premières 1

lettres différentes CAT 2


3
ELEPHANT 4
CAT, ELEPHANT, FOX,
FOX 5
SKUNK, ZEBRA
6
7
8
h (CAT) = 2 M M
M M
h (ELEPHANT) = 4
SKUNK
h (FOX) = 5 M
M
M
M
CSI2510 ZEBRA

CSI2510 4
Exemple d’une table de hachage
Si nous voulons insérer deux clés qui ont la même
première lettre 0
1
CAT 2
3
COLLISION
ELEPHANT 4
FOX 5
6
7
8
M M
M M

SKUNK
M
M
CSI2510
ZEBRA

Exemple d’une table de hachage


Si nous voulons insérer deux clés qui ont la même
première lettre 0
1
CAT 2
3
COLLISION ELEPHANT 4
FOX 5
nous voulons insérer: 6
CRICKET
7
h (CRICKET) = 2 8
M M
position 2 est occupée M M

SKUNK
M
M
CSI2510
ZEBRA

CSI2510 5
Fonction de hachage
Une bonne fonction de hachage doit être facile et rapide
à calculer et doit minimiser le risque de collision
La fonction de hachage est la composition de deux
fonctions:
 Le code de hachage h1 (Hash code map):
h1: clé → entier
 La fonction de compression h2 (Compression map):
h2: entier → [0, Taille du tableau - 1]
On applique le code de hachage puis la fonction de
compression: h(ki)=h2(h1(ki))

CSI2510

Code de hachage

Le code de hachage réinterprète la clé comme un entier

Un bon code de hachage :

 Déterministe: pour une même clé k on a toujours le


même code h1(k)

 Doit fournir une bonne distribution : Le hachage


des éléments similaires est discriminant; les clés
similaires sont distribuées dans des cellules d’indices
éloignés
CSI2510

CSI2510 6
Définition:

facteur de chargement d’uns table de hachage

a = n # de éléments
N # de cellules

CSI2510

Code de hachage - Exemples


Adresse mémoire:
Nous réinterprétons l'adresse mémoire de l'objet clé comme
un entier (le code de hachage par défaut de tous les objets
Java – int 32bits)

Integer cast (ex. byte, short, int, char) :


Nous réinterprétons les bits de la clé comme un entier

Somme des composantes (ex. long, double) :


Nous représentons les bits de la clé dans avec des
composantes de longueurs fixes (par ex., 16 ou 32 bits) et nous
additionnons ces composantes (en négligeant les overflow)

CSI2510

CSI2510 7
Code de hachage - Exemples
• Accumulation polynômiale :
– Nous divisons les bits de la clé en une séquence de composantes
de longueurs fixes (par ex., 8, 16 ou 32 bits)
a0 a1 … an-1

– Nous évaluons le polynôme :


p(z) = a0 + a1 z + a2 z2 + … + an-1zn-1
pour une valeur fixe z (en négligeant les surplus)

– Surtout convenable pour les chaînes de caractères (strings) (par


ex., le choix z = 33 donne au plus 6 collisions par case sur une
série de 50.000 mots anglais)

CSI2510

La fonction de compression
Le nombre des codes de hachage possibles peut
dépasser la taille du tableau

La fonction de compression transforme le résultat


du code de hachage en le compressant dans la zone
désirée

La fonction de compression doit aussi être


déterministe

La fonction de compression doit maximiser la


“distribution” et ainsi minimiser
CSI2510
les collisions

CSI2510 8
La fonction de compression - Exemples

• Division:
– h2 (y) = y mod N
– Le taille N du tableau de hachage est
d'habitude choisie comme un nombre premier

CSI2510

La fonction de compression - Exemples

• Multiplier, ajouter et diviser (MAD):


– h2 (y) = (ay + b) mod N
– a et b sont des nombres entiers non-négatifs tel que
a mod N ≠ 0
– Autrement, h2 (y) = (ay + b) mod N = b

CSI2510

CSI2510 9
Fonction de hachage
exemples …

CSI2510

Génération d’adresse (a) N = la taille de la table

r =  log N 

h1(x): changement de type à entier

a) h2(h1(x)): = sous-ensemble ( de r bits ) de h1(x)

a.1) les r bits les moins significatifs

a.2) les r bits les plus significatifs

a.3) les r bits central

 Simple à calculer
CSI2510
 Ne garantit pas une distribution au hasard

CSI2510 10
Fonction de hachage – Exemple Le
a codage de lettres
A 000001
N = 29

}
B 000010
C 000011
29 r= 9 M
H 001000
M
CHAT-- T 010010
M

- 100000
Mot de 6 caracters (seulement pour cet exemple)

h(0000011001000000001010010100000100000) =
C H A T - -

CSI2510

Exemple a.1:
les r bits les plus significatifs
(r = 9)

h(000011001000000001010010100000100000) =
000011001

Tous les animaux qui commence


avec “CH” hachent a la même place.

CSI2510

CSI2510 11
Exemple a.2:
les r bits les moins significatifs
(r = 9)

h(000011001000000001010010100000100000) =
000100000

Tous les animaux de 4 (ou moins) caractères


hachent a la même place.

CSI2510

Fonction de hachage – Exemple b


h1(x): changement au type entier

b) h2(h1(x)): la somme des sous-ensembles de bits


de h1(x)

 Simple à calculer

 Distribution plus aléatoire que a)

CSI2510

CSI2510 12
Coding of letters
—Exemple — A 000001

}
B 000010
N = 29 C 000011
M
r= 9
29 H 001000
M
T 010010
CHAT-- M

⏐ 100000

h(000011001000000001010010100000100000) =

b)
000011001 plus significatifs
000101001 centraux
000100000 moins significatifs
XOR 000010000 CSI2510

Fonction de hachage – Exemple c

h1(x): changement au type entier

c) h2(h1(x)): sous-ensembles (de r bits) de h1(x)2

 La multiplication est impliquée


 Distribution plus aléatoire que a) et b)

CSI2510

CSI2510 13
Fonction de hachage – Exemple d

d) h2(h1(x)): = h1(x) MOD N

 La division est impliquée


 Distribution complètement aléatoire (surtout si N impair)

CSI2510

Résolution de collision

CSI2510

CSI2510 14
Résolution des collisions

Le facteur de charge d’une table de hachage est la


proportion des cases utilisées dans cette table: α =n/N
n = nb. des cases occupées
N = capacité du tableau

Indicateur des performances de la table de hachage

Deux approches:
 Chaînage
 Adressage ouvert (sondage lineaire, quadratique et
double hachage)

CSI2510

Résolution de collision
Chaînage
1
2 Ex: cricket, cccc
3 CAT CRICKET COYOTE
4 DOG
5 ELEPHANT Idéalement avec une excellente fonction de
6 FOX hachage chaque liste chaînée est de taille n/N
7
8
9 •findElement(k)
10
M •removeElement(k) O(n/N)
M
M •insertItem(k,o)

CSI2510
ZEBRA

CSI2510 15
Résolution des collisions – Adressage ouvert

La collision est résolue en trouvant une place libre dans le tableau


pour y insérer la nouvelle entrée. Cette nouvelle place est obtenue en
‘sondant’ les cases du tableau

On utilise une fonction de sondage s qu’on compose avec la fonction


de hachage h(k) pour trouver le nouveau indice (case) à vérifier;
s(h(k),j) où {j=0..N et s(h(k),0)=h(k)}

Le facteur de charge α dans ce cas est <1; A partir de α=75% on


dit que la table de hachage est saturée et les collisions deviennent
inévitables

CSI2510

Résolution de collision (exemples)


1. Adressage ouvert Sondage linéaire
1
2
3 CAT COYOTE
4 CRICKET  h (COYOTE) = 3 OCCUPÉE
5 ELEPHANT
6 FOX  Nous considérons 4 OCCUPÉE
7  Nous considérons 5 OCCUPÉE
8
 “ 6 OCCUPÉE
9
10  “ 7 LIBRE!
M
M
M

ZEBRA
CSI2510
Les clés sont stockées dans des cellules contigües

CSI2510 16
Résolution de collision (1)
Sondage linéaire

h ( Ki ), h ( Ki ) + 1, h ( Ki ) + 2, h ( Ki ) + 3 ….

h0 ( Ki ) h1 ( Ki ) h 2 ( Ki ) h3 ( K i )

Soit h0 ( ki ) = h ( ki )

s(h(ki),j) = hj(ki) =( h ( ki ) + j ) mod N

CSI2510

Recherche avec un sondage linéaire


Algorithm findElement(k)
• Considérons un tableau A de i ← h(k)
hachage qui utilise le sondage p←0
linéaire repeat
c ← A[i]
• findElement(k)
if c = ∅
– Nous commençons à la cellule return NO_SUCH_KEY
h(k) else if c.key () = k
– Nous sondons les return c.element()
emplacements consécutifs else
jusqu'à ce que: i ← (i + 1) mod N
p←p+1
• Une entrée avec la clé k est
until p = N
trouvée, ou
return NO_SUCH_KEY
• Une cellule vide est trouvée,
ou
• N cellules ont été sondées
CSI2510
sans succès

CSI2510 17
Les mises à jour avec un sondage linéaire
• Pour contrôler les • insert Item(k, o)
insertions et les – Nous lançons une exception
suppressions, nous si la table est pleine
introduisons un objet
– Nous commençons à la cellule
spécial, appelé
h(k)
DISPONIBLE, qui remplace
les éléments enlevés – Nous sondons les cellules
consécutives jusqu'à ce que:
• removeElement(k)
• Une cellule i qui est vide ou
– Nous cherchons un item
emmagasine DISPONIBLE
avec la clé k
est trouvée, ou
– Si un tel élément (k, o)
• N cellules ont été
est trouvé, nous le
infructueusement sondées
remplaçons avec l’objet
spécial DISPONIBLE et – Nous emmagasinons l’item
nous retournons (k, o ) dans la cellule i
l'élément o
– Sinon, nous retournons
NO_SUCH_KEY CSI2510

Performance du Sondage Linéaire

Recherche: Le nombre moyen de sondages….

C(α)

Les résultats expérimentaux pour un tableau de


hachage avec le facteur de chargement α

α=n/N C(α )
0.1 (10%) 1.06
0.5 (50%) 1.50
0.75 (75%) 2.50
0.9 (90%) CSI2510 5.50

CSI2510 18
Problème avec Sondage Linéaire :
REGROUPEMENT PRIMAIRE
(création de cellules contigües)

h (CAT) =3
3 CAT h1 (CAT) =4
4 CRICKET h2 =5
5 ELEPHANT h3 =6
6 FOX
h4 =7
7 CCC
8 h5 =8 !

Ici nous utilisons comme fonction de Idée:


hachage l’entier correspondant à la
première lettre
Utiliser un sondage non linéaire
CSI2510

Résolution de collision (2)


Sondage Quadratique

h(ki), h(ki)+1, h(ki)+4, h(ki)+9, …


{ {
h0(ki) h1(ki)

s(h(ki),j) = hj(ki) =( h ( ki ) + j2) mod N


N: nombre
premier
 mod est dur à calculer

Visite seulement la moitié du tableau


mais…
CSI2510

CSI2510 19
Performance du Sondage Quadratique
Les résultats expérimentaux pour un tableau de
hachage avec le facteur de chargement α

recherche

α = n/N C(α )
0.1 (10%) 1.05
0.5 (50%) 1.44
0.75 (75%) 1.99
0.9 (90%) 2.79
CSI2510

Problème avec Sondage non-linéaire :


REGROUPEMENT SECONDAIRE

Deux clés qui hachent au


même endroit suivent le
même chemin de collision

Idée:
Hachage Double

CSI2510

CSI2510 20
Résolution de collision
Adressage ouvert: (3) Hachage Double
Ex:

h(k ), h(k
2)+h'(k
3 ), h(k1
)+2h'(k
23 ), h(k )+3h'(k ), …
{ i1 i
h
i 1
i23
h
i i i
h0 1 h2 3

hj(ki) = [h(ki) + j•h’(ki)] mod N


OU
Ex:
h(ki), h(ki)+h’(ki), h(ki)+4 h’(ki), h(ki)+9 h’(ki), …

hJ(ki) = [h(ki) + j2•h’(ki)] mod N

 Choix de h(•)
Choix de la fonction de hachage secondaire h’( )
CSI2510

Un exemple de Hachage Double


– N = 13
– h(k) = k mod 13
– h’(k) = 7 - k mod 7
• Insérer les clés 18, 41,
22, 44, 59, 32, 31, 73,
dans cet ordre

0 1 2 3 4 5 6 7 8 9 10 11 12

31 41 18 32 59 73 22 44
CSI2510

CSI2510 21
Autre exemple de Hachage Double

h(ki) = ki mod N
N nombre
h’(ki) = ki div N premier!

CSI2510

Performance de Hachage Double


Les résultats expérimentaux pour un tableau de
hachage avec le facteur de chargement α

recherche

α = n/N C(α )
0.1 (10%) 1.05
0.5 (50%) 1.38
0.75 (75%) 1.83
0.9 (90%) 2.55

CSI2510

CSI2510 22
Chaînage vs Adressage
ouvert

 La méthode de chaînage utilise beaucoup de


mémoire

 Au niveau théorique et expérimental la méthode de


chainage est souvent aussi rapide que les méthodes
d’adressage ouvert

CSI2510

Performance de Hachage:
Résumé
• Dans le pire cas, les
recherches, les insertions et
les suppressions dans une table • Le temps prévu de toutes les
de hachage prennent O(n) opérations du TAD
dictionnaire dans le tableau
• Le pire cas arrive quand toutes est O(1)
les clés insérées dans le
dictionnaire entrent en collision • En pratique, le hachage est
très rapide si le facteur de
• Le facteur de chargement α = chargement n'est pas près
n/N affecte les performances de 100%
d’une table de hachage
• Les applications de tableau
• Supposons que les valeurs de de hachage:
hachage sont comme des
nombres aléatoires, il peut être – Petite base de données
montré que le nombre prévu de – compilateurs
sondages pour une insertion – Cache des navigateurs
avec adressage ouvert est CSI2510 – P2P
1 / (1 - α)

CSI2510 23

Vous aimerez peut-être aussi