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 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
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
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
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
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
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))
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
Février 2006 Florent LANGROGNET 9
Fonction de hachage
Exemple : Annuaire inversé
Classe Abonne :Attributs :
string nomstring prenomlong numeroTel
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
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
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)
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
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
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
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
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
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
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
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]
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
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
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
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
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
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
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
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
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
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, …)
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 …»
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
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
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
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
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
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 »
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
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 »
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)
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 ?
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
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
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
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
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
Février 2006 Florent LANGROGNET 47
Table de hachage et STL
Class hash_fun{
public :
int operator()(const long & cle){
return (cle % 1003);
}
};
Exemple
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
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
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
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
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
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 !
Février 2006 Florent LANGROGNET 54
Table de hachage
FIN