54
Février 2006 Florent LANGROGNET 1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Embed Size (px)

Citation preview

Page 1: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 1

Table de hachage

Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Page 2: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 2

Table de hachage

Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Page 3: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 3

Introduction

Structure de données reposant sur des tableaux

Comment ?

La position de l’élément dans le tableau est fonction de l’élément lui-même

Structure de données statique

Algorithme de recherche très performant

Page 4: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 4

Table de hachage

Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Page 5: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 5

Notion de clé

Défintion :

Une clé est une partie d’un élément qui permet de désigner le contenu de cet élément de manière non ambigüe

Exemples :

1. élément : étudiant (nom, prénom, …)Clé : numéro d’étudiant

2. élément : abonné téléphoniqueClé : numéro de téléphone

Page 6: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 6

Table de hachage

Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Page 7: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 7

Fonction de hachage

But :

Ranger les N éléments dans un tableau de taille Mafin d’optimiser la recherche d’un élément donné

Connaissant la clé d’un élément du tableau, on chercheun algorithme très efficace pour trouver l’élément dans le tableau (de l’ordre de O(1))

Page 8: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 8

Fonction de hachage

Défintion :

Soit E l’ensemble des clés possibles, et F l’ensemble des indices du tableauUne fonction de hachage H est une fonction qui associe à toute clé K, un indice dans le tableauH : E FH( K ) = i

Page 9: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 9

Fonction de hachage

Exemple : Annuaire inversé

Classe Abonne :Attributs :

string nomstring prenomlong numeroTel

Page 10: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 10

Fonction de hachage

Soit un abonné Ai de clé Ki La position de Ai dans le tableau sera la valeur de H(Ki)

tab[H(Ki)] = Ai

Page 11: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 11

Fonction de hachage

H(0381111144) = 0

H(0381333333) = 2H(0381222222) = 3

H(0381123456) = 6

Indice tab

0 Pierre Durand - 03.81.11.11.44

1

2 Paul Dupond - 03.81.33.33.33

3 Yvette Bon - 03.81.22.22.22

4

5

6 Guillaume Dupont - 03.81.12.34.56

Page 12: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 12

Fonction de hachage

Mais en pratique, il est difficile de trouver une ‘bonne’ fonction de hachage

La recherche dans une telle table est immédiate

Connaissant K (le numéro de téléphone), l’indice dans le tableau est donné par H(K)

Page 13: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 13

Fonction de hachage

Rappel :

Une application est surjective si tout élément de F possède au moins un antécédent

Une application est injective sitout élément de F possède au plus un antédédent

Une application est bijective sitout élément de F possède exactement un antécédent

Page 14: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 14

Fonction de hachage

Car sinon on a H(K1) = K(K2) = iet 2 éléments sont stockés au même indice

Quel élément placer à l’indice i ? Que faire de l’autre élément ?

Une fonction de hachage doit être injective

Page 15: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 15

Fonction de hachage

En pratique :

- Il est souvent difficile de trouver une fonction injective

- Dans certains cas, une telle fonction n’existe pas (M < N)

- Quand elle existe, elle est alors parfois complexe et le calcul H(K) peut être coûteux

Page 16: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 16

Table de hachage

Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Page 17: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 17

Collisions

Conséquences :On a H(K1) = H(K2) = i2 clés différentes donnent le même indice dans le tableau

On dit qu’il y a collision

On utilise souvent, en pratique, des fonctions non injectives

Page 18: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 18

Collisions

H(0381333333) = 2

H(0381222222) = 2

Indice tab

0 Pierre Durand - 03.81.11.11.44

1

2 Paul Dupond – 03.81.33.33.33

Yvette Bon – 03.81.22.22.22

3

4

5

6 Guillaume Dupond – 03.81.12.34.56

Page 19: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 19

Traitement des collisions

1ère méthode : chaînage externe

Déclarer un tableau de pointeurs (au lieu du tableau d’éléments)tab[i] contiendra la liste des éléments dont les clés K ont lamême image par H

Page 20: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 20

Traitement des collisions

Soient K1, K2, .. Kj les clés des éléments E1, E2, …Ej telles que H(K1) = H(K2) = … = H(Kj) = i

Alors les éléments E1, E2, … Ej seront chaînés à partir detab[i]

Page 21: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 21

Traitement des collisions

H(0381333333) = 2

H(0381222222) = 2

Indice tab

0 Pierre Durand - 03.81.11.11.44

1

2 Paul Dupond – 03.81.33.33.33

