Chapitre V. Tables de hachage Adressage direct et dispersé Tables de hachage
Tables de hachage Adressage direct Supposons un ensemble dynamique des éléments munis des clés. Les clés sont prises dans l’univers U={0,1,…m-1}. Deux éléments ne peuvent pas partager la même clé. Pour représenter l’ensemble dynamique, on utilise un tableau « table à adressage direct » T[0, …,m-1] : - Chaque position correspond à une clé dans l’univers U.
Tables d’adressage direct données clé U 3 1 1 K clés réelles 1 2 2 2 7 4 3 5 4 4 6 5 6 La cellule T[k] pointe sur l’élément d’ensemble ayant pour clé k Si l’ensemble ne contient aucun élément de clé k alors T[k]=nil 7 7
Adressage direct Les opérations de recherche, de suppression, d’insertion sont de O(1) Rechercher (T,k) Retourner T[k] Insérer(T,x) T[clé(x)]:=x Supprimer(T,x) T[clé(x)]:=nil Exemple : stockage des données dans un tableau T[0,…,M] des entiers. nil= -1
Adressage direct Inconvénients : 1)si card(K)<<card(U), alors la majeure partie de T est allouée inutilement. 2) Si card (U) est très grand – il est difficile de maintenir physiquement T[0, …, card(U)] Exemple : nombre de mots de la langue française ayant 5 caractères. Table de hachage.
Table de hachage(1) Fonction d’hachage : associe à chaque clé un entier compris entre 0 et m-1 Pour tout clé x, h(x) appelée valeur de hachage primaire, donne l’indice de la place de x dans un tableau T de m éléments. L’objectif : répartition uniforme, en terme de probabilité :
Fonctions de hachage(1) Hachage par division Exemple : K={1,8,4,7,49}, m=7 49 7 1 2 3 4 5 6 8 1 collision primaire : deux clés sont hachées dans la même case collision modulo : 4 mais
Collisions primaires Exemple : Si m est paire (taille de tableau), toutes les clés paires vont dans des indices paires du tableau et toutes les clés impaires – dans les indices impaires. Si la répartition des clés selon leur parité n’est pas uniforme – le remplissage n’est pas uniforme, les collisions primaires sont plus probables Choix de m : nombre premier.
Fonctions de hachage (2) Hachage par multiplication. Etant donnée un nombre réel signifie qu’on garde la partie décimale La taille de tableau est sans importance, mais La valeur de est importante Exemple :
Méthodes de résolution des collisions Méthode indirectes – méthodes par chainage U K3 K clés réelles K0 K1 K4 K1 K2 K7 K4 K5 clé K6 K2 K7
Méthodes par chaînage Les opérations de recherche, de suppression, d’insertion Rechercher (T,k) Recherche un élément de clé k dans la liste T[h(k)] Insérer(T,x) Insère x en tête de la liste T[h(clé(x))] Supprimer(T,x) Supprime x de la liste T[h(clé(x))]
Méthodes par chaînage(2) Analyse de complexité Le temps l’exécution de l’insertion O(1) dans le pire de cas (insertion dans la tête). Recherche et suppression : complexité de la recherche séquentielle dans les listes Facteur de remplissage - nombre moyen des éléments dans chaque liste Dans le cas de hachage uniforme simple (chaque élément a la même probabilité d’être haché dans la même case), une recherche négative prend en moyenne un temps en
Méthodes directes(1) Principe : les données sont rangées dans le tableau – même et non pas dans des listes dynamiques. Résolution des collisions par calcul à l’intérieur du tableau. Principe des essais successifs Algorithme Essai 1 : indice(x)= h(x) – hachage primaire Si collision alors essai2(x) Si collision alors essai3(x) etc.. Jusqu’à épuiser toutes les possibilités.
Méthodes directes(2) Hachage linéaire : Si il y a une collision à l’indice v on essaie la case d’indice v+1,… Si on est à la fin du tableau (v=m), on recommence au début Fin de placement : soit on a trouvé une case vide soit les m essai ont été infructueux.
Hachage linéaire Soient les éléments : e1,e2,e3,e4,e5,e6,e7,e8,e9 1 2 3 4 5 6 e8 Soient les éléments : e1,e2,e3,e4,e5,e6,e7,e8,e9 leurs valeurs de hachage : 6, 4, 7, 4, 8, 2, 5, 9, 8 e9 e6 e2 e4 e1 7 e3 8 e5 e7 9
Hachage linéaire Fonction Rechercher_HL(x:Element, t: tab): entier Var i, v : entiers; trouve : booléen Début i:=1,v:=h(x) Si vide (T,v) alors retourner -1; sinon Si T[v]=x alors retourner v; i:=1, trouve := faux; TQ (trouve=faux et i<m et vide(T,v)=faux) …..{ Complétez!} FTQ FSi Si trouve=vrai alors retourner V; sinon retourner -1; Fin Rechercher_HL