tables d’adressage dispersÉ (hash tables; tables de hachage)

22
TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

Upload: chava

Post on 23-Jan-2016

122 views

Category:

Documents


0 download

DESCRIPTION

TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE). OBJECTIFS. Comprendre le fonctionnement et l’implantation des tables d’adressage dispersé (hash tables). Être en mesure de pouvoir programmer des fonctions pour tables d’adressage dispersé. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

TABLES D’ADRESSAGE DISPERSÉ

(HASH TABLES; TABLES DE HACHAGE)

Page 2: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 2

OBJECTIFS• Comprendre le fonctionnement et

l’implantation des tables d’adressage dispersé (hash tables).

• Être en mesure de pouvoir programmer des fonctions pour tables d’adressage dispersé.

• Être en mesure d’utiliser et d’implanter les dictionnaires et les ensembles avec des tables d’adressage dispersé.

Page 3: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 3

CODES

• CBHT.java

Page 4: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 4

Tables d’adressage dispersé (Hash Tables)

• Le BST possède des opérations en temps moyen dans O(log N), pour gérer N éléments dans une collection.

• L’adressage dispersé est utilisé pour trouver rapidement des éléments d’une collection sans faire de recherche linéaire. En fait, on vise des opérations d’insertion, de suppression et de recherche dans O(1).

• Une fonction d’adressage dispersé calcule une valeur entière (un index) pour tout objet dans la table.

• Une bonne fonction d’adressage dispersé minimise les collisions, c’est-à-dire des index identiques pour des objets différents.

• En java, pour calculer l’index (hash code) d’un objet x :

int h = x.hashcode();

Page 5: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 5

Une fonction d’adressage dispersé pour des mots…

26 lettres

hashcode( mot ) = rang de la 1ère lettre

A: 0B: 1…Z:25

Problème : plusieurs mots commencent par la même lettre impliquant une distribution non uniforme.

Page 6: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 6

Une fonction d’adressage dispersé pour des mots

On pourrait aussi additionner la valeur ASCII des lettres du mot modulo M, où M est la taille de la table.

C’est un meilleur choix car la distribution est meilleure (plus uniforme).

Page 7: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 7

Hash codeclasse de x x.hashcode( )Date ms/232 xor ms % 232

ms depuis 01-01-1970Integer valeur de xList Somme des hash code

des éléments de la listeSet Somme des hash code

des éléments du setString Somme des caractères de

de la chaîne.

Page 8: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 8

Implantation simplePour faire une implantation, il faut :

• Une fonction de hashage pour les objets à traiter.

• Une structure de données pour stocker les objets, par exemple un tableau.

• Utiliser comme index du tableau des objets la valeur de hachage retournée par hashcode.

Pour tester la présence d’un objet

• Calculer son index à l’aide de hashcode.

• Vérifier si la position à cet index dans le tableau est occupée.

Page 9: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 9

Exemple fictif

nom Hashcode

Abdelmajid 20998

Adam 60032

Ève 3445

Harold 8932

Jacques 498723

Katherine 43921

Luc 987943

Ratiba 1109921

Page 10: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 10

Implantation dans un tableau... …

Ève 3445

... …

Harold 8932

... …

Abdelmajid 20998

… …

Katherine 43921

… …

Adam 60032

… …

Jacques 498723

… …

Luc 987943

… …

Ratiba 1109921

Page 11: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 11

Problèmes avec cette implantation

• Il n’est pas possible de déclarer un tableau assez grand pour stocker des objets pour tous les index entiers.

• Il est possible que deux objets différents aient le même index.

Page 12: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 12

Solutions

• Prendre un tableau de taille « raisonnable » et réduire les index calculés dans l’intervale de ce tableau.int h = x.hashCode(); // hashcode systèmeif(h < 0) h = -h; // élimine valeurs négativesh = h % taille; // ajuste pour entrer dans la table

• Pour les objets qui ont le même index : • Utilisez des listes d’objets, qu’on appelle des

“buckets”.

Page 13: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 13

Tableau de buckets• Une table d’adressage dispersé peut être implantée avec un tableau de buckets.

• Les buckets sont des listes chaînées qui regroupent les éléments qui retournent le même index de hachage.

