Conception de structures de donn´ ees
Cours 8 Tables de hachage
3 juin 2013
Struct 1/24
Tables d’association, tables de hachage
Struct 2/24
Tables Collisions Implantation
Table d’association
Besoin : un structure de donn´ees contenant des informations identifiables (index´ees) `a partir de cl´es (pas des entiers).
Exemples : annuaire, dictionnaire, bases de donn´ees,...
Contrainte :la structure doit ˆetre dynamique; on veut pouvoir ajouter ou supprimer des ´el´ements d’informations (rapidement).
Type abstrait : table d’association qui offre les op´erations suivantes :
Trouver l’information associ´ee `a une cl´e donn´ee.
Ajouter une nouvelle association (paire) entre une cl´e et une information.
S’il existe d´ej`a une information associ´ee `a la cl´e dans la table, alors la nouvelle information remplace l’ancienne.
Sinon, une nouvelle association est ajout´ee `a la table.
B Jamais 2 informations distinctes associ´ees `a la mˆeme cl´e.
Retirer une cl´e de la table (avec l’information associ´ee).
Tables Collisions Implantation
Graphiquement
Univers des clés possibles
clés réelles
Données
k1
k2
k3 k4
k5
d1 d2
d3
d4 d5
Exemple
Compter les mots dans un texte (Le Corbeau et le Renard) :
Univers des clés possibles
clés réelles
Données
corbeau
le bec
4 un
5
7 renard
2
2
...
...
Struct 5/24
Complexit´ es compar´ ees
Il est possible d’implanter facilement une table d’association en utilisant un tableau, une liste ou un arbre dont les ´el´ements sont des paires {cl´e, donn´ee}.
Complexit´e
Op´eration tableau tab. tri´e DList arbre (AVL) Chercher O(n) O(logn) O(n) O(logn)
Ins´erer O(n) O(n) O(n) O(logn)
Supprimer O(n) O(n) O(n) O(logn) Taille ? limit´ee limit´ee illimit´ee illimit´ee Complexit´es des diff´erentes implantations possibles.
Struct 6/24
Tables Collisions Implantation
Adressage direct
Conditions id´eales de r´ealisation d’une table d’association : Les cl´es sont des entiers positifs ;
Il n’y a qu’un petit nombre de cl´es possibles ; Il n’y apas trop des “trous” entre les cl´es.
En r´esum´e : l’ensemble (univers) U de toutes les cl´es possibles est un petit intervalle entier : {0, . . . , n−1}.
Il suffit alors d’utiliser un tableau de taille n(les cl´es sont les indices des cases et les donn´ees sont stock´ees directement).
Exemple : compter le nombre d’occ. descaract`eres dans un texte : Les cl´es sont des entiers dans l’intervalle {0, . . . ,127};
La donn´ee associ´ee `a une cl´e est le nombre d’apparition de la lettre dont le code ASCII est la cl´e.
Tables Collisions Implantation
Exemple d’adressage direct
Compter les lettres dans un texte (The Raven and the Fox) :
Univers des clés possibles
clés réelles
Données
0
a b c d e 25 7 15 12 60 97 98 99 100 101 0
127 98 97
99 100
101
127
Table de hachage
Bien sˆur, il est tr`es souvent impossible d’utiliser l’adressage direct. Par exemple, comment faire si l’universU des cl´es possibles est l’ensemble des mots de la langue anglaise ?
L’id´ee est d’essayer de se ramener au cas de l’adressage direct ! D’abord, il faut d´eterminer un entier m pas trop grand (de l’ordre du nombre de donn´ees `a stocker), qui sera la taille de la table de hachage T.
Ensuite, on choisitune fonction de hachage h :U → {0, . . . , m−1}.
Une donn´ee de cl´ek est plac´ee dans la case T[h(k)]
(et non pas T[k]).
Exemple : pour compter les mots d’un texte, on peut choisir comme fonction de hachage la longueur des mots et comme taille de table le nombre de mots du texte.
Struct 9/24
Exemple de table de hachage
Compter les mots dans un texte (The Raven and the Fox) :
Univers des clés possibles
clés réelles
Données
corbeau
le bec
un renard
...
0 1 2 3 4 5 6 7 8 9 10
4 5 ou 7?
2
2
Probl`eme : collisions possibles ! ! !
Importance de la r´epartition des cl´es dans la table.
Struct 10/24
Tables Collisions Implantation
Quelques remarques sur les collisions
Le cas id´eal : aucune collision possible. C¸ a suppose que la table est suffisamment grande : m≥ |U|,
les valeurs de hachage sont bien r´eparties dans l’ensemble {0, . . . , m−1}.
Dans ce cas l`a, en supposant que le temps de calcul de la fonction de hachage est constant, les 3 op´erations (acc`es, ajout, suppression) ont une complexit´e O(1) dans le pire des cas.
La r´ealit´e :
Le plus souvent m <|U|et donc on ne peut ´eviter les collisions (par principe des tiroirs) ;
La complexit´e des op´erations d´epend du nombre de collisions : il faut donc essayer de limiter les collisions.
Il faut bien choisir la taillem.
La fonction h doit “bien r´epartir” les cl´es dans la table.
Tables Collisions Implantation
Importance du choix de la fonction de hachage
6
= fonctions de hachage pourU =/usr/share/dict/words,m= 1000.
Importance du choix de la taille de la table
Struct 13/24
Importance du choix de la taille de la table - 2
h(c0c1. . . cn) = (c0+ 128×c1+ 1282×c2+· · ·+ 128n×cn) %lg lg est la taille de la table de hachage ;
`
a gauche lg = 997 ;
`
a droitelg = 1024 ;
Struct 14/24
Tables Collisions Implantation
Gestion des collisions
Tables Collisions Implantation
R´ esolution des collisions par chaˆınage
On peut g´erer les collisions parchaˆınage : toutes les donn´ees dont les cl´es ont lamˆeme valeur de hachagesontstock´ees dans une liste.
Les cases de la table t sont initialis´ees avec des listes vides ; Trouver (ou supprimer) la cl´ek : on parcourt la liste t[h(k)] ; Ajouter la cl´e k : on l’ins`ere au d´ebut de la liste t[h(k)] ; Si n´ecessaire, d’abord supprimer l’ancienne paire dont la cl´e est k.
Rmq : les ´el´ements de la tablet sont donc des listes d’association.
BDans le pire des cas, les n cl´es sont hach´ees dans la mˆeme case ; on se ram`ene `a une unique liste d’association :
Ajout, acc`es, suppression : O(n)
En r´ealit´e, avec une bonne fonction de hachage, les listes restent de petite taille et les 3 op´erations restent tr`es performantes.
R´ esolution des collisions par chaˆınage
Univers des clés possibles
clés réelles
k1 k2
k4 k5
Données
k1 5 k2 46
0 1 2 3 4 5 6 7
k3 8 k6 5
k5 12
k4 74 k7 11 k3
k7 k6
k8
k8 5
Struct 17/24
R´ esolution des collisions par adressage ouvert
On peut g´erer les collisions paradressage ouvert : si une case est d´ej`a remplie, la cl´e `a ins´erer est stock´ee dans une autre case de la table. On n’utilise pas d’espace m´emoire annexe.
Ajouter la cl´e k (si elle est d´ej`a pr´esente, la supprimer) : d’abord tester la case d’indiceh(k),
puis, si cette case est d´ej`a occup´ee, chercher la prochaine case vide en suivant une s´equence d’indices pr´ed´efinie.
Trouver la cl´e k :
on cherche dans t[h(k)],
puis, si cette case estd´ej`a occup´ee par une cl´e diff´erente, on suit la mˆeme s´equence que pour l’ajout d’une cl´e jusqu’`a trouverk ou une case vide(si la cl´ek n’est pas dans la table).
Supprimer la cl´ek : comme pour la recherche. Par contre, il fautlaisser un marqueurdans une case d’o`u l’on retire une cl´e.
BDans le pire cas, toutes les op´erations sont enO(n), mais avec de bonnes fonctions et une table assez grande, les 3 op´erations sont efficaces.
Struct 18/24
Tables Collisions Implantation
Sondage lin´ eaire
Sondage lin´eaire : les sauts sont proportionnels au nombre d’essais.
h(k, i) =h(k) +i mod m
15 82 19 21 33 13 11
28 58
0 1 2 3 4 5 6 7 8 ... m-2 m-1
15 82 19 27 21 33 13 11
28 58
0 1 2 3 4 5 6 7 8 ... m-2 m-1
h(27)=2 27
15 82 19 21 33 13 11
28 12 58
0 1 2 3 4 5 6 7 8 ... m-2 m-1
12
h(12)=m-3 27
Probl`eme : ph´enom`ene de grappes
Tables Collisions Implantation
Sondage quadratique, hachage double
Sondage quadratique : les sauts sont proportionnels aucarr´e du nombre d’essais.
h(k, i) =h(k) +c1×i+c2×i2 mod m
Probl`eme : sondages identiques pour des cl´es qui ont la mˆeme valeur de hachage.
Hachage double : les sauts sont calcul´es avec une 2e fonction de hachage. En choisissant bien les fonctions, on obtient des sauts qui semblent al´eatoires (c’est la meilleure m´ethode).
h(k, i) =h(k) +i×h2(k) mod m
Implantation en C
Struct 21/24
Type HashTable
typedef char *Key;
typedef int Value;
typedef struct{
Key k;
Value v;
}Element; // une paire: (cl´e, donn´ee)
typedef struct{
Element *tab; /* ou alors: Mlist *tab; */
int lg;
int (*f)(Key, int); /* fonction de hachage */
}HashTable;
Struct 22/24
Tables Collisions Implantation
Fonctions associ´ ees
int hashFunction(Key s, int mod) ...
HashTable makeHashTable(int lg, int (*f)(Key, int));
Element accessH(Key s, HashTable t); // recherche Element deleteH(Key s, HashTable *t); // suppression void addH(Key s, Value v, HashTable *t); // ajout
List listElements(HashTable t);
void hashList(List l, HashTable *t);
Tables Collisions Implantation
Glossaire
Donn´ee : information `a stocker.
Cl´e : identifiant d’une donn´ee.
Univers des cl´es : ensembles de toutes les cl´es possibles.
Paire: couple (cl´e, donn´ee).
Structure de donn´ees dynamique : structure de donn´ees permet- tant de stocker des informations qui ´evoluent dans le temps.
Table d’association : table qui permet de stocker des donn´ees auxquelles ont acc`ede par leur cl´es.
Fonction de hachage : fonction qui associe un indice entier positif `a une cl´e.
Valeur de hachage (d’une cl´e) : valeur de la fonction de hachage.
Table de hachage : table d’association qui utilise une fonction de hachage pour d´eterminer l’indice de la case o`u stocker une cl´e.
Collision : quand 2 cl´es ont les mˆemes valeurs de hachage.