idée - engineeringflocchin/csi2510/csi2510hash.pdf · pour une valeur fixe z (en négligeant les...
Post on 25-Sep-2020
9 Views
Preview:
TRANSCRIPT
CSI2510 1
CSI2510
Tables de hachage Tables de hachage:
Idée et exemples
Fonctions de hachage:
Génération d’adresses : code de hachage + fonctionde compression
Résolution des collisions:
Chaînage
Sondage linéaire
Sondage quadratique
Hachage double
CSI2510
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 leursclés
Les clés sont emmagasinées, mais ne sont pas triées !
CSI2510 2
CSI2510
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émentspécial NO_SUCH_KEY
size(), isEmpty()keys(), Elements()
findAllElements(k), removeAllElements(k)
Révision - Le TAD Map: méthodes
CSI2510
Exemple
∅
∅
∅
∅
01234
999799989999
…
2290004
1010002
7519998
6120001
Les rapports des étudiants sontemmagasinés dans un tableau utilisant les7 chiffres d’identification (ID) desétudiants comme indices.
Si l’ID est utilisé sans altération, letableau doit avoir assez d’espace pourloger les données des 10,000,000étudiants.
Alternative: les IDs des étudiants sonthachés pour produire un entier (entre parexemple 1 et 10,000) qui servira commeindice dans le tableau.
CSI2510 3
CSI2510
Problème
Puisque un nombre possible de10,000,000 d’entrées peuvent êtreinsérées dans un tableau de seulement10,000 emplacements, comment peuton garantir que 2 IDs ne soient pasemmagasinés dans un même endroit?
CSI2510
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 à deuxclés différentes
Principe du hachage
CSI2510 4
CSI2510
T0123456M
M
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
Chercher la clé ki
O( 1 ) !
Insertion
CSI2510
Hypothèse:toutes les clés ont des premières lettres différentes
CAT, ELEPHANT, FOX, SKUNK, ZEBRA
h (CAT) = 2h (ELEPHANT) = 4h (FOX) = 5
M
M
8
7
6
M
M
5
4
3
2
1
0
ZEBRA
M
M
SKUNK
M
M
FOX
ELEPHANT
CAT
Exemple d’une table de hachage
CSI2510 5
CSI2510
Si nous voulons insérer deux clés qui ont la mêmepremière lettre
COLLISION
8
7
6
M
M
5
4
3
2
1
0
ZEBRA
M
M
SKUNK
M
M
FOX
ELEPHANT
CAT
Exemple d’une table de hachage
CSI2510
nous voulons insérer:CRICKET
h (CRICKET) = 2
position 2 est occupée
Si nous voulons insérer deux clés qui ont la mêmepremière lettre
COLLISION
8
7
6
M
M
5
4
3
2
1
0
ZEBRA
M
M
SKUNK
M
M
FOX
ELEPHANT
CAT
Exemple d’une table de hachage
CSI2510 6
CSI2510
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 deuxfonctions: 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
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 lemême code h1(k)
Doit fournir une bonne distribution : Le hachagedes éléments similaires est discriminant; les cléssimilaires sont distribuées dans des cellules d’indiceséloignés
Code de hachage
CSI2510 7
CSI2510
Définition:
# de éléments# de cellules
= n N
a
facteur de chargement d’uns table de hachage
CSI2510
Adresse mémoire:Nous réinterprétons l'adresse mémoire de l'objet clé commeun entier (le code de hachage par défaut de tous les objetsJava – 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 descomposantes de longueurs fixes (par ex., 16 ou 32 bits) et nousadditionnons ces composantes (en négligeant les overflow)
Code de hachage - Exemples
CSI2510 8
CSI2510
• 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) (parex., le choix z = 33 donne au plus 6 collisions par case sur unesérie de 50.000 mots anglais)
Code de hachage - Exemples
CSI2510
La fonction de compression
Le nombre des codes de hachage possibles peutdépasser la taille du tableau
La fonction de compression transforme le résultatdu code de hachage en le compressant dans la zonedésirée
La fonction de compression doit aussi êtredéterministe
La fonction de compression doit maximiser la“distribution” et ainsi minimiser les collisions
CSI2510 9
CSI2510
• Division:– h2 (y) = y mod N– Le taille N du tableau de hachage est
d'habitude choisie comme un nombre premier
La fonction de compression - Exemples
CSI2510
• 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
La fonction de compression - Exemples
CSI2510 10
CSI2510
Fonction de hachage exemples …
CSI2510
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
Ne garantit pas une distribution au hasard
N = la taille de la table
r = log N
Génération d’adresse (a)
h1(x): changement de type à entier
CSI2510 11
CSI2510
Le codage de lettres
100000
M010010T
M001000H
M000011C000010B000001A
} 29
h(0000011001000000001010010100000100000) =
N = 29
r = 9
CHAT--
Mot de 6 caracters (seulement pour cet exemple)-
C H A T - -
Fonction de hachage – Exemple a
CSI2510
h(000011001000000001010010100000100000) =000011001
Tous les animaux qui commence avec “CH” hachent a la même place.
Exemple a.1:les r bits les plus significatifs
(r = 9)
CSI2510 12
CSI2510
Tous les animaux de 4 (ou moins) caractères hachent a la même place.
Exemple a.2:les r bits les moins significatifs
(r = 9)
h(000011001000000001010010100000100000) = 000100000
CSI2510
b) h2(h1(x)): la somme des sous-ensembles de bitsde h1(x)
Simple à calculer
Distribution plus aléatoire que a)
h1(x): changement au type entier
Fonction de hachage – Exemple b
CSI2510 13
CSI2510
—Exemple —
b)000011001 plus significatifs000101001 centraux000100000 moins significatifs
XOR 000010000
Coding of letters
100000⏐
M010010T
M001000H
M000011C000010B000001A
} 29
h(000011001000000001010010100000100000) =
N = 29
r = 9
CHAT--
CSI2510
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)
h1(x): changement au type entier
Fonction de hachage – Exemple c
CSI2510 14
CSI2510
d) h2(h1(x)): = h1(x) MOD N
La division est impliquée Distribution complètement aléatoire (surtout si N impair)
Fonction de hachage – Exemple d
CSI2510
Résolution de collision
CSI2510 15
CSI2510
Le facteur de charge d’une table de hachage est laproportion des cases utilisées dans cette table: α =n/Nn = nb. des cases occupéesN = capacité du tableau
Indicateur des performances de la table de hachage
Deux approches: Chaînage Adressage ouvert (sondage lineaire, quadratique etdouble hachage)
Résolution des collisions
CSI2510
Résolution de collisionChaînage
Ex: cricket, ccccCRICKET COYOTE
ZEBRA
M
M
M
10987
FOX6ELEPHANT5
DOG4CAT3
21
•findElement(k)
•removeElement(k)
•insertItem(k,o)
Idéalement avec une excellente fonction dehachage chaque liste chaînée est de taille n/N
O(n/N)
CSI2510 16
CSI2510
Résolution des collisions – Adressage ouvert
La collision est résolue en trouvant une place libre dans le tableaupour 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 fonctionde 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% ondit que la table de hachage est saturée et les collisions deviennentinévitables
CSI2510
COYOTE h (COYOTE) = 3 OCCUPÉE Nous considérons 4 OCCUPÉE Nous considérons 5 OCCUPÉE “ 6 OCCUPÉE “ 7 LIBRE!
Résolution de collision (exemples)1. Adressage ouvert
ZEBRA
M
M
M
10987
FOX6ELEPHANT5CRICKET4
CAT321
Sondage linéaire
Les clés sont stockées dans des cellules contigües
CSI2510 17
CSI2510
Résolution de collision (1)Sondage linéaire
h ( Ki ), h ( Ki ) + 1, h ( Ki ) + 2, h ( Ki ) + 3 ….
h0 ( Ki ) h1 ( Ki ) h2 ( Ki ) h3 ( Ki )
Soit h0 ( ki ) = h ( ki )
s(h(ki),j) = hj(ki) =( h ( ki ) + j ) mod N
CSI2510
Recherche avec un sondage linéaire
• Considérons un tableau A dehachage qui utilise le sondagelinéaire
• findElement(k)– Nous commençons à la cellule
h(k)– Nous sondons les
emplacements consécutifsjusqu'à ce que:• Une entrée avec la clé k esttrouvée, ou• Une cellule vide est trouvée,ou•N cellules ont été sondéessans succès
Algorithm findElement(k)i ← h(k)p ← 0repeat
c ← A[i]if c = ∅
return NO_SUCH_KEY else if c.key () = k
return c.element()else
i ← (i + 1) mod Np ← p + 1
until p = Nreturn NO_SUCH_KEY
CSI2510 18
CSI2510
Les mises à jour avec un sondage linéaire• Pour contrôler les
insertions et lessuppressions, nousintroduisons un objetspécial, appeléDISPONIBLE, qui remplaceles éléments enlevés
• removeElement(k)– Nous cherchons un item
avec la clé k– Si un tel élément (k, o)
est trouvé, nous leremplaçons avec l’objetspécial DISPONIBLE etnous retournonsl'élément o
– Sinon, nous retournonsNO_SUCH_KEY
• insert Item(k, o)– Nous lançons une exception
si la table est pleine– Nous commençons à la cellule
h(k)– Nous sondons les cellules
consécutives jusqu'à ce que:• Une cellule i qui est vide ou
emmagasine DISPONIBLEest trouvée, ou
• N cellules ont étéinfructueusement sondées
– Nous emmagasinons l’item(k, o) dans la cellule i
CSI2510
Performance du Sondage Linéaire
5.500.9 (90%)2.500.75 (75%)1.500.5 (50%)1.060.1 (10%)C(α )α=n/N
Recherche: Le nombre moyen de sondages….
C(α)
Les résultats expérimentaux pour un tableau dehachage avec le facteur de chargement α
CSI2510 19
CSI2510
Problème avec Sondage Linéaire :REGROUPEMENT PRIMAIRE
(création de cellules contigües)
8
CCC7FOX6
ELEPHANT5CRICKET4
CAT3h (CAT) = 3h1 (CAT) = 4h2 = 5h3 = 6h4 = 7
h5 = 8 !
Idée:Utiliser un sondage non linéaire
Ici nous utilisons comme fonction dehachage l’entier correspondant à lapremière lettre
CSI2510
Résolution de collision (2)Sondage Quadratique
h(ki), h(ki)+1, h(ki)+4, h(ki)+9, …{h0(ki)
{h1(ki)
N: nombrepremier
mod est dur à calculer
Visite seulement la moitié du tableaumais…
s(h(ki),j) = hj(ki) =( h ( ki ) + j2) mod N
CSI2510 20
CSI2510
Performance du Sondage Quadratique
Les résultats expérimentaux pour un tableau dehachage avec le facteur de chargement α
2.790.9 (90%)
1.990.75 (75%)
1.440.5 (50%)
1.050.1 (10%)
C(α )α = n/N
recherche
CSI2510
Problème avec Sondage non-linéaire :REGROUPEMENT SECONDAIRE
Deux clés qui hachent aumême endroit suivent lemême chemin de collision
Idée:
Hachage Double
CSI2510 21
CSI2510
Résolution de collisionAdressage ouvert: (3) Hachage Double
h(ki), h(ki)+h'(ki), h(ki)+2h'(ki), h(ki)+3h'(ki), …{h0
123h1
123h2
123h3
hj(ki) = [h(ki) + j•h’(ki)] mod NOUEx: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’( )
Ex:
CSI2510
– 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
Un exemple de Hachage Double
0 1 2 3 4 5 6 7 8 9 10 11 12
1841 22 44593231 73
CSI2510 22
CSI2510
h(ki) = ki mod N
h’(ki) = ki div NN nombrepremier!
Autre exemple de Hachage Double
CSI2510
2.550.9 (90%)
1.830.75 (75%)
1.380.5 (50%)
1.050.1 (10%)
C(α )α = n/N
Performance de Hachage Double
Les résultats expérimentaux pour un tableau dehachage avec le facteur de chargement α
recherche
CSI2510 23
CSI2510
Chaînage vs Adressageouvert
La méthode de chaînage utilise beaucoup demémoire
Au niveau théorique et expérimental la méthode dechainage est souvent aussi rapide que les méthodesd’adressage ouvert
CSI2510
Performance de Hachage:Résumé
• Dans le pire cas, lesrecherches, les insertions etles suppressions dans une tablede hachage prennent O(n)
• Le pire cas arrive quand toutesles clés insérées dans ledictionnaire entrent en collision
• Le facteur de chargement α =n/N affecte les performancesd’une table de hachage
• Supposons que les valeurs dehachage sont comme desnombres aléatoires, il peut êtremontré que le nombre prévu desondages pour une insertionavec adressage ouvert est
1 / (1 - α)
• Le temps prévu de toutes lesopérations du TADdictionnaire dans le tableauest O(1)
• En pratique, le hachage esttrès rapide si le facteur dechargement n'est pas prèsde 100%
• Les applications de tableaude hachage:– Petite base de données– compilateurs– Cache des navigateurs– P2P
top related