algorithmique avancée - tables de hachage -...

71
Introduction au hachage Gestion des collisions Les tables de hachage en java Set Algorithmique avancée Tables de hachage Frédéric Guyomarch Université de Lille1 IUT-A de Lille 2015/2016 - Semestre 3 Algorithmique avancée Frédéric Guyomarch

Upload: duongdiep

Post on 18-Feb-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Algorithmique avancéeTables de hachage

Frédéric Guyomarch

Université de Lille1IUT-A de Lille

2015/2016 - Semestre 3

Algorithmique avancée Frédéric Guyomarch

Page 2: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

IntroductionTable de hachage

Une table de hachage correspond à un ensemble de valeursidentifiées par des clés et spécifie plusieurs opérations :

• recherche(K key) : retourne l’élément de clé key• insert(K key, V val) : (écrit par-dessus si key existe)• supprime(K key)

C’est une implémentation d’un type de données abstraitDictionnaire (associations clé et valeurs).

Algorithmique avancée Frédéric Guyomarch

Page 3: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

IntroductionTable de hachage en résumé

• Une structure de type dictionnaire• Contenant des couples (clé,valeur)• La clé identifie la valeur• Pas de notion notion d’ordre• Pas de doublon• Basée sur les tableaux

©Insertion et recherche en temps quasi constant !

Algorithmique avancée Frédéric Guyomarch

Page 4: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

IntroductionTable de hachage en résumé

• Une structure de type dictionnaire• Contenant des couples (clé,valeur)• La clé identifie la valeur• Pas de notion notion d’ordre• Pas de doublon• Basée sur les tableaux

©Insertion et recherche en temps quasi constant !

Algorithmique avancée Frédéric Guyomarch

Page 5: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Motivations

• Un dictionnaire• Base de données• Historiquement pour les compilateurs (table des symboles)• Vérification de mots de passe• Maintenir une liste noire d’adresses ip

Algorithmique avancée Frédéric Guyomarch

Page 6: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

ApplicationDéduplication

Entrée : Un flux d’objetsBut : Enlever les doublons (ne garder que des objets uniques)Exemple : Repérer des visiteurs uniques sur une site web

Algorithmique avancée Frédéric Guyomarch

Page 7: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

ApplicationProblème de 2-Sum

Entrée : Un tableau d’entiers non trié T , une valeur cible z .But : Déterminer s’il existe deux entiers x et y dans T tel quex + y = z .

Algorithmique avancée Frédéric Guyomarch

Page 8: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

1 Introduction au hachageAdressage directFonction de hachage

2 Gestion des collisionsAdressage ouvertChaînage séparéHashMap

3 Les tables de hachage en javaequals() et hashcode()

4 Set

Algorithmique avancée Frédéric Guyomarch

Page 9: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Table de hachage : Principe généralDes couples (clé,valeur) stockés dans un tableau

0

1

2

n

?

?

?

?

⇒ une association clé du couple/indice du tableau.

Algorithmique avancée Frédéric Guyomarch

Page 10: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Table de hachage : Principe généralDes couples (clé,valeur) stockés dans un tableau

0

1

2

n

?

?

?

?

⇒ une association clé du couple/indice du tableau.

Algorithmique avancée Frédéric Guyomarch

Page 11: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Table de hachage : Principe général

ProblématiqueComment ranger les éléments dans le tableau de manière àavoir une recherche en accès direct ?

• Facile a priori si ma clé est un indice (idem tableau)

Algorithmique avancée Frédéric Guyomarch

Page 12: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Table de hachage : Principe général

ProblématiqueComment ranger les éléments dans le tableau de manière àavoir une recherche en accès direct ?

• Facile a priori si ma clé est un indice (idem tableau)

Algorithmique avancée Frédéric Guyomarch

Page 13: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Exemple

Exemple : Un registre d’employés

0 1 2

A. TuringSecrétaire

D. RitchieMécano

D. EngelbartCom

Algorithmique avancée Frédéric Guyomarch

Page 14: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Exemple

Exemple : Un registre d’employés

0 1 2

A. TuringSecrétaire

D. RitchieMécano

D. EngelbartCom

D. KnuthMécano

3

A chaque embauche, on incrémente la clé.

Algorithmique avancée Frédéric Guyomarch

Page 15: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Exemple

Exemple : Un registre d’employés

0 1 2

A. TuringSecrétaire

