Chapitre 6 hachage statique

1 143 vues

Publié le

Chapitre 6 Hachage statique

Publié dans : Formation
  • Soyez le premier à commenter

Chapitre 6 hachage statique

  1. 1. CHAPITRE VI: HACHAGE STATIQUE Université Saad Dahlab de Blida Faculté des Sciences Département d’Informatique Licence d’Informatique Semestre 4 (2ème année) Algorithmique et Structures de Données Mme AROUSSI 2014-2015 Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/
  2. 2.  Introduction  Principe du hachage  Terminologie  Fonctions de Hachage  Méthodes de résolution de collisions  Estimation des débordements  Conclusion 2 PLAN DU CHAPITRE V
  3. 3. 3  Problématique: Supposons que l'on veuille ranger des données (enregistrements) qui arrivent dans un ordre quelconque dans un tableau.  Solutions Possibles: Il existe, en général, deux façons de les ranger : 1. Si le tableau est non ordonné alors  Recherche est séquentielle  O(n)  Lent  Insertion se fait à la fin du tableau  O(1)  Rapide INTRODUCTION
  4. 4. 4  Solutions Possibles: Il existe, en général, deux façons de les ranger : 1. Si le tableau est non ordonné alors  Recherche est séquentielle  O(n)  Lent  Insertion se fait à la fin du tableau  O(1)  Rapide 2. Si le tableau est ordonné alors  Recherche est dichotomique  O(Log2(n)) Rapide  Insertion provoque un décalage des éléments du tableau  O(n) Lent INTRODUCTION
  5. 5. 5  Une troisième possibilité de ranger une donnée dans un tableau :  Ranger la donnée « x » à un emplacement « y » calculé par une fonction « h » tel que y = h(x)  On parle ici de table de rangement dispersé ou technique de HACHAGE ( en anglais "Hashing" ).  Dans ce type de rangement, que ce soit pour insérer ou rechercher une donnée, on procédera toujours aussi rapidement ( O(c) ) INTRODUCTION
  6. 6. 6 PRINCIPE x2 x4 x8 x6 x5 x1 x3 x7 x3 x8 x5 x2 x1 x7 x4 x6 0 1 2 3 4 5 6 .. N-1 .. .. Table de Hachage « TH » h(x) Données à stocker Rangement par calcul d'adresse La fonction « h » doit retourner des valeurs comprises entre 0 et N-1 Le calcul d'adresse permet de stocker des données (x) dans une table (TH) de taille N, en utilisant une fonction (h) x5 ?
  7. 7. 7  La fonction h est appelé fonction de hachage.  L’adresse primaire (h(x)) d’une donnée x est le résultat retourné par la fonction de hachage h  Les synonymes sont les données qui ont la même adresse primaire, i.e. x1 et x2 sont des synonymes ssi h(x1) = h(x2). On dit aussi que x1 et x2 sont en collisions.  On parle de débordement lorsqu’il y a une donnée qui n’est pas dans son adresse primaire. On dit aussi qu'elle est rangée dans une adresse secondaire.  L’adresse secondaire est déterminé par une méthode donnée, on parle de méthode de résolution de collisions TERMINOLOGIE
  8. 8. 8 PRINCIPE x2 x4 x8 x6 x1 x3 x7 x3 x8 x5 x2 x1 x7 x4 x6 0 1 2 3 4 5 6 .. N-1 .. .. Table de Hachage « T » h(x) Données à stocker Rangement par calcul d'adresse Pour utiliser une technique de hachage, on doit donc définir: 1. une fonction de hachage « h » 2. une méthode de résolution des collisions x5 ?
  9. 9. 9  Il s’agit de trouver une fonction h tels que 0 ≤ h(x) < N qui réduit au maximum le nombre de collisions.  L'idéal, c'est d'avoir une fonction de hachage bijective c'est à dire une fonction qui attribue pour chaque donnée à insérer un nouvel emplacement dans le tableau.  Le pire des cas, c'est lorsque toute donnée est hachée en une même adresse.  Une solution acceptable est une solution où certaines données partagent la même adresse (h est surjective). FONCTIONS DE HACHAGE
  10. 10. 10  Il existe plusieurs fonctions de hachage, les plus utilisées: 1. La fonction de division 2. La fonction dite du milieu du carré « middle square » 3. La fonction dite du « transformation radix » FONCTIONS DE HACHAGE
  11. 11. 11 1. La fonction de division: h(x) = x MOD N  Elle retourne le reste de la division par N où N est la taille de la table  C’est une fonction facile et rapide à calculer mais sa qualité dépend de la valeur de N.  Il est démontré que :  c'est très mauvais de choisir N une puissance de 2.  N premier constitue généralement un bon choix. FONCTIONS DE HACHAGE
  12. 12. 12 1. La fonction de division: h(x) = x MOD N  Exemple: calculer la fonction de hachage des données suivantes: FONCTIONS DE HACHAGE X N = 10 N = 11 5 5 5 55 5  collision 0 23 3 1 453 3  collision 2 Pas de collisions dans le cas où N=11 car N est un nombre premier
  13. 13. 13 2. La fonction du milieu du carré « middle square »  On élève la donnée x au carré x2 et on prend les chiffres du milieu  Cette méthode donne de bons résultats si le nombre au carré n’a pas de zéros.  Exemple: calculer la fonction de hachage des données suivantes : FONCTIONS DE HACHAGE X X2 N = 10 N = 100 500 250000 0 0 12 144 4 14 ou 44 453 205209 5 ou 2 52
  14. 14. 14 3. La fonction de transformation radix : h(x) = (x)b MOD N  On convertit la donnée « x » dans une base de numération « b » et on prend le reste de la division sur « N ».  Exemple: calculer la fonction de hachage des données suivantes dans le cas où b = 11 et N = 10 ou 100 : FONCTIONS DE HACHAGE X10 X11 N = 10 N = 100 12 11 1 11 453 382 2 82
  15. 15. 15  En conclusion, il n’y a pas de fonction de hachage universelle.  Cependant, une bonne fonction doit être:  rapide à calculer  répartit uniformément les éléments  Elle dépend donc:  de la machine  des éléments  Mais aucune fonction n’évite les collisions, qu’il va falloir traiter. FONCTIONS DE HACHAGE
  16. 16. 16  Exercice 1: Soit E = {a, b, c, d, e, f, g, h} un ensemble d’enregistrement. On veut insérer ces enregistrements dans une table de hachage de 10 cases selon leur clé: 1. Calculer l’adresse primaire de chaque enregistrement dans les cas où la fonction de hachage est une fonction : a. De division, i.e : h(x) = x MOD N b. Du milieu du carré, i.e on élève la donnée x au carré x2 et on prend le chiffre du milieu c. De transformation radix, i.e : (x)b MOD N et b = 11 FONCTION DE HACHAGE Enregistrement a b c d e f g h Clé 5 51 23 453 500 12 38 42
  17. 17. 17  Exercice 1: Soit E = {a, b, c, d, e, f, g, h} un ensemble d’enregistrement. On veut insérer ces enregistrements dans une table de hachage de 10 cases selon leur clé: 1. Calculer l’adresse primaire de chaque enregistrement FONCTIONS DE HACHAGE Enregistrement a b c d e f g h Clé ou x 5 51 23 453 500 12 38 42 x MOD N 5 1 3 3 0 2 8 2 Milieu du carré 2 6 2 5 0 4 4 7 5 0 2 6 (x)11 MOD N 5 7 1 2 5 1 5 9
  18. 18. 18  Lors de l'insertion de x, si l'adresse primaire h(x) est déjà utilisée par une autre donnée, la méthode de résolution de collision permet de trouver un autre emplacement (libre) pour x. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  19. 19. 19  Pour résoudre les collisions, deux stratégies se présentent: a. Les méthodes directes ou le hachage par calcul de l’emplacement: 1. Essai linéaire 2. Double hachage b. Les méthodes indirectes ou le hachage par chainage: 3. Chainage séparée 4. Chainage interne MÉTHODES DE RÉSOLUTION DE COLLISIONS
  20. 20. 20 1. Essai linéaire:  S’il se produit une collision sur la case h(x), on essaie les cases qui la précèdent : h(x)-1, h(x)-2, h(x)-3,..., 0, N-1, N-2, …, jusqu'à trouver une case vide.  La rencontre d'une case vide indique que la donnée n'existe pas.  Il faudra sacrifier une case vide dans la table de hachage pour que la séquence de test soit finie. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  21. 21. 21 1. Essai linéaire: Exercice 1 (Question2. a): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 Indice Vide enregistrement 0 V 1 V 2 V 3 V 4 V 5 V 6 V 7 V 8 V 9 V Etat initial de Table de Hachage Indice Vide enregistrement 0 V 1 F b 2 V 3 F c 4 V 5 F a 6 V 7 V 8 V 9 V Après l’insertion de a, b et c
  22. 22. 22 1. Essai linéaire: Exercice 1 (Question2. a): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 Indice Vide enregistrement 0 V 1 F b 2 F d 3 F c 4 V 5 F a 6 V 7 V 8 V 9 V ↑ collision Calcul de h(d) -1 = 2  case vide
  23. 23. 23 1. Essai linéaire: Exercice 1 (Question2. a): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 Après l’insertion de e Indice Vide enregistrement 0 F e 1 F b 2 F d 3 F c 4 V 5 F a 6 V 7 V 8 V 9 V ↑ collision Calcul de h(f) - 1 = 1  case pleine Calcul de h(f) - 2 = 0  case pleine Calcul de h(f) - 3 + 10 = 9  case vide
  24. 24. 24 1. Essai linéaire: Exercice 1 (Question2. a): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 Après l’insertion de f, g Indice Vide enregistrement 0 F e 1 F b 2 F d 3 F c 4 V 5 F a 6 V 7 V 8 F g 9 F f ↑ collision Calcul de h(j) - 1 = 1  case pleine Calcul de h(j) - 2 = 0  case pleine Calcul de h(j) - 3 + 10 = 9  case pleine Calcul de h(j) - 4 + 10 = 8  case pleine Calcul de h(j) - 5 + 10 = 7  case vide
  25. 25. 25 1. Essai linéaire: Exercice 1 (Question2. a): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 Après l’insertion de j Indice Vide enregistrement 0 F e 1 F b 2 F d 3 F c 4 V 5 F a 6 V 7 F j 8 F g 9 F f
  26. 26. 26 1. Essai linéaire: MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide 0 F e 1 F b 2 F d 3 F c 4 V 5 F a 6 V 7 F j 8 F g 9 F f Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 Adresse Primaire P P Secondaire P S P S La recherche de « k » (tel que h(k) = 2) s'arrête avec un échec dans la case vide d‘indice 6 la séquence de test est : 2, 1, 0, 9, 8, 7  Si on devait insérer « k », la donnée serait affectée à la case 6 (si c'est pas la dernière case vide).  La table est remplie quand le nombre d’éléments insérés égale à N-1  sacrifice d’une case vide
  27. 27. 27 1. Essai linéaire:  La recherche d’une donnée x se déroule comme suit: a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » de table de hachage contient la donné x alors la recherche est terminée. c. Sinon rechercher la donnée x dans les cases qui la précèdent : i-1, i-2, i-3,..., 0, N-1, N-2, …, jusqu'à trouver la donnée x ou une case vide. d. Si on s’arrête avec une case vide, cela signifie que la donnée n’existe pas. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  28. 28. 28 1. Essai linéaire: Exercice 2 (Question 1.a) MÉTHODES DE RÉSOLUTION DE COLLISIONS Type Tcase = Structure Donnée: TQQ Vide: booléen initialisé à vrai Fin Var TH: Tableau [0 .. N-1] de Tcase
  29. 29. 29 1. Essai linéaire: Exercice 2 (Question 1. b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure rechercher_TH_EL(TH: tableau de hachage, x: TQQ, Var i:entier, Var trouve : booléen) i H(x.clé) // calculer l’adresse primaire TQ (TH[i].vide = faux) et (TH[i] .donnée≠ x) faire DTQ ii-1 Si i<0 alors i i+N FTQ Si (TH[i]. Vide = faux) et (TH[i].donnée = x) alors trouve vrai Sinon trouve  faux
  30. 30. 30 1. Essai linéaire:  L’insertion d’une donnée x se déroule comme suit: a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » de table de hachage est vide alors insérer x dans cette case et la marquer comme non vide. c. Sinon, parcourir les cases qui la précèdent : i-1, i-2, i-3,..., 0, N-1, N-2, …, jusqu'à trouver une case vide (soit « j »). d. Insérer « x » dans la case « j » et la marquer comme non vide. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  31. 31. 31 1. Essai linéaire: Exercice 2 (Question 1. b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure insérer_TH_EL(Var TH: tableau de hachage, x: TQQ) Debut Si non TH_rempli (TH) alors // vérifier que le TH n’est pas rempli i H(x.clé) // calculer l’adresse primaire TQ (TH[i].vide = faux) faire DTQ ii-1 Si i<0 alors i i+N FTQ TH[i].donnée x TH[i].vide faux Fsi Fin Fonction TH_remplie( TH: tableau de hachage) : booléen Cpt 0 Pour i 0 à N-1 faire Si TH[i]. vide = vrai alors Cpt ++ Retourner (Cpt =1) // on sacrifie d’une case libre.
  32. 32. 32 1. Essai linéaire:  La suppression physique d'une donnée x, génère une case vide  Cette nouvelle case vide risque de rendre d'autres données inaccessibles.  Par exemple, si on supprime b en vidant la case 1, on perd du même coup la donnée f (h(f) = 2) car elle n'est plus accessible.  On doit alors faire des tests avant de vider une case MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide 0 F e 1 V b 2 F d 3 F c 4 V 5 F a 6 V 7 F j 8 F g 9 F f
  33. 33. 33 1. Essai linéaire:  Le principe de la suppression d'une donnée x est donc : a. Rechercher l'adresse i de x b. Parcourir toutes les cases qui la précèdent : j = i-1, i- 2, i-3,..., 0, N-1, N-2, …, jusqu’à trouver une case vide. Pour chaque case j, vérifier que sa donnée reste accessible si la case i sera vidée. c. Si toutes les cases j restent accessibles en vidant i, alors on vide la case i et on s'arrête MÉTHODES DE RÉSOLUTION DE COLLISIONS
  34. 34. 34 1. Essai linéaire:  Le principe de la suppression d'une donnée x est donc : d. Sinon, déplacer la case j dans la case i et tenter de vider son emplacement en testant les cases au dessus qui n'ont pas encore été testées. C'est le même principe qu'on vient d'appliquer pour la case i. MÉTHODES DE RÉSOLUTION DE COLLISIONS i j 0 N-1 i j 0 N-1
  35. 35. 35 1. Essai linéaire:  Par exemple, si on supprime b en vidant la case 1, On va décaler la donnée f (h(f) = 2) à la case 1 et, la donnée j (h(j) = 2) à la case 9. MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide 0 F e 1 F f 2 F d 3 F c 4 V 5 F a 6 V 7 V 8 F g 9 F j Indice Vide 0 F e 1 V b 2 F d 3 F c 4 V 5 F a 6 V 7 F j 8 F g 9 F f
  36. 36. 36 1. Essai linéaire: Exercice 2 (Question 1. b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure supprimer_TH_EL(Var TH: tableau de hachage, x: TQQ) Rechercher (TH, x, i, trouve) Si trouve = vrai alors j  i-1 Si j<0 alors jj+N TQ (T[j]. vide ≠ vrai) DTQ // calculer l’adresse primaire de la donnée j k  H(TH[j].donnée.clé) Si ((i>j) et (k ≥i ou k<j)) ou ((i<j) et (i≤k<j)) TH[i]T[ j]; ij jj-1 Si j<0 alors jj+N FTQ T[i].vide vrai i j 0 N-1 i j 0 Cas 2Cas 1 N-1
  37. 37. 37 1. Essai linéaire:  Un moyen simple consiste à faire une suppression logique, c'est à dire le positionnement d'un bit pour indiquer si la donnée a été effacée ou pas.  Chaque case renferme donc 2 bits :  Vide indiquant une case vide  Effacé indiquant un effacement logique (la case n'est pas vide) exemple: b est supprimée logiquement MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide Effacé donnée 0 F F e 1 F V b 2 F F d 3 F F c 4 V V 5 F F a 6 V V 7 F F j 8 F F g 9 F F f
  38. 38. 38 1. Essai linéaire:  Un moyen simple consiste à faire une suppression logique, c'est à dire le positionnement d'un bit qu'on rajoute au niveau des entrées de la table.  Pour récupérer l'espace perdu à cause des effacements logiques, on effectue des réorganisations périodiques. C.à.d. réinsérer les données non effacées dans une nouvelle table. MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide Effacé donnée 0 F F e 1 F V b 2 F F d 3 F F c 4 V V 5 F F a 6 V V 7 F F j 8 F F g 9 F F f
  39. 39. 39 1. Essai linéaire:  Un moyen simple consiste à faire une suppression logique, c'est à dire le positionnement d'un bit qu'on rajoute au niveau des entrées de la table.  Pour récupérer l'espace perdu à cause des effacements logiques, on effectue des réorganisations périodiques. C.à.d. réinsérer les données non effacées dans une nouvelle table. MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide Effacé donnée 0 F F e 1 F V b 2 F F d 3 F F c 4 V V 5 F F a 6 V V 7 F F j 8 F F g 9 F F f
  40. 40. 40 1. Essai linéaire: Exercice 2 (Question 2. a)  La recherche doit retourner vrai si (TH[i]. Effacé = faux) et (TH[i].donné = x) au lieu (TH[i]. Vide = faux) et (TH[i].donné = x) MÉTHODES DE RÉSOLUTION DE COLLISIONS Type Tcase = Structure Donnée: TQQ Vide: booléen initialisé à vrai Effacé: booléen initialisé à vrai Fin Var TH: Tableau [0 .. N-1] de Tcase
  41. 41. 41 1. Essai linéaire: Exercice 2 (Question 2. b)  L’insertion peut se faire dans une case effacée MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure insérer_TH_EL(Var TH: tableau de hachage, x: TQQ) Si non TH_rempli (TH) alors // vérifier que le TH n’est pas rempli i H(x.clé) // calculer l’adresse primaire TQ (TH[i].effacé = faux) faire DTQ ii-1 Si i<0 alors i i+N FTQ TH[i].donnée x TH[i].vide faux TH[i].effacéfaux
  42. 42. 42 1. Essai linéaire: Exercice 2 (Question 2. b)  La suppression consiste à positionner l’indicateur « effacé » à vrai MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure supprimer_TH_EL(Var TH: tableau de hachage, x: TQQ) Debut Rechercher_TH_EL (TH, x, i, trouve) Si trouve = vrai alors T[i].effacé vrai Fin
  43. 43. 43 1. Essai linéaire: Exercice 2 (Question 2. b)  La réorganisation consiste à réinsérer les données non effacées dans une nouvelle table. MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure réorganiser _TH(Var TH: Tableau de hachage) Var Tmp: Tableau de Hachage; i: entier Debut Pour i0 à N-1 faire Si (TH[i].effacé = faux) alors Insérer_TH (Tmp, TH[i].donné) //recopier le tableau Tmp dans TH Pour i0 à N-1 faire THi] Tmp[ [i] Fin
  44. 44. 44 2. Double Hachage :  Cette méthode est presque analogue à la méthode d’essai linéaire mais au lieu que la séquence soit linéaire, elle est construite par une autre fonction de hachage soit h’.  Soient h(x) la fonction utilisée pour le calcul de l'adresse primaire et h'(x) la seconde fonction de hachage qui calcule le pas de la séquence: h(x), h(x)-h'(x), h(x)-2h'(x), h(x)- 3h'(x), ...  Pour que cette séquence soit circulaire, on rajoute N au nouvel indice s’il est négatif. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  45. 45. 45 2. Double Hachage : Exercice 1 (Question2): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 h‘(x) 2 4 1 3 3 1 5 2 Indice Vide donné 0 V 1 V 2 V 3 V 4 V 5 V 6 V 7 V 8 V 9 V Après l’insertion de a, b et c Indice Vide donné 0 V 1 F b 2 V 3 F c 4 V 5 F a 6 V 7 V 8 V 9 V
  46. 46. 46 2. Double Hachage : Exercice 1 (Question2): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 h‘(x) 2 4 1 3 3 1 5 2 Indice Vide donné 0 V 1 F b 2 V 3 F c 4 V 5 F a 6 V 7 V 8 V 9 V ↑ collision Calcul de h(d) -h’(d) = 0  case vide
  47. 47. 47 2. Double Hachage : Exercice 1 (Question2): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 h‘(x) 2 4 1 3 3 1 5 2 Indice Vide donné 0 F d 1 F b 2 V 3 F c 4 V 5 F a 6 V 7 V 8 V 9 V ↑ collision Calcul de h(e) -h’(e) + 10 = 7  case vide
  48. 48. 48 2. Double Hachage : Exercice 1 (Question2): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 h‘(x) 2 4 1 3 3 1 5 2 Indice Vide donné 0 F d 1 F b 2 V 3 F c 4 V 5 F a 6 V 7 F e 8 V 9 V Après l’insertion de f et g Indice Vide donné 0 F d 1 F b 2 V f 3 F c 4 V 5 F a 6 V 7 F e 8 V g 9 V
  49. 49. 49 2. Double Hachage : Exercice 1 (Question2): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 h‘(x) 2 4 1 3 3 1 5 2 Indice Vide donné 0 F d 1 F b 2 V f 3 F c 4 V 5 F a 6 V 7 F e 8 V g 9 V ↑ collision Calcul de h(j) – h’(j) = 0  case pleine Calcul de h(j) - 2 h’(j) + 10= 8  case pleine Calcul de h(j) - 3 h’(j) + 10 = 6  case vide
  50. 50. 50 2. Double Hachage : Exercice 1 (Question2): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 h‘(x) 2 4 1 3 3 1 5 2 Indice Vide donné 0 F d 1 F b 2 V f 3 F c 4 V 5 F a 6 F j 7 F e 8 V g 9 V La recherche de « k » (tel que h(k) = 2 et h’(k) = 2) s'arrête avec un échec dans la case vide d‘indice 4 la séquence de test est : 2, 0, 8, 6  Si on devait insérer « k », la donnée serait affectée à la case 4 (si c'est pas la dernière case vide).  La table est remplie quand le nombre d’éléments insérés égale à N-1  sacrifice d’une case vide
  51. 51. 51 2. Double Hachage : Exercice 1 (Question2): MÉTHODES DE RÉSOLUTION DE COLLISIONS Enregistrement a b c d e f g j h (x) 5 1 3 3 0 2 8 2 h‘(x) 2 4 1 3 3 1 5 2 Indice Vide donné 0 F d 1 F b 2 V f 3 F c 4 V 5 F a 6 F j 7 F e 8 V g 9 V La recherche de « k » (tel que h(k) = 2 et h’(k) = 5) génère une boucle infinie la séquence de test est : 2, 7, 2, 7, 2, 7, 2, 7, ….. On s’arrête après avoir visité (N-1) cases. Pour que la couverture soit totale (passer par toutes les cases), il faut choisir la taille de la table N un nombre premier
  52. 52. 52 2. Double Hachage :  Le principe de la recherche est analogue à celui de l'essai linéaire. a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » de table de hachage contient la donné x alors la recherche est terminée. c. Sinon rechercher la donnée x dans les cases qui la précèdent : j= i-h'(x), i-2h'(x), i-3h'(x),…. [si j<0 alors j j+N] jusqu'à trouver la donnée x ou une case vide ou visiter N-1 cases. d. Si on s’arrête avec une case vide ou après avoir visité N-1 cases, cela signifie que la donnée n’existe pas. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  53. 53. 53 2. Double Hachage : Exercice 2 (Question 2. a) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure rechercher_TH_DH(TH: tableau de hachage, x: TQQ, Var i:entier, Var trouve : booléen) i h(x.clé) // calculer l’adresse primaire Cpt 0 // compter le nombre des cases visitées TQ (TH[i].vide = faux) et (TH[i] . donnée≠ x) et (Cpt < N-1) faire DTQ ii-h’(x) Si i<0 alors i i+N Cpt ++; FTQ Si (TH[i]. Vide = faux) et (TH[i].donné = x) alors trouve vrai Sinon trouve  faux
  54. 54. 54 2. Double Hachage :  L’insertion d’une donnée x se déroule comme suit: a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » de table de hachage est vide alors insérer x dans cette case et la marquer comme non vide. c. Sinon, parcourir les cases qui la précèdent : j= i-h'(x), i- 2h'(x), i-3h'(x),…. [si j<0 alors j j+N], jusqu'à trouver une case vide (soit « j ») ou visiter N-1 cases. d. Si on trouve une case vide alors insérer « x » dans la case « j » et la marquer comme non vide. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  55. 55. 55 2. Double Hachage : Exercice 2 (Question 2. a) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure insérer_TH_DH(Var TH: tableau de hachage, x: TQQ) Debut Si non TH_rempli (TH) alors // vérifier que le TH n’est pas rempli i h(x.clé) // calculer l’adresse primaire Cpt 0 // compter le nombre des cases visitées TQ (TH[i].vide = faux) et (Cpt < N-1) faire DTQ ii-h’(x.clé) Si i<0 alors i i+N Cpt ++; FTQ Si (TH[i].vide = vrai) alors // on a trouvé une case vide TH[i].donnée x TH[i].vide faux Fin
  56. 56. 56 2. Double Hachage :  Le principe de la suppression (logique et physique) est analogue à la méthode d’essai de linéaire.  La seule différence que dans la suppression physique, le pas de la séquence est calculé par la seconde fonction de hachage: j= i-h'(x), i-2h'(x), i-3h'(x),…. [si j<0 alors j j+N]. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  57. 57. 57 2. Double Hachage :  Exemple d’une suppression physique: supprimer la donnée « c » Cette suppression entraine le déplacement de la donnée « d » à la case 3 et la donnée « e » à la case 0 MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide donné 0 F d 1 F b 2 V f 3 F c 4 V 5 F a 6 F j 7 F e 8 V g 9 V Indice Vide donné 0 F e 1 F b 2 V f 3 F d 4 V 5 F a 6 F j 7 V 8 V g 9 V
  58. 58. 58 2. Double Hachage : Exercice 2 (Question 2. a) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure supprimer_TH_DH(Var TH: tableau de hachage, x: TQQ) Rechercher (TH, x, i, trouve) Si trouve = vrai alors j  i-h’(x.donnée.clé) Si j<0 alors jj+N TQ (T[j]. vide ≠ vrai) DTQ // calculer l’adresse primaire de la donnée j k  H(TH[j].donnée.clé) Si ((i>j) et (k ≥i ou k<j)) ou ((i<j) et (i≤k<j)) TH[i]T[ j]; ij jj-h’(x.donnée.clé) Si j<0 alors jj+N FTQ T[i].vide vrai i j 0 N-1 i j 0 Cas 2Cas 1 N-1
  59. 59. 59 3. Chaînage séparé :  Les données en débordement (en cas de collisions) sont stockés dans un espace non «adressable» par la fonction de hachage. Par exemple à l'extérieur de la table sous forme de Liste Linéaire Chaînée (LLC). MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide donné lien 0 F e Null 1 F b Null 2 F f 3 F c 4 V Null 5 F a Null 6 V Null 7 V Null 8 F g Null 9 V Null d Null j k Null h(f) = h(j) = h(k) = 2 h(c) = h(d) = 3  Le champ « lien » lie les données en cases primaires avec leurs synonymes en débordement.  Le nombre de données insérées peut dépasser la taille de la table (N)
  60. 60. 60 3. Chaînage séparé :  La recherche d’une donnée x se déroule comme suit: a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » de table de hachage contient la donné x alors la recherche est terminée. c. Sinon continuer la recherche séquentielle dans la liste « lien » MÉTHODES DE RÉSOLUTION DE COLLISIONS
  61. 61. 61 3. Chaînage séparé : Exercice 2 (Question 1.a) MÉTHODES DE RÉSOLUTION DE COLLISIONS Type Maillon = Structure Val: TQQ Suiv: * Maillon initialisé à NULL Fin Type Tcase = Structure Donnée: TQQ Lien : *Maillon Vide: booléen initialisé à vrai Fin Var TH: Tableau [0 .. N-1] de Tcase
  62. 62. 62 3. Chaînage séparé : Exercice 2 (Question 1.b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure rechercher_TH_CS(TH: tableau de hachage, x: TQQ): booléen i H(x.clé) // calculer l’adresse primaire Si TH[i].vide = faux alors Si TH[i].donnée = x alors retourner (vrai) Sinon Retourner (Rechercher_LLC(TH[i].lien, x)) Sinon retourner (faux)
  63. 63. 63 3. Chaînage séparé :  L’insertion d’une donnée x se déroule comme suit: a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » est vide alors insérer la donné dans cette case. c. Sinon insertion (au début) dans la liste associée à cette case MÉTHODES DE RÉSOLUTION DE COLLISIONS
  64. 64. 64 3. Chaînage séparé : Exercice 2 (Question 1.b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure insérer_TH_CS(Var TH: tableau de hachage, x: TQQ) i H(x.clé) // calculer l’adresse primaire Si TH[i].vide = vrai alors TH[i].donnée  x TH[i].Vide faux Sinon // insertion au debut de la liste Insérer_Debut_LLC(TH[i].Lien, x) FSI
  65. 65. 65 3. Chaînage séparé :  La suppression d’une donnée x se déroule comme suit: a. Rechercher la donné x dans la table de hachage b. Si x se trouve dans son adresse primaire (la donnée de la case h(x)) alors i. Si la liste « lien » n'est pas vide alors déplacer le premier élément de la liste dans la case h(x) (en écrasant x) ii. Sinon vider la case h(x) c. Sinon (x se trouve en débordement dans une liste) alors la supprimer de cette liste MÉTHODES DE RÉSOLUTION DE COLLISIONS
  66. 66. 66 3. Chaînage séparé : Exercice 2 (Question 1.b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure supprimer _TH_CS(Var TH: tableau de hachage, x: TQQ) Trouve Rechercher_TH_CS (TH, x); ih(x.clé) Si (trouve = vrai) alors Si TH[i].donné= x alors Si TH[i].Lien = Null alors TH[i].Vide vrai Sinon PTH[i].Lien TH[i].donnée  Valeur(P) TH[i].Lien suivant (P) Libérer (P) Sinon // supprimer x de la liste Supprimer_LLC(TH[i].Lien, x) FSI
  67. 67. 67 4. Chaînage interne :  Les données en débordement (en cas de collisions) sont stockés dans la table (dans le même espace « adressable » par la fonction) en gardant le chaînage entre les synonymes MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide donné lien 0 F e -1 1 F b -1 2 F f 6 3 F c 4 4 F d -1 5 F a -1 6 V j 7 7 V k -1 8 F g -1 9 V -1  Le champ « lien » lie les données en cases primaires avec leurs synonymes en débordement.  La table est remplie quand le nombre d’éléments insérés égale à N-1  sacrifice d’une case vide
  68. 68. 68 4. Chaînage interne :  Comme dans le chaînage séparée, la recherche d’une donnée x se déroule comme suit: a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » de table de hachage contient la donné x alors la recherche est terminée. c. Sinon continuer la recherche séquentielle dans la liste « lien » MÉTHODES DE RÉSOLUTION DE COLLISIONS
  69. 69. 69 4. Chaînage interne :  Comme dans le chaînage séparée, la recherche d’une donnée x se déroule comme suit: a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » de table de hachage contient la donné x alors la recherche est terminée. c. Sinon continuer la recherche séquentielle dans la liste « lien » MÉTHODES DE RÉSOLUTION DE COLLISIONS
  70. 70. 70 4. Chaînage interne :  L’insertion d’une donnée x se déroule comme suit: a. Calculer l’adresse primaire de x (soit i = h(x)) b. Si la case « i » est vide alors insérer la donné dans cette case. c. Sinon trouver une case vide, insérer la donnée dans cette case ensuite la chaine à la queue de liste de « i ». MÉTHODES DE RÉSOLUTION DE COLLISIONS
  71. 71. 71 4. Chaînage interne :  La suppression d’une donnée x se déroule comme suit: a. Rechercher l’adresse i de la donné, ainsi que son prédécesseur k dans la liste. b. Rechercher le successeur de i (soit j) où h(j) = i [son adresse primaire égale à i] c. Si un tel successeur existe alors on le déplace vers i et on tente de vider son emplacement (ij) d. Sinon (il n'y a pas de problèmes avec les successeurs), on vide la case i en mettant à jour son prédécesseur j pour qu’il pointe le successeur immédiat de i MÉTHODES DE RÉSOLUTION DE COLLISIONS
  72. 72. 72 4. Chaînage interne :  Les difficultés rencontrés dans cette méthode peuvent se résumer en deux points:  Insertion: rechercher la queue de la liste « i »  Suppression: garder le prédécesseur de « i » qui n’existe pas toujours (la première case n’a pas de prédécesseur)  La solution est d’utiliser une liste circulaire où la première case pointe la dernière case. MÉTHODES DE RÉSOLUTION DE COLLISIONS
  73. 73. 73 4. Chaînage interne :  Si le champs « lien » égale à -1 cela indique que la liste est vide.  Sinon il indique l’indice de la case suivante MÉTHODES DE RÉSOLUTION DE COLLISIONS Indice Vide donné lien 0 F e -1 1 F b -1 2 F f 6 3 F c 4 4 F d 3 5 F a -1 6 V j 7 7 V k 2 8 F g -1 9 V -1 Indice Vide donné lien 0 F e -1 1 F b -1 2 F f 6 3 F c 4 4 F d -1 5 F a -1 6 V j 7 7 V k -1 8 F g -1 9 V -1
  74. 74. 74 4. Chaînage interne : Exercice 2 (Question 1.a) MÉTHODES DE RÉSOLUTION DE COLLISIONS Type Tcase = Structure Donnée: TQQ Lien : entier initialisé à -1 Vide: booléen initialisé à vrai Fin Var TH: Tableau [0 .. N-1] de Tcase
  75. 75. 75 4. Chaînage interne : Exercice 2 (Question 1.b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure rechercher_TH_CI(TH: tableau de hachage, x: TQQ): booléen i H(x.clé) // calculer l’adresse primaire Si TH[i].vide = faux alors Si TH[i].donnée = x alors retourner (vrai) Sinon jTH[i].lien TQ (j≠ -1) et (j ≠ i ) faire Si TH[j].donnée = x alors retourner (vrai) Sinon j  TH[i].lien Sinon retourner (faux)
  76. 76. 76 3. Chaînage séparé : Exercice 2 (Question 1.b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure insérer_TH_CS(Var TH: tableau de hachage, x: TQQ) i H(x.clé) // calculer l’adresse primaire Si TH[i].vide = vrai alors TH[i].donnée  x TH[i].Vide faux Sinon // insertion au debut de la liste k  trouver_case_vide(TH) Si (k ≠ -1) alors TH[k].donnée  x TH[k].Vide faux Si TH[i].lien = -1 alors TH[k].lien  i ; Sinon TH[k].lien TH[i].lien; TH[i].lien k FSI
  77. 77. 77 4. Chaînage interne :  La suppression d’une donnée x se déroule comme suit: a. Rechercher l’adresse i de la donné, ainsi que son prédécesseur k dans la liste. b. Rechercher le successeur de i (soit j) où h(j) = i [son adresse primaire égale à i] c. Si un tel successeur existe alors on le déplace vers i et on tente de vider son emplacement (ij) d. Sinon (il n'y a pas de problèmes avec les successeurs), on vide la case i en mettant à jour son prédécesseur j pour qu’il pointe le successeur immédiat de i MÉTHODES DE RÉSOLUTION DE COLLISIONS
  78. 78. 78 4. Chaînage interne : Exercice 2 (Question 1.b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Procédure supprimer _TH_CS(Var TH: tableau de hachage, x: TQQ) Trouve Rechercher_TH_CS (TH, x); ih(x.clé) Si (trouve = vrai) alors Si TH[i].Lien = -1 alors // cela implique TH[i].donné= x TH[i].Vide vrai Sinon // rechercher le prédécesseur k et le premier successeur j tel que h(j) = i Répéter lTH[i].Lien existe  faux TQ (l≠ i) faire Si ((h(TH[l].donné.clé) = i) et (non existe) alors jl; existe vrai k  l; l  TH[l].lien FTQ Si existe alors TH [i] TH[j]; ij Sinon ……
  79. 79. 79 4. Chaînage interne : Exercice 2 (Question 1.b) MÉTHODES DE RÉSOLUTION DE COLLISIONS Sinon // rechercher le prédécesseur k et le premier successeur j tel que h(j) = i Répéter lTH[i].Lien existe  faux TQ (l≠ i) faire Si ((h(TH[l].donné.clé) = i) et (non existe) alors jl; existe vrai k  l; l  TH[l].lien FTQ Si existe alors TH [i] TH[j]; ij Sinon TH[i].vide vrai Si TH[i].lien = k alors TH[k].lien -1 Sinon TH[k].lien TH[i].lien Jusqu’à non existe FSI
  80. 80. 80  La figure suivante résume les courbes des nombres moyens de tests pour une recherche par rapport au chargement de la table (M/N, M étant le nombre des éléments présents dans la table) pour les quatre méthodes présentées. MÉTHODES DE RÉSOLUTION DE COLLISIONS L : essai linéaire D : double hachage C : chaînage interne S : chaînage séparé
  81. 81. 81  Comme la figure le montre, les méthodes de chaînage semblent les meilleures. Cependant, leur inconvénient réside dans le champ additionnel représentant les liens. MÉTHODES DE RÉSOLUTION DE COLLISIONS L : essai linéaire D : double hachage C : chaînage interne S : chaînage séparé
  82. 82. 82  Pour l'essai linéaire par exemple, même quand la table est remplie à 90%, le nombre de tests est au voisinage de 5.  Pour avoir un temps rapide (de l'ordre de 1), on convient de ne pas dépasser un chargement de 70%. MÉTHODES DE RÉSOLUTION DE COLLISIONS L : essai linéaire D : double hachage C : chaînage interne S : chaînage séparé
  83. 83. 83  Soit une table de N cases, et on aimerait insérer r données. Le pourcentage de remplissage (la densité) est donc: d = r / N  Soit P(x) la probabilité que x données parmi r soient « hachées » vers la même case  La fonction de Poisson en est une bonne approximation, en supposant une fonction de hachage uniforme ESTIMATION DES DÉBORDEMENTS
  84. 84. 84  La fonction de Poisson en est une bonne approximation, en supposant une fonction de hachage uniforme  N*P(x) est donc une estimation du nombre de cases ayant été choisies x fois durant l'insertion des r données dans la table  Le nombre total de données en débordement est alors estimé à : ESTIMATION DES DÉBORDEMENTS
  85. 85. 85  Exemple numérique:  Lors de l'insertion de 1000 données dans une table de 1000 cases (densité = 1), on estime que :  N.P(0) = 368 cases ne recevront aucune données  N.P(1) = 368 cases auront été choisies 1 seule fois  N.P(2) = 184 cases auront été choisies 2 fois  N.P(3) = 61 cases auront été choisies 3 fois  N.P(4) = 15 cases auront été choisies 4 fois  N.P(5) = 3 cases auront été choisies 5 fois  N.P(6) = 0 cases auront été choisies 6 fois ESTIMATION DES DÉBORDEMENTS
  86. 86. 86  Exemple numérique:  Le nombre de données en débordement est proche de : 184 + 2*61 + 3*15 + 4*3 = 363 soit 36% des données contre 631 (368 + 184 + 61 + 15 + 3) données dans leurs adresses primaires  Pour une densité = 0.5, (ex r = 500 et N = 1000), on aurait eu 21% de données en débordement et 79% de données rangées dans leur adresse primaire. ESTIMATION DES DÉBORDEMENTS
  87. 87. 87  Les méthodes de hachage donnent des résultats excellents en moyenne O(1), mais lamentables dans le pire cas O(n), car il n'est pas possible d'éviter les collisions.  En particulier, le choix de la fonction de hachage est fondamental.  Il existe plusieurs façons de réduire les collisions :  trouver une fonction de hachage qui distribue bien les données c'est a dire de façon aléatoire.  augmenter l'espace des adresses possibles.  mettre plus d'une donnée par adresse possible (si on accepte par exemple b données par adresse donc d = r/(b*N). CONCLUSION
  88. 88. SOURCES DE CE COURS  N. EL-ALLIA , Cours d’Algorithmique et Structures de données dynamiques, Ecole nationale Supérieure d’Informatique (ESI), 2014.  Djamel Eddine ZEGOUR, Cours de Structures de Données, Ecole nationale Supérieure d’Informatique (ESI), Disponible sur http://zegour.esi.dz/Cours/Cours_sdd.htm  W. K. Hidouci, Cours Structures De Données et Fichiers, École nationale Supérieure d’Informatique, Disponible sur hidouci.esi.dz/algo/ 88

×