Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les...

23
CSI2510 1 CSI2510 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 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 leurs clés Les clés sont emmagasinées, mais ne sont pas triées !

Transcript of Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les...

Page 1: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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 !

Page 2: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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.

Page 3: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 4: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 5: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 6: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 7: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 8: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 9: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 10: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 11: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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)

Page 12: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 13: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 14: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 15: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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)

Page 16: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 17: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 18: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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 α

Page 19: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 20: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 21: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 22: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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

Page 23: Idée - Engineeringflocchin/CSI2510/CSI2510hash.pdf · pour une valeur fixe z (en négligeant les surplus) –Surtout convenable pour les chaînes de caractères (strings) (par ex.,

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