• La taille de la table doit être un nombre premier plus grand que le nombre d’éléments attendu.

• S’il y a peu de collisions (distribution uniforme des codes de hachage) alors les opérations ajouter, supprimer et chercher prennent un temps constant, dans O(1).

Page 14: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 14

Algorithme d’insertion

• Obtenir l’index h dans la table :• Calculer le hashcode. • Réduire le hashcode modulo la taille de la table pour obtenir l’index h (si index peut déborder)

• Ajouter dans le bucket à l’adresse h, revient à insérer dans une liste, O(n) :• Dépend de ce qu’on veut : liste triée, un ensemble, un BST,… ?

Page 15: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 15

Algorithme de recherche • Obtenir l’index h dans la table :

• Calculer le hashcode. • Réduire le hashcode modulo la taille de la table pour obtenir l’index h (si index peut déborder)

• Itérer dans le bucket à l’adresse h, revient à chercher dans une liste, O(n) :• Pour chaque élément dans le bucket vérifier s’il est égal à x.• Si on trouve un élément égal à x alors x est dans la liste et donc dans la table.

• Autrement, x n’est pas dans la table.

Page 16: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 16

Algorithme de suppression • Obtenir l’index h dans la table :

• Calculer le hashcode.

• Réduire le hashcode modulo la taille de la table pour obtenir l’index h (si index peut déborder)

• Itérer dans le bucket à l’adresse h, revient à supprimer dans une liste :

• Pour chaque élément dans le bucket vérifier s’il est égal à x.

• Si on trouve un élément égal à x alors on retire x de la liste et on le retourne.

• Autrement, x n’est pas dans l’ensemble et on ne fait rien et on retourne null.

Page 17: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 17

Tableau périodique

Nous allons faire un dictionnaire pour « mapper » les éléments chimiques avec leurs numéros atomiques. Nous prendrons comme fonction de hachage la première lettre de l’élément moins ‘A’. Nous implanterons la table dans un tableau avec « buckets ».

Page 18: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 18

hashcode(mot) = 1ère lettre – ‘A’elem numéro hashcode

H 1 7

He 2 7

Li 3 11

Be 4 1

Na 11 13

Mg 12 12

K 19 10

Ca 20 20

Rb (Rubidium) 37 17

Sr (Strontium) 38 18

Cs (Cesium) 55 2

Ba (Barium) 56 1

Page 19: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 19

Tableau périodique0123456789

10111213141516171819202122

<H, 1>

Insérer <H, 1> : 7Insérer <He, 2> : 7

Insérer <Be, 4> : 1Insérer <Li, 3> : 11

Insérer <Mg,12> : 12Insérer <Na,11> : 13

Insérer <Ca,20> : 2Insérer <K, 19> : 10

Insérer <Rb,37> : 17

Insérer <Cs,55> : 2Insérer <Sr,38> : 18

Insérer <Ba,56> : 1

<He, 2>

<Li, 3>

<Ca, 20>

<K, 19>

<Mg, 12><Na, 11>

<Be, 4><Cs, 55>

<Sr, 38><Rb, 37>

<Ba, 56>

Page 20: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 20

HashMap

• Dans un HashMap, seules les clés sont hachées !

• Les clés ont besoin de hashCode et de méthodes equals compatibles (soit d’implanter l’interface Comparable).

Page 21: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 21

TreeSet vs HashSet

• Les deux implantent l’interface Set• Avec une bonne fonction de hachage, les algorithmes

qui travaillent avec une table de hachage sont généralement plus rapides que les algorithmes qui travaillent avec des arbres.

• La classe TreeSet garantie le balancement des arbres et donc la performance dans O(log n) des opérations.

• L’itérateur de TreeSet visite les éléments dans l’ordre trié alors que celui de HashSet non (plutôt un ordre aléatoire).

Page 22: TABLES D’ADRESSAGE DISPERSÉ (HASH TABLES; TABLES DE HACHAGE)

IFT1020 22

Allons voir le code de CBHT.java…

Ici on implante une table de hashing pour des entrées <clé, valeur>, donc prêt pour implanter HashMap. Pour implanter HashSet à partir de CBHT, il faudrait faire le même exercice qu’avec BSTSet, soit d’utiliser un objet bidon pour les valeurs.