Yvette Bon – 03.81.22.22.22

3

4

5

6 Guillaume Dupond – 03.81.12.34.56

Page 22: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 22

Traitement des collisions

Pierre Durand

03.81.11.11.44

null

Paul Dupond

03.81.33.33.33Yvette Bon

03.81.22.22.22

null

Guillaume Dupont

03.81.12.34.56

null

Indice tab

0

1 Null

2

3 Null

4 Null

5 Null

6

Page 23: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 23

Traitement des collisions

Avantages de cette méthode : Un seul tableau (de pointeurs)

Inconvénients de cette méthode : - liste chaînée- la recherche d’un élément n’est plus immédiate

Page 24: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 24

Traitement des collisions

2ème méthode : tableau de collisions

- Augmenter la taille du tableau tab : M’ > MLes emplacements de M à M’ serviront à stocker les éléments en collisions

- Créer un tableau supplémentaire (col) en parallèle du tableau tab pour permettre de gérer les collisions

Page 25: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 25

Traitement des collisions

Si 2 éléments E1 et E2 sont en collisions (H(K1)=H(K2)=i)Alors on

tab[i] = E1 et col[i] = i’ i’ est l’indice tel que tab[i’] = E2 Avec i’ > M

Sinon tab[i] = E1 et col[i] = -1

Page 26: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 26

Traitement des collisions

H(0381333333) = 2

H(0381222222) = 2

Indice tab

0 Pierre Durand - 03.81.11.11.44

1

2 Paul Dupond – 03.81.33.33.33

Yvette Bon – 03.81.22.22.22

3

4

5

6 Guillaume Dupond – 03.81.12.34.56

Page 27: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 27

Traitement des collisions

Indice tab col

0 Pierre Durand – 03.81.11.11.44 -1

1

2 Paul Dupond – 03.81.33.33.33 7

3

4

5

6 Guillaume Dupont – 03.81.12.34.56 -1

7 Yvette Bon – 03.81.22.22.22 -1

N = 4

M = 7

M’ = 8

Page 28: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 28

Traitement des collisions

Avantages de cette méthode : Pas de liste chaînée

Inconvénients de cette méthode : - taille du tableau plus importante- la recherche d’un élément n’est plus immédiate

Page 29: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 29

Table de hachage

Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Page 30: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 30

Exemple de fonction de hachage

METHODE DE DIVISION

On suppose que K est un nombre entier

Prendre comme indice dans le tableau le reste de la division de la clé (qui doit être un entier !) par la taille du tableauH(K) = K mod M

Le choix de M est alors primordial pour éviter un trop grand nombre de collisions(M : nombre premier, …)

Page 31: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 31

Exemple de fonction de hachage

Annuaire inversé :On a 500 000 abonnés à ranger dans une table de taille 1 000 003 (nombre premier)

H(K) = K mod 1 000 003

H(03 81 12 34 56) = 122 313 tab[122313] = « Guillaume Dupond …»

H(03 81 22 22 22) = 221 079 tab[221079] = « Yvette Bon …»

Page 32: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 32

Table de hachage

Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Page 33: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 33

Exemple de table de hachage

Le but est de savoir si un mot est présent dans un dictionnaire et de le trouver rapidement

Ex 1 : dictionnaire de français :Element : mot + définitionClé : mot

Dictionnaire

Page 34: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 34

Exemple de table de hachage

Ex 2 : compilateur :Element : variableClé : nom de variable

On souhaite détecter les erreurs suivantes :- déclaration d’une variable déjà déclarée- utilisation d’une variable non déclarée

Page 35: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 35

Exemple de table de hachage

Exemple :

int i, j, nb;i=j;nb=x; // x : non déclaréint j; // j : déjà déclarée

Page 36: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 36

Exemple de table de hachage

1ère étape :à chaque déclaration, on range la variable déclarée dans le tableau

Indice tab

0 « i »

1

2 « j »

3

4 « nb »

5

6

H(« i »)=0

H(« j »)=2

H(« nb »)=4

Page 37: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 37

Exemple de table de hachage

int i, j, nb;i=j;nb=x; // x : non déclaréint j; // j : déjà déclarée

Tab[H(« j »)] est déjà occupée : j est déjà déclaré !

Détection des erreurs « variable déjà déclarée »

Page 38: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 38

Exemple de table de hachage

2ème étape :à chaque instruction,on vérifie que la variable est dans le tableau