D. RitchieMécano

D. EngelbartCom

D. KnuthMécano

3

A chaque embauche, on incrémente la clé.

• La clé correspond à l’indice• Les clés sont en séquences

Algorithmique avancée Frédéric Guyomarch

Page 16: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

ExempleExemple : Un registre d’employés

0 1 2

A. TuringSecrétaire

D. RitchieMécano

D. EngelbartCom

D. KnuthMécano

3

A chaque embauche, on incrémente la clé.

• La clé correspond à l’indice• Les clés sont en séquences

⇒ Situation idéale

Algorithmique avancée Frédéric Guyomarch

Page 17: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage direct

Adressage directFormellement, dans le cas général où les clés ne sont pasnécessairement en séquence...

0

1

2

3

4

5

6

2

5

7

K

U1

0

3

4

2

5

77

(K, V)

L’univers des clés possibles est UK est l’ensemble des clés présentes (K ⊂ U)

Algorithmique avancée Frédéric Guyomarch

Page 18: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage direct

Problème 1 !

Si mon univers est très grand...

...par rapport au nombre de clés potentielles

Gaspillage de mémoire énorme !

Exemple : Si j’ai des clés bornées entre 0 et 10000 mais a priorijamais plus de 50 valeurs dans ma table : 9950 cases vides.

Algorithmique avancée Frédéric Guyomarch

Page 19: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage direct

Problème 1 !

Si mon univers est très grand...

...par rapport au nombre de clés potentielles

Gaspillage de mémoire énorme !

Exemple : Si j’ai des clés bornées entre 0 et 10000 mais a priorijamais plus de 50 valeurs dans ma table : 9950 cases vides.

Algorithmique avancée Frédéric Guyomarch

Page 20: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage direct

Problème 1 !

Si mon univers est très grand...

...par rapport au nombre de clés potentielles

Gaspillage de mémoire énorme !

Exemple : Si j’ai des clés bornées entre 0 et 10000 mais a priorijamais plus de 50 valeurs dans ma table : 9950 cases vides.

Algorithmique avancée Frédéric Guyomarch

Page 21: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage direct

Problème 1 !

Si mon univers est très grand...

...par rapport au nombre de clés potentielles

Gaspillage de mémoire énorme !

Exemple : Si j’ai des clés bornées entre 0 et 10000 mais a priorijamais plus de 50 valeurs dans ma table : 9950 cases vides.

Algorithmique avancée Frédéric Guyomarch

Page 22: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage direct

Problème 2 !

Et si ma clé est une chaîne de caractères ? ou un objet ?

Solution : utilisation d’une fonction de hachage

Algorithmique avancée Frédéric Guyomarch

Page 23: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage direct

Problème 2 !

Et si ma clé est une chaîne de caractères ? ou un objet ?Solution : utilisation d’une fonction de hachage

Algorithmique avancée Frédéric Guyomarch

Page 24: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Fonction de hachage

DéfinitionUne fonction de hachage est une fonction qui transforme unedonnée (la clé) en un entier (l’indice dans le tableau).

Formellement : h(k) = i

Elle établit une correspondance entre un couple(clé,valeur) etun indice du tableau. Le couple se trouvera à T [i ].

Algorithmique avancée Frédéric Guyomarch

Page 25: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Fonction de hachage

DéfinitionUne fonction de hachage est une fonction qui transforme unedonnée (la clé) en un entier (l’indice dans le tableau).

Formellement : h(k) = iElle établit une correspondance entre un couple(clé,valeur) etun indice du tableau. Le couple se trouvera à T [i ].

Algorithmique avancée Frédéric Guyomarch

Page 26: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Fonction de hachage

Des couples (clé,valeur) stockés dans un tableau

0

1

2

n

?

?

?

?

Algorithmique avancée Frédéric Guyomarch

Page 27: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Fonction de hachage

0

1

2

n

3

6

fonction de hachage

Algorithmique avancée Frédéric Guyomarch

Page 28: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Fonction de hachage

Choix d’une bonne fonction de hachage :• Elle doit être cohérente : la même clé produit la même

valeur de hachage• Elle doit être calculée efficacement• Elle doit distribuer uniformément les clés

Algorithmique avancée Frédéric Guyomarch

Page 29: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Adressage direct avec fonction de hachage

0

1

2

3

4

5

6

k3

k6

k4

K

Uk2

k1

k5

k7

h(k3)

7

h(k6)

h(k4)

Avec h(k3) = 2, h(k4) = 7 et h(k6) = 5.

Algorithmique avancée Frédéric Guyomarch

Page 30: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Exemple de fonction de hachageDictionnaire anglais-français

Convertir un mot anglais (la clé) en indice :

• Utiliser la table ascii ?

NON !• Coder une lettre par un nombre entre 0 et 27 ? NON !• Utiliser une base 27 ? C’est mieux !

On a résolu le problème 2, mais pas le 1 !

Algorithmique avancée Frédéric Guyomarch

Page 31: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Exemple de fonction de hachageDictionnaire anglais-français

Convertir un mot anglais (la clé) en indice :

• Utiliser la table ascii ? NON !

• Coder une lettre par un nombre entre 0 et 27 ? NON !• Utiliser une base 27 ? C’est mieux !

On a résolu le problème 2, mais pas le 1 !

Algorithmique avancée Frédéric Guyomarch

Page 32: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Exemple de fonction de hachageDictionnaire anglais-français

Convertir un mot anglais (la clé) en indice :

• Utiliser la table ascii ? NON !• Coder une lettre par un nombre entre 0 et 27 ?

NON !• Utiliser une base 27 ? C’est mieux !

On a résolu le problème 2, mais pas le 1 !

Algorithmique avancée Frédéric Guyomarch

Page 33: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Exemple de fonction de hachageDictionnaire anglais-français

Convertir un mot anglais (la clé) en indice :

• Utiliser la table ascii ? NON !• Coder une lettre par un nombre entre 0 et 27 ? NON !

• Utiliser une base 27 ? C’est mieux !

On a résolu le problème 2, mais pas le 1 !

Algorithmique avancée Frédéric Guyomarch

Page 34: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Exemple de fonction de hachageDictionnaire anglais-français

Convertir un mot anglais (la clé) en indice :

• Utiliser la table ascii ? NON !• Coder une lettre par un nombre entre 0 et 27 ? NON !• Utiliser une base 27 ?

C’est mieux !

On a résolu le problème 2, mais pas le 1 !

Algorithmique avancée Frédéric Guyomarch

Page 35: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Exemple de fonction de hachageDictionnaire anglais-français

Convertir un mot anglais (la clé) en indice :

• Utiliser la table ascii ? NON !• Coder une lettre par un nombre entre 0 et 27 ? NON !• Utiliser une base 27 ? C’est mieux !

On a résolu le problème 2, mais pas le 1 !

Algorithmique avancée Frédéric Guyomarch

Page 36: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Exemple de fonction de hachageDictionnaire anglais-français

Convertir un mot anglais (la clé) en indice :

• Utiliser la table ascii ? NON !• Coder une lettre par un nombre entre 0 et 27 ? NON !• Utiliser une base 27 ? C’est mieux !

On a résolu le problème 2, mais pas le 1 !

Algorithmique avancée Frédéric Guyomarch

Page 37: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

ExempleDictionnaire anglais-français

On va avoir un tableau de taille faramineuse et beaucoup decases réservées pour des mots qui n’existent pas !

clé fira firb firc fird fire firfindice 125146 125147 125148 125149 125150 125151

Algorithmique avancée Frédéric Guyomarch

Page 38: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Hachage

• Quelle taille de tableau souhaite-t-on avoir ?

• Idéalement, une taille proche du nombre d’éléments qu’ily aura effectivement dedans.

• Comment compresser les valeurs ?

⇒ Utiliser le modulo

Algorithmique avancée Frédéric Guyomarch

Page 39: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Hachage

• Quelle taille de tableau souhaite-t-on avoir ?• Idéalement, une taille proche du nombre d’éléments qu’il

y aura effectivement dedans.

• Comment compresser les valeurs ?

⇒ Utiliser le modulo

Algorithmique avancée Frédéric Guyomarch

Page 40: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Hachage

• Quelle taille de tableau souhaite-t-on avoir ?• Idéalement, une taille proche du nombre d’éléments qu’il

y aura effectivement dedans.• Comment compresser les valeurs ?

⇒ Utiliser le modulo

Algorithmique avancée Frédéric Guyomarch

Page 41: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Hachage

• Quelle taille de tableau souhaite-t-on avoir ?• Idéalement, une taille proche du nombre d’éléments qu’il

