Structures de données IFT-10541 Abder Alikacem Les tables de dispersion Résumé Édition septembre 2009 Département d’informatique et de génie logiciel
Synthèse L’adressage associatif Tables de dispersion espace d’adressage virtuel espace d’adressage réel L’adressage associatif Tables de dispersion Fonctions de dispersion Résolution de conflits Listes de collisions
Synthèse Tables de dispersion L’adressage associatif Placer une information dans une structure en fonction d'une partie de cette information: la clé de recherche . Tables de dispersion Replier l’espace des données Accès par calcul: h, fonctions de dispersion h n’est pas injective: collisions! Fonctions de dispersion : h facile (rapide) à calculer Dispersion uniforme vers l’espace d’adressage réel Accepter les premières collisions lorsque le facteur de charge=70% Résolution de conflits Chaînage externe (avec ou sans « buckets »). Désavantages : Espace mémoire requis Temps d’accès Adressage ouvert…
Synthèse Si les collisions sont concentrées aux mêmes endroits : on perd de l’espace dans la table temps d ’accès à l’information Pourquoi aller à l’extérieur de la table s’il reste de la place dans la table? Solution #1: chaînage dans la table Solution#2: résolution des collisions par calcul, redispersion Fonctions de redispersion constantes Problème du regroupement primaire: partage des listes de collisions Fonctions de redispersion quadratiques, aléatoires.. Le regroupement secondaire: h(el1) = h(el2) 1 même chaîne! départager les chaînes de collisions de el1 et el2 (r0 = 0, r1, r2, r3, r4, r5, ..., rm-1) une permutation aléatoire des adresses de la table propre à l’élément recherché (ou à insérer). p(eli) = rj-1,eli (où j est l’itération et eli = « seed ») « double hashing » h1(el1) = i (= h1(el2)) h2(el1) = k (≠ h2(el2)) p(el1) = (j-1)*k (où j est l’itération)
Problème : listes de collisions Structure d’arbre : O(log n) pour la recherche et les mises à jour (incluant rebalancements) Table de dispersion : de O(1) à O(n) pour la recherche dépend de la longueur des listes de collisions de la charge (densité) de la table de la fonction de dispersion de la politique de prise en compte des collisions des regroupements de listes de collisions
Problème : listes de collisions Regroupement des listes de collisions problème de l’adressage ouvert !!! regroupement primaire regroupement secondaire
Solutions (1) Maintenir les listes de collisions triées : par ordre des clés par ordre de fréquence d’accès Quels en sont les problèmes pour : le chaînage externe : le chaînage par « buckets » : l’adressage ouvert :
Solutions (1) Maintenir les listes de collisions triées : par ordre des clés par ordre de fréquence d’accès Quels en sont les problèmes pour : le chaînage externe : insertions + longues le chaînage par «buckets» : l’adressage ouvert :
Solutions (1) Maintenir les listes de collisions triées : par ordre des clés par ordre de fréquence d’accès Quels en sont les problèmes pour : le chaînage externe : insertions + longues le chaînage par « buckets » : réorganisation de plusieurs (?) secteurs l’adressage ouvert :
Solutions (1) Maintenir les listes de collisions triées : par ordre des clés par ordre de fréquence d’accès Quels en sont les problèmes pour : le chaînage externe : insertions + longues le chaînage par « buckets » : réorganisation de plusieurs (?) secteurs l’adressage ouvert : effet Domino
Solutions (2) Connaître la fin des listes de collisions : utilisation d’un « pass bit » à 1 lorsque l’élément n’est pas le dernier à 0 sinon
Exemple : « pass bit » M 0 Y 0 0 0 S 1 Q 0 G 0 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6 M 0 Y 0 0 7 8 9 10 0 S 1 Q 0 G 0 0 0
Exemple : « pass bit » M 0 Y 0 0 0 S 1 Q 0 G 1 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5 M 0 Y 0 0 7 8 9 10 0 S 1 Q 0 G 1 0 0
Exemple : « pass bit » M 0 Y 0 0 0 S 1 Q 1 G 1 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 M 0 Y 0 0 7 8 9 10 0 S 1 Q 1 G 1 0 0
Exemple : « pass bit » M 0 Y 0 0 R 0 S 1 Q 1 G 1 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 M 0 Y 0 0 7 8 9 10 R 0 S 1 Q 1 G 1 0 0
Exemple : « pass bit » M 0 Y 0 0 R 0 S 1 Q 1 G 1 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 + : Z26 3 M 0 Y 0 0 7 8 9 10 R 0 S 1 Q 1 G 1 0 0
Exemple : « pass bit » M 0 Y 0 Z 0 R 0 S 1 Q 1 G 1 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 + : Z26 3 M 0 Y 0 Z 0 7 8 9 10 R 0 S 1 Q 1 G 1 0 0
Exemple : « pass bit » M 0 Y 0 Z 0 R 0 S 1 Q 1 G 1 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 + : Z26 3 + : S19 7 M 0 Y 0 Z 0 7 8 9 10 R 0 S 1 Q 1 G 1 0 0
Exemple : « pass bit » M 0 Y 0 Z 0 R 0 S 1 Q 1 G 1 S 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 + : Z26 3 + : S19 7 M 0 Y 0 Z 0 7 8 9 10 R 0 S 1 Q 1 G 1 S 0 0
Exemple : « pass bit » M 0 Y 0 Z 0 R 0 S 1 Q 1 G 1 S 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 + : Z26 3 + : S19 7 rechercher : P16 4 M 0 Y 0 Z 0 7 8 9 10 R 0 S 1 Q 1 G 1 S 0 0
Exemple : « pass bit » M 0 Y 0 Z 0 R 0 S 1 Q 1 G 1 S 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 + : Z26 3 + : S19 7 rechercher : P16 4 rechercher : R18 6, 5, 4 M 0 Y 0 Z 0 7 8 9 10 R 0 S 1 Q 1 G 1 S 0 0
Exemple : « pass bit » M 0 Y 0 Z 0 R 0 S 1 Q 1 G 1 S 0 0 i i - p(el) info pass bit 1 2 3 4 5 6 i i - p(el) si i < 0 alors i i + m p(el) = 1 pour tout élément el + : M13, Y25, G7, Q17 + : R18 6, 5, 4 + : Z26 3 + : S19 7 rechercher : P16 4 rechercher : R18 6, 5, 4 rechercher : H8 7 M 0 Y 0 Z 0 7 8 9 10 R 0 S 1 Q 1 G 1 S 0 0
Opérations Recherche O(1) si collisions bien gérées Insertion recherche + gestion des collisions : O(recherche) Enlèvement (chaînage externe) listes de collisions externes gestion de listes chaînées gestion de tableaux d’éléments Enlèvement (adressage ouvert) listes de collisions entremêlées on ne peut pas ôter les éléments de la table + bit de présence/absence + reconstruction de la table de dispersion
Index et tables de dispersion Idée générale Deux fichiers sont utilisés. Le premier contient la table de dispersion qui donne la relation entre le résultat de la fonction de dispersement et la position des enregistrements dans le fichier. Ce fichier est appelé un index. Le deuxième renferme la base de données, ordonnée de façon logique.
Fichier d'index = Table de dispersion Exemple Fichier d'index = Table de dispersion Fichier principal Clé LienI LienE {27, "bleu"} {18, "blanc"} {29, "rouge"} {28, "noir"} {39, "vert"} {13, "gris"} {16, "mauve"} {42, "cyan"} {17, "rose"} 1 2 3 4 5 6 7 8 9 10 1 13 -1 5 2 3 17 -1 8 4 42 3 7 5 27 8 0 28 9 3 6 18 10 1 7 8 16 -1 6 39 4 4 9 29 -1 2 10
Résumé des complexités Complexité en moyenne Recherche Insertion Retrait Méthode Séquentielle O(N/2) O(1) O(N) Dichotomie O(logN) Arbre binaire de recherche "Haching" (dispersion)
Résumé des complexités (suite) Complexité au pire Recherche Insertion Retrait Méthode Séquentielle O(N) O(1) Dichotomie O(logN) Arbres binaires "Hashing" (dispersion)