int i, j, nb;i=j;nb=x; // x : non déclaréint j; // j : déjà déclarée

On vérifie que tab[H(« i »)] et tab[H(« j »)]sont occupés

Page 39: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 39

Exemple de table de hachage

int i, j, nb;i=j;nb=x; // x : non déclaréint j; // j : déjà déclarée

Tab[H(«x »)] est vide : x est non déclaré !

Détection des erreurs « variable non déclarée »

Page 40: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 40

Exemple de table de hachage

Conclusion :En utilisant les tables de hachage, on est capable de détecter des erreurs de compilation (erreur de déclaration)très efficacement.

Note : Avec d’autres structures (listes, arbres, …), l’algorithme de recherche d’un élément a une complexité au mieux en log(N)Ici, c’est immédiat (sous réserve que l’on trouve une « bonne » fontion de hachage)

Page 41: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 41

Exemple de table de hachage

Problème :Si on souhaite utiliser la méthode de la division comme fonction de hachage, il faut une clé numérique (au lieu d’une chaîne de caractères)

Question : comment passer d’une clé « chaîne de caractère » à uneclé numérique ?

Page 42: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 42

Exemple de table de hachage

Soit L la longueur de la chaîne « nom »Soit ascii(nom[i]) le code ascii du (i+1) ème

caractère de nom On peut choisir :

H(nom) =

Avec t bien choisi

1

0

)*])[((L

i

itinomascii

Page 43: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 43

Exemple de table de hachage

ascii(i) = 105ascii(j) = 106ascii(n) = 110ascii(b) = 98

En prenant t=10: H(«i») = 105 * 100 = 105H(«j») = 106 * 100 = 106H(«nb») = 110*100 + 98*101 = 110+980 = 1090

Page 44: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 44

Table de hachage

Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table de hachage Table de hachage et STL

Page 45: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 45

Table de hachage et STL

HashtableHashtable::hashtable( int taille_Elt,

Hash_fun fonctionHachage,EqualKey_fun fonctionEgal,ExtractKey_fun fonctionExtraction);

Hash_fun : fonction de hachage : clé -> int (rang)EqualKey_fun : définit si 2 clés sont égalesExtractKey_fun : fonction permettant d’extraire une clé à partir de l’élément

Page 46: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 46

Table de hachage et STL

Element : Abonne

Valeur : nom, prénom, numéro de téléphone

Clé : numéro de téléphone (long)

Exemple

Page 47: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 47

Table de hachage et STL

Class hash_fun{

public :

int operator()(const long & cle){

return (cle % 1003);

}

};

Exemple

Page 48: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 48

Table de hachage et STL

Class EqualKey_fun{

public :

bool operator()(const long & c1, const long & c2){

return (c1 = = c2);

}

};

Exemple

Page 49: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 49

Table de hachage et STL

Class ExtraxtKey_fun{

public :

long operator()(const Abonne & a){

return (return a.getNumeroTel());

}

};

Exemple

Page 50: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 50

Table de hachage et STL

Void main{

Hash_fun fh;EqualKey_fun feq;ExtractKey_fun fex;

hashtable<Abonne, long, Hash_fun, EqualKey_fun, ExtractKey_fun > maTable(sizeof(Abonne), hf, feq, fex);

Exemple

Page 51: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 51

Table de hachage et STL

Abonne a1(‘’Paul’’,’’Durand’’,0381111111);

Abonne a2(‘’Pierre’’,’’Dupond’’,038222222);

Abonne a3(‘’Yvette’’,’’Bon’’,0381333333);

// Ajouts

maTable.insert(a1);

maTable.insert(a2);

maTable.insert(a3);

Exemple

Page 52: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 52

Table de hachage et STL

// Extraction

hashtable<Abonne, long, Hash_fun, EqualKey_fun, ExtractKey_fun >

::iterator it;

for (it=maTable.begin(); it!=maTable.end(); it++){

cout<<fex(*it)<<endl; // Affiche la clé

cout<<fh(fex(*it))<<end; // Affiche le rang

cout<<*it<<endl; // Affiche l’abonné

}

}

Exemple

Page 53: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 53

Table de hachage et STL

Hashtable est en cours de normalisation

-> Elle n’est pas présente sur toutes les plateformes

Attention !

Page 54: Février 2006 Florent LANGROGNET1 Table de hachage Introduction Notion de clé Fonction de hachage Collisions Exemple de fonction de hachage Exemple de table

Février 2006 Florent LANGROGNET 54

Table de hachage

FIN