Février 2006 Florent LANGROGNET1 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 LANGROGNET2 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 LANGROGNET3 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 LANGROGNET4 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 LANGROGNET5 Notion de clé Défintion : Une clé est une partie dun é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éphonique Clé : numéro de téléphone
Février 2006 Florent LANGROGNET6 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 LANGROGNET7 Fonction de hachage But : Ranger les N éléments dans un tableau de taille M afin doptimiser la recherche dun élément donné Connaissant la clé dun élément du tableau, on cherche un algorithme très efficace pour trouver lélément dans le tableau (de lordre de O(1))
Février 2006 Florent LANGROGNET8 Fonction de hachage Défintion : Soit E lensemble des clés possibles, et F lensemble des indices du tableau Une fonction de hachage H est une fonction qui associe à toute clé K, un indice dans le tableau H : E F H( K ) = i
Février 2006 Florent LANGROGNET9 Fonction de hachage Exemple : Annuaire inversé Classe Abonne : Attributs : string nom string prenom long numeroTel
Février 2006 Florent LANGROGNET10 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 LANGROGNET11 Fonction de hachage H( ) = 0 H( ) = 2 H( ) = 3 H( ) = 6 Indicetab 0Pierre Durand Paul Dupond Yvette Bon Guillaume Dupont
Février 2006 Florent LANGROGNET12 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), lindice dans le tableau est donné par H(K)
Février 2006 Florent LANGROGNET13 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 si tout élément de F possède au plus un antédédent Une application est bijective si tout élément de F possède exactement un antécédent
Février 2006 Florent LANGROGNET14 Fonction de hachage Car sinon on a H(K1) = K(K2) = i et 2 éléments sont stockés au même indice Quel élément placer à lindice i ? Que faire de lautre élément ? Une fonction de hachage doit être injective
Février 2006 Florent LANGROGNET15 Fonction de hachage En pratique : - Il est souvent difficile de trouver une fonction injective - Dans certains cas, une telle fonction nexiste pas (M < N) - Quand elle existe, elle est alors parfois complexe et le calcul H(K) peut être coûteux
Février 2006 Florent LANGROGNET16 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 LANGROGNET17 Collisions Conséquences : On a H(K1) = H(K2) = i 2 clés différentes donnent le même indice dans le tableau On dit quil y a collision On utilise souvent, en pratique, des fonctions non injectives
Février 2006 Florent LANGROGNET18 Collisions H( ) = 2 H( ) = 2 Indicetab 0Pierre Durand Paul Dupond – Yvette Bon – Guillaume Dupond –
Février 2006 Florent LANGROGNET19 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 la même image par H
Février 2006 Florent LANGROGNET20 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 de tab[i]
Février 2006 Florent LANGROGNET21 Traitement des collisions H( ) = 2 H( ) = 2 Indicetab 0Pierre Durand Paul Dupond – Yvette Bon – Guillaume Dupond –
Février 2006 Florent LANGROGNET22 Traitement des collisions Pierre Durand null Paul Dupond Yvette Bon null Guillaume Dupont null Indicetab 0 1Null
Février 2006 Florent LANGROGNET23 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 dun élément nest plus immédiate
Février 2006 Florent LANGROGNET24 Traitement des collisions 2ème méthode : tableau de collisions - Augmenter la taille du tableau tab : M > M Les 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 LANGROGNET25 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 lindice tel que tab[i] = E2 Avec i > M Sinon tab[i] = E1 et col[i] = -1
Février 2006 Florent LANGROGNET26 Traitement des collisions H( ) = 2 H( ) = 2 Indicetab 0Pierre Durand Paul Dupond – Yvette Bon – Guillaume Dupond –
Février 2006 Florent LANGROGNET27 Traitement des collisions Indicetabcol 0 Pierre Durand – Paul Dupond – Guillaume Dupont – Yvette Bon – N = 4 M = 7 M = 8
Février 2006 Florent LANGROGNET28 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 dun élément nest plus immédiate
Février 2006 Florent LANGROGNET29 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 LANGROGNET30 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 tableau H(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 LANGROGNET31 Exemple de fonction de hachage Annuaire inversé : On a abonnés à ranger dans une table de taille (nombre premier) H(K) = K mod H( ) = tab[122313] = « Guillaume Dupond …» H( ) = tab[221079] = « Yvette Bon …»
Février 2006 Florent LANGROGNET32 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 LANGROGNET33 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éfinition Clé : mot Dictionnaire
Février 2006 Florent LANGROGNET34 Exemple de table de hachage Ex 2 : compilateur : Element : variable Clé : nom de variable On souhaite détecter les erreurs suivantes : - déclaration dune variable déjà déclarée - utilisation dune variable non déclarée
Février 2006 Florent LANGROGNET35 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 LANGROGNET36 Exemple de table de hachage 1 ère étape : à chaque déclaration, on range la variable déclarée dans le tableau Indicetab 0« i » 1 2« j » 3 4« nb » 5 6 H(« i »)=0 H(« j »)=2 H(« nb »)=4
Février 2006 Florent LANGROGNET37 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 LANGROGNET38 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 LANGROGNET39 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 LANGROGNET40 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 dautres structures (listes, arbres, …), lalgorithme de recherche dun élément a une complexité au mieux en log(N) Ici, cest immédiat (sous réserve que lon trouve une « bonne » fontion de hachage)
Février 2006 Florent LANGROGNET41 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 dune chaîne de caractères) Question : comment passer dune clé « chaîne de caractère » à une clé numérique ?
Février 2006 Florent LANGROGNET42 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
Février 2006 Florent LANGROGNET43 Exemple de table de hachage ascii(i) = 105 ascii(j) = 106 ascii(n) = 110 ascii(b) = 98 En prenant t=10: H(«i») = 105 * 10 0 = 105 H(«j») = 106 * 10 0 = 106 H(«nb») = 110* *10 1 = = 1090
Février 2006 Florent LANGROGNET44 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 LANGROGNET45 Table de hachage et STL Hashtable Hashtable::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 égales ExtractKey_fun : fonction permettant dextraire une clé à partir de lélément
Février 2006 Florent LANGROGNET46 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 LANGROGNET47 Table de hachage et STL Class hash_fun{ public : int operator()(const long & cle){ return (cle % 1003); } }; Exemple
Février 2006 Florent LANGROGNET48 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 LANGROGNET49 Table de hachage et STL Class ExtraxtKey_fun{ public : long operator()(const Abonne & a){ return (return a.getNumeroTel()); } }; Exemple
Février 2006 Florent LANGROGNET50 Table de hachage et STL Void main{ Hash_fun fh; EqualKey_fun feq; ExtractKey_fun fex; hashtable maTable(sizeof(Abonne), hf, feq, fex); … Exemple
Février 2006 Florent LANGROGNET51 Table de hachage et STL Abonne a1(Paul,Durand, ); Abonne a2(Pierre,Dupond, ); Abonne a3(Yvette,Bon, ); // Ajouts maTable.insert(a1); maTable.insert(a2); maTable.insert(a3); … Exemple
Février 2006 Florent LANGROGNET52 Table de hachage et STL // Extraction hashtable ::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 labonné } Exemple
Février 2006 Florent LANGROGNET53 Table de hachage et STL Hashtable est en cours de normalisation -> Elle nest pas présente sur toutes les plateformes Attention !
Février 2006 Florent LANGROGNET54 Table de hachage FIN