y aura effectivement dedans.• Comment compresser les valeurs ?

⇒ Utiliser le modulo

Algorithmique avancée Frédéric Guyomarch

Page 42: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

La méthode de la division

h(k) = k mod m correspond à la méthode de la division.• Méthode simple (rapide)• Il faut bien choisir la taille m de la table. (nb premier de

préférence)U = 2000 et m = 701, une moyenne de 3 échecs.

. Il existe d’autres méthodes...

Algorithmique avancée Frédéric Guyomarch

Page 43: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Hachage et modulo

0

1

2

3

4

5

6

k3

k6

k4

K

Uk2

k1

k5

k7

h(k3) = h(k9)

7

h(k6)

h(k4) = h(k8)

k8k9

Plusieurs clés correspondent au même indice dans le tableau :c’est une collision.

Algorithmique avancée Frédéric Guyomarch

Page 44: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

Hachage et modulo

0

1

2

3

4

5

6

k3

k6

k4

K

Uk2

k1

k5

k7

h(k3) = h(k9)

7

h(k6)

h(k4) = h(k8)

k8k9

Plusieurs clés correspondent au même indice dans le tableau :c’est une collision.

Algorithmique avancée Frédéric Guyomarch

Page 45: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Fonction de hachage

1 Introduction au hachageAdressage directFonction de hachage

2 Gestion des collisionsAdressage ouvertChaînage séparéHashMap

3 Les tables de hachage en javaequals() et hashcode()

4 Set

Algorithmique avancée Frédéric Guyomarch

Page 46: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Collisions

Pourquoi y a-t-il des collisions ?• Cas évident : principe des tiroirs

• Si n chaussettes et m tiroirs et n > m⇒ Forcément plus d’une chaussette par tiroir

• Si n < m, risque de collision tout de même• ⇒ paradoxe des anniversaires⇒ Dans un groupe de 23 personnes, 50% de chance qu’ily ait deux personnes avec la même date de naissance.

Algorithmique avancée Frédéric Guyomarch

Page 47: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Résoudre les collisions

• Par adressage ouvert• Par chaînage

Algorithmique avancée Frédéric Guyomarch

Page 48: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

PrincipeEn adressage ouvert, quand un élément ne peut être placé àl’endroit calculé par hachage, on essaie de le placer dans uneautre case vide.

Nous allons étudier 3 méthodes :• Le sondage linéaire• Le sondage quadratique• Le hachage double

Algorithmique avancée Frédéric Guyomarch

Page 49: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

Sondage linéaireSoit i = h(k) :

1 On accède à T [i ] par le retour de la fonction de hachage2 On regarde si la clé n’est pas dans la case h(k + 1) :3 En cas d’insertion : on ajoute dans la première case

vide trouvéeEn cas de recherche : Tant qu’on a pas trouvé lavaleur on répète 2.Si on trouve une case vide, la donnée n’existe pas.

On regarde aux indices h(k + 2), h(k + 3), h(k + 4), h + k ...

§Problème de clustering (pire si la table est trop remplie).

Algorithmique avancée Frédéric Guyomarch

Page 50: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

Sondage linéaireSoit i = h(k) :

1 On accède à T [i ] par le retour de la fonction de hachage2 On regarde si la clé n’est pas dans la case h(k + 1) :3 En cas d’insertion : on ajoute dans la première case

vide trouvéeEn cas de recherche : Tant qu’on a pas trouvé lavaleur on répète 2.Si on trouve une case vide, la donnée n’existe pas.

On regarde aux indices h(k + 2), h(k + 3), h(k + 4), h + k ...

§Problème de clustering (pire si la table est trop remplie).

Algorithmique avancée Frédéric Guyomarch

Page 51: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

48

50

49

51

52

53

54

55

56

57

58

948

408

172

833

413

532

472

358

Sondageinitial

48

50

49

51

52

53

54

55

56

57

58

948

408

172

833

413

532

472

358

Sondageinitial

a)Recherche réussie de 472 b)Recherche infructueuse de 893Algorithmique avancée Frédéric Guyomarch

Page 52: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

Sondage quadratique

• On ne regarde plus juste à la case suivante.• On applique une fonction quadratique à pour passer d’une

case à l’autre

On regarde aux indices h + 12, h + 22, h + 32, h + 42, h + k2...

§Problème de clustering secondaire.

Algorithmique avancée Frédéric Guyomarch

Page 53: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

Sondage quadratique

• On ne regarde plus juste à la case suivante.• On applique une fonction quadratique à pour passer d’une

case à l’autre

On regarde aux indices h + 12, h + 22, h + 32, h + 42, h + k2...§Problème de clustering secondaire.

Algorithmique avancée Frédéric Guyomarch

Page 54: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

6

8

7

9

10

11

12

13

14

15

16

656

777

837

599

899

420

Sondageinitial

715

658

17 898

18

15

+1

+4

+9

6

8

7

9

10

11

12

13

14

15

16

656

777

837

599

899

420

Sondageinitial

715

658

17 898

18

15

+1

+4

+9

a)Recherche réussie de 420 b)Recherche infructueuse de 480Algorithmique avancée Frédéric Guyomarch

Page 55: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

Pour que le sondage soit efficace :• Le facteur de charge doit être limité (pas plus 2/3)facteurdecharge = nbElements/tailleTable

• On ne peut avoir plus déléments que de cases du tableau

Algorithmique avancée Frédéric Guyomarch

Page 56: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

Double Hachage

Les sondages linéaire et quadratique posent des problèmes declustering car on suit toujours la même séquence.

Une solution : Le double hachage

PrincipeOn va utiliser une seconde fonction de hachage sur les deuxclés qui va déterminer un pas (probablement) différent.

Algorithmique avancée Frédéric Guyomarch

Page 57: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Adressage ouvert

Double Hachage

Les sondages linéaire et quadratique posent des problèmes declustering car on suit toujours la même séquence.

Une solution : Le double hachage

PrincipeOn va utiliser une seconde fonction de hachage sur les deuxclés qui va déterminer un pas (probablement) différent.

Algorithmique avancée Frédéric Guyomarch

Page 58: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Chaînage séparé

Jusque qu’ici, au maximum autant d’objets que la taille de latable.

PrincipeOn va ranger tous les couples dont les clés ont la même valeurde hachage dans une liste chaînée

Algorithmique avancée Frédéric Guyomarch

Page 59: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Chaînage séparé

0

1

2

3

4

5

6

k3

k6

k4

K

U

k1

k2

k5

k7

7

k8k9

h(k3) h(k9)

h(k8) h(k4) h(k1)

h(k6)

Null

Null

Null

Algorithmique avancée Frédéric Guyomarch

Page 60: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Chaînage séparé

1 Introduction au hachageAdressage directFonction de hachage

2 Gestion des collisionsAdressage ouvertChaînage séparéHashMap

3 Les tables de hachage en javaequals() et hashcode()

4 Set

Algorithmique avancée Frédéric Guyomarch

Page 61: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

HashMap

Nous utiliserons le plus souvent la classe HashMap del’interface Map.Exemple d’utilisation :p u b l i c s t a t i c vo i d main ( S t r i n g [ ] a r g s ) {

Map <St r i ng , I n t e g e r > iMap= new HashMap<St r i ng , I n t e g e r >() ;iMap . put ( "one" , new I n t e g e r ( 1 ) ) ;iMap . put ( "two" , new I n t e g e r ( 3 ) ) ;iMap . put ( n u l l , new I n t e g e r ( 45 ) ) ;iMap . put ( n u l l , new I n t e g e r ( 32 ) ) ;

I n t e g e r i = iMap . ge t ( " t h r e e " ) ; // Retourne n u l lI n t e g e r j = iMap . ge t ( "one" ) ; // j = 1System . out . p r i n t l n ( iMap . ge t ( n u l l ) ) ; // a f f i c h e 32

}

Algorithmique avancée Frédéric Guyomarch

Page 62: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

equals() et hashcode()

Egalité d’objets

L’opérateur == compare l’égalité des références des objets etla méthode equals() leur égalité tout court.

• Mais par défaut equals() se base sur les références.• Il faut donc la redéfinir !• Sinon deux instances aux mêmes propriétés seront

considérées comme différentes !

Algorithmique avancée Frédéric Guyomarch

Page 63: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

equals() et hashcode()

La méthode hashcode

En Java, la valeur de la fonction de hachage est implicite àchaque objet :

• La méthode hashcode de Object renvoie la valeur dehachage.

• Par défaut, elle fait référence à l’emplacement mémoirecomme equals.

Si a.equals(b) => a.hashcode() == b.hashcodeMais la réciproque est fausse !

Il est donc important de redéfinir conjointement ces méthodes !

Algorithmique avancée Frédéric Guyomarch

Page 64: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

equals() et hashcode()

La méthode hashcode

En Java, la valeur de la fonction de hachage est implicite àchaque objet :

• La méthode hashcode de Object renvoie la valeur dehachage.

• Par défaut, elle fait référence à l’emplacement mémoirecomme equals.

Si a.equals(b) => a.hashcode() == b.hashcodeMais la réciproque est fausse !

Il est donc important de redéfinir conjointement ces méthodes !

Algorithmique avancée Frédéric Guyomarch

Page 65: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

1 Introduction au hachageAdressage directFonction de hachage

2 Gestion des collisionsAdressage ouvertChaînage séparéHashMap

3 Les tables de hachage en javaequals() et hashcode()

4 Set

Algorithmique avancée Frédéric Guyomarch

Page 66: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Set

Les Set sont des ensembles d’objets :

• Uniquement des objets (pas de couple(clé,valeur))• Pas de doublon• Pas d’ordre• Relatif à la notion d’ensemble en mathématiques.

En Java, l’implémentation de l’interface Set HashSet estbasée sur l’utilisation d’une HashMap.

Algorithmique avancée Frédéric Guyomarch

Page 67: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

HashSet<St r i ng> e t a t s S e t = new HashSet<St r i ng >() ;e t a t s S e t . add ( "FR" ) ;e t a t s S e t . add ( "AG" ) ;e t a t s S e t . add ( "CU" ) ;

i f ( e t a t s S e t . c o n t a i n s ( "MX" ) ) {System . out . p r i n t l n ( "Deja ␣ t r ouv e " ) ;

} e l s e {e t a t s S e t . add ( "MX" ) ;

}

Algorithmique avancée Frédéric Guyomarch

Page 68: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Entry(K,V) de Map

• La méthode Set< Map.Entry<K,V> > entrySet()retourne un Set de Map.Entry<K,V> qui correspond à uncouple (clé,valeur).

• Le Set retourné correspond à une vue sur la Map àl’instant t.

• On peut appeler les méthodes getKey() andgetValue() pour accéder respectivement aux clés et auxvaleurs.

Algorithmique avancée Frédéric Guyomarch

Page 69: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

p u b l i c s t a t i c vo i d main ( S t r i n g [ ] a r g s ) {Map <St r i ng , I n t e g e r > iMap =new HashMap<St r i ng , I n t e g e r >() ;iMap . put ( "one" , new I n t e g e r ( 1 ) ) ;iMap . put ( "two" , new I n t e g e r ( 3 ) ) ;iMap . put ( n u l l , new I n t e g e r ( 45 ) ) ;iMap . put ( n u l l , new I n t e g e r ( 32 ) ) ;

Set<Entry<St r i ng , I n t e g e r >> s e t = iMap . e n t r yS e t ( ) ;System . out . p r i n t l n ( " v a l e u r ␣d ’ un␣ s e t :␣" + s e t ) ;// v a l e u r d ’ un s e t : [ n u l l =32, two=3, one=1]

}

Algorithmique avancée Frédéric Guyomarch

Page 70: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Au delà du cours : Empreinte MD5Empreinte MD5 : fonction de hachage cryptographiquecalculée sur un fichier.⇒ Permet de vérifier l’intégrité d’un fichier.Scénario exemple :

• Je télécharge une version d’ubuntu• Je veux être certain que mon fichier téléchargé n’est pas

corrompu ou vérolé• Je récupère l’empreinte MD5 sur le site de source officielle• Je calcule cette empreinte avec un utilitaire commemd5sum

• Je compare cette empreinte avec l’officielle• Si elles correspondent, je peux faire confiance à mon

fichier.Algorithmique avancée Frédéric Guyomarch

Page 71: Algorithmique avancée - Tables de hachage - LIFLguyomarc/pages_perso/SDD_files/M3103_CM5_Hachage.pdf · Introduction au hachage Gestion des collisions Les tables de hachage en

Introduction au hachage Gestion des collisions Les tables de hachage en java Set

Dans ce cours, nous avons vu :• Le fonctionnement des tables de hachages,• La résolution des collisions,• Comment on les utilise en pratique (c’est simple) !

Algorithmique avancée Frédéric Guyomarch