Cours 10 - PowerPoint PPT Presentation

1 / 58
About This Presentation
Title:

Cours 10

Description:

Traitement lin aire des collisions. Traitement quadratique des ... recherche s quentielle serait ad quate; l'utilisation de la m moire serait alors optimale. ... – PowerPoint PPT presentation

Number of Views:35
Avg rating:3.0/5.0
Slides: 59
Provided by: samuelkado
Category:
Tags: alors | cours

less

Transcript and Presenter's Notes

Title: Cours 10


1
Cours 10
  • Tables de hachage

2
Plan du cours 10
  • Fonctions de hachage
  • Traitement linéaire des collisions
  • Traitement quadratique des collisions
  • Résolutions par chaînage

3
I Fonctions de dispersement
  • Problématique
  • La recherche dans une base de données est une
    tâche importante qui doit être effectuée
    efficacement et rapidement.
  • Si le temps exigé pour effectuer la recherche
    était illimité, alors une simple recherche
    séquentielle serait adéquate l'utilisation de
    la mémoire serait alors optimale. A l'opposé, si
    la mémoire disponible était infinie, un simple
    adressage direct à l'aide de la clé donnerait
    instantanément la position de l'élément
    recherché. Évidemment, la meilleure solution se
    trouve entre ces deux solutions extrêmes.

4
Fonctions de dispersement (suite)
  • Définitions
  • Clé Variable choisie pour la recherche.
  • Fonction de dispersement Fonction qui est
    associée à une clé.
  • H(clé) Donne un emplacement d'espace mémoire.
  • Collision Lorsque deux différentes clés
    correspondent au même espace mémoire (tel
    qu'obtenu par une fonction de dispersement), il y
    a collision.
  • Enregistrement synonyme Se dit de deux éléments
    dont les clés sont en collision.
  • Facteur de compression

    fc nombre d'éléments/espace mémoire disponible

5
Ladressage indirect
  • Qualités d'une fonction de dispersement
  • Une bonne fonction de dispersement doit
  • distribuer le plus uniformément possible les clés
    sur l'espace mémoire disponible afin de réduire
    le nombre de collisions
  • se calculer facilement et rapidement.

6
Exemple de fonctions de dispersement
  • 1 H(clé) clé modulo N où N taille de la
    table
  • Cette fonction est simple mais elle est très
    utiliséeLe résultat est assurément dans
    l'intervalle 0, N-1Choix intéressant
    Poser N P, le plus petit nombre premier tel
    que P ? N.
  • 2 Troncature H(clé) troncature de la clé
  • ExempleSoit un fichier contenant 1000
    positions réservées, la clé utilisée est le
    numéro d'assurance sociale. Par troncation, la
    clé 252 313 345 devientH(252 313 345) 345

7
Exemple de fonctions de dispersement (suite)
  • 3 Le recoupement
  • Encore une fois, avec un numéro d'assurance
    sociale et 1000 positions réservées, la fonction
    de dispersement pourrait être
  • H(clé) (somme par groupe de trois) modulo 1000
  • Par exemple
  • 252 313 450 ? 252 313 450 1005
  • et 1005 modulo 1000 5
  • 4 La transformation de base
  • La clé est utilisée comme si elle était
    représentée dans une autre base que la base 10,
    puis reconvertie en base 10.
  • Par exemple, 1234 en base 13 donnerait 2578 en
    base 10.
  • Enfin, le modulo 1000 est appliqué pour obtenir
    578

8
Exemple de fonctions de dispersement (suite)
  • 5 Les clés alphabétiques
  • Cette situation se présente lorsque la clé est
    une chaîne de caractères alphanumériques.Par
    exemple F37 BA2
  • Les lettres peuvent être traitées selon leur
    code ASCII ou leur rang alphabétique.

9
Exemple de fonctions de dispersement (suite)
  • 5 Les clés alphabétiques (suite)
  • Fonction basée sur léquation
  • ((AnX An-1) X ...) X A0
  • unsigned int hash(const string cle, int taille)
  • unsigned int valeur 0
  • for (int i 0 i lt cle i)
  • valeur 37valeur clei
  • return valeur taille

10
Ladressage indirect
  • Critère de choix
  • analyser l'environnement dans lequel s'appliquera
    la fonction
  • trouver une fonction qui se calcule facilement et
    rapidement
  • s'assurer que la fonction distribue les clés le
    plus uniformément possible sur l'espace des
    possibilités dans le fichier de données (qui
    élimine tout risque de collision)
  • idéalement, choisir une fonction qui élimine tout
    risque de collision.

11
Résolution de collisions
  • Pour réduire le nombre de collisions, il faut
  • 1) trouver une meilleure fonction de
    dispersement pour la situation
  • 2) diminuer le facteur de compression de la
    table.

12
Résolution de collisions
collisions
Le nombre de collisions augmente généralement
très vite lorsque fc (le facteur de compression)
devient supérieur à 90. Il est impensable
d'éliminer toutes les collisions. De toute
façon, ceci se ferait au détriment de l'espace
mémoire requis. Que faire alors? Il faut
relocaliser les enregistrements synonymes.
13
II - Résolution des collisions par débordement
progressif
  • Idée générale
  • Lorsqu'il y a collision, l'enregistrement est
    relocalisé au prochain emplacement libre.
  • Algorithme dinsertion
  • -Appliquer la fonction de dispersement
  • -Si la position est vide
  • -Insérer le nouvel enregistrement
  • -Sinon
  • -Rechercher la première position libre à partir
    de la position calculée
  • -Si la fin du tableau est atteinte
  • -Poursuivre la recherche au début du fichier

14
Résolution des collisions par débordement
progressif
  • Soit un tableau de N11 éléments (représentant
    une base de données pouvant contenir 11
    enregistrements), avec comme fonction de
    dispersement
  • H(clé) clé N où la clé est un attribut de la
    classe.
  • Les objets à insérer sont les suivants
  • ?27, "bleu"?, ?18, "blanc"?, ?29, "rouge"?, ?28,
    "noir"?,?39,"vert"? , ?13, "gris"?,?16, "mauve"?,
    ?42, "cyan"?, ?17, "rose"?.

15
Résolution des collisions par débordement
progressif (suite)
Insertion des trois premiers objets ?27,
"bleu"?, ?18, "blanc"?, ?29, "rouge"?
0 1 2 3 4 5 6 7 8 9 10
H(27) 2711 5 Insertion à lindex 5
?27, "bleu"?
H(18) 7 Insertion à lindex 7
?18, "blanc"?
H(29) 7 On insère 29 à la Première position
libre
?29, "rouge"?
16
Résolution des collisions par débordement
progressif (suite)
  • Insertion des trois
  • objets suivants
  • ?28, "noir"?,
  • ?39, "vert"?,
  • ?13, "gris"?,

0 1 2 3 4 5 6 7 8 9 10
?13, "gris"?
H(28) 6 Insertion à lindex 6
?27, "bleu"?
H(39) 6 (collision) On insère 39 à la première
position libre
?28, "noir"?
?18, "blanc"?
?29, "rouge"?
H(13) 2 Insertion à lindex 2
?39, "vert"?
17
Résolution des collisions par débordement
progressif (suite)
Insertion des trois objets suivants ?16,
"mauve"?, ?42, "cyan"?, ?17, "rose"?
0 1 2 3 4 5 6 7 8 9 10
?42, "cyan"?
?17, "rose"?
?13, "gris"?
H(16) 5 (collision)
?27, "bleu"?
?28, "noir"?
H(42) 9 (collision)
?18, "blanc"?
?29, "rouge"?
?39, "vert"?
H(17) 6 (collision)
?16, "mauve"?
18
Calcul du nombre moyens déléments visités par la
recherche pour résolution des collisions par
débordement progressif
19
Critique de la méthode
  • Soit l la proportion des cellules de la table qui
    sont occupées
  • Analyse naïve
  • 1/(1 - l) cellules visitées en moyenne pour
    insertion
  • 1/((1 - l) cellules visitées en moyenne pour
    recherche sans succès
  • -ln(1- l)/ l cellules visitées en moyenne pour
    recherche avec succès
  • Analyse correcte
  • (1 1/(1 l)2)/2 cellules visitées en moyenne
    pour insertion
  • (1 1/(1 l)2)/2 cellules visitées en moyenne
    pour recherche sans succès
  • (1 1/(1 l))/2 cellules visitées en moyenne
    pour recherche avec succès
  • La méthode, telle que décrite, est en pratique
    peu utilisée car elle produit des amas dispersés
    qui ralentissent la recherche.

20
Critique de la méthode (suite)
l 0,5
21
Critique de la méthode (suite)
l 0,9
22
Résolution des collisions par chaînage avec lien
explicite
  • Soit un tableau de N11 éléments (représentant
    une base de données pouvant contenir 11
    enregistrements) la clé est un attribut de la
    classe.
  • H(clé) clé N
  • Les objets à insérer sont les suivants
  • ?27, "bleu"?, ?18, "blanc"?, ?29, "rouge"?, ?28,
    "noir"?,?39, vert"?, ?13, "gris"?,?16, "mauve"?,
    ?42, "cyan"?, ?17, "rose"?.

23
Résolution des collisions par chaînage avec lien
explicite (suite)
Objet Lien
Insertion des trois premiers objets ?27,
"bleu"?, ?18, "blanc"?, ?29, "rouge"?
0 1 2 3 4 5 6 7 8 9 10
H(27) 5 Insertion à lindex 5
?27, "bleu"? -1
H(18) 7 Insertion à lindex 7
?18, "blanc"? -1
?18, "blanc"? 10
H(29) 7 Collision insertion à
dispo Création d'un lien direct
Dispo
?29, "rouge"? -1
24
Résolution des collisions par chaînage avec lien
explicite (suite)
Objet Lien
  • Insertion des trois
  • objets suivants
  • ?28, "noir"?,
  • ?39, "vert"?,
  • ?13, "gris"?

0 1 2 3 4 5 6 7 8 9 10
?13, "gris"? -1
H(28) 6 Insertion à lindex 6
?27, "bleu"? -1
H(39) 6 Collision insertion à
dispo Création d'un lien direct
?28, "noir"? -1
?28, "noir"? 9
?18, "blanc"? 10
Dispo
?39, "vert"? -1
H(13) 2 Insertion à lindex 2
?29, "rouge"? -1
25
Résolution des collisions par chaînage avec lien
explicite (suite)
  • Insertion des trois
  • objets suivants
  • ?16, "mauve"?,
  • ?42, "cyan"?,
  • ?17, "rose"?.

Objet Lien
0 1 2 3 4 5 6 7 8 9 10
?13, "gris"? -1
?17, "mauve"? -1
H(16) 5 Collision insertion à
dispo Création d'un lien direct
?42, "cyan"? -1
?42, "cyan"? 3
?27, "bleu"? -1
?27, "bleu"? 8
?28, "noir"? 9
?18, "blanc"? 10
H(42) 9 Collision insertion à
dispo Création d'un lien direct
Dispo
?16, "mauve"? -1
?39, "vert"? -1
?39, "vert"? 4
?29, "rouge"? -1
H(17) 6 Collision dun lien
26
Calcul du nombre moyens déléments visités par la
recherche
27
Retrait avec résolution des collisions à l'aide
d'un tableau avec lien explicite
  • Soit le tableau avec lien explicite, tel que vu
    précédemment, l'élément 39,"vert" est retiré.
  • Pour retirer cet enregistrement, il faut
  • 1 Localiser le dernier élément de la chaîne dont
    la position principale est 6. À partir de la
    position 6, il y a 28,"noir", 39,"vert",
    42,"cyan", et 17, "rose", mais seul le
    premier a comme position principale 6.
  • 2 Déplacer Dispo à la position du retrait.
  • 3 Ajuster les liens.

28
Retrait avec résolution des collisions à l'aide
d'un tableau avec lien explicite
Objet Lien
0 1 2 3 4 5 6 7 8 9 10
Retrait de l'objet 39, "vert"
Dispo
?13, "gris"? -1
?17, "mauve"? -1
?42, "cyan"? 3
?27, "bleu"? 8
4
?28, "noir"? 9
?18, "blanc"? 10
?16, "mauve"? -1
?39, "vert"? 4
?29, "rouge"? -1
29
III - Double fonction de dispersement ("double
hashing")
  • Idée générale
  • Pour éviter la profusion d'amas dispersés, une
    variante consiste à faire varier l'incrément à
    chaque passage entre les enregistrements. Par
    exemple, l'incrément peut être une fonction de la
    clé à insérer.

30
Double fonction de dispersement ("double
hashing")
  • Une seconde fonction de hachage H2(x) est
    utilisée pour calculer le décalage en cas de
    collision.
  • À la suite dune collision, la nouvelle position
    est donnée, par exemple, par Nouvelle position
    (H1(x) iH2(x))Noù i est le nombre de
    collisions encourues.
  • Exemples
  • H2(X) (X/N) 1
  • H2(X) R (X R) où R lt N et est un nombre
    premier

31
Application de la double fonction de dispersement
  • Exemple de cycle Soit PN6 (cas où P n'est
    pas premier)
  • Les éléments à insérer sont 1, "orange", 3,
    "brun", 5, "turquoise" et 13, "violet"

H2(x) (x/N)N
0 1 2 3 4 5
H1(1) 16 1
?1, "orange"?
H1(3) 36 3
H1(5) 56 5
?3, "brun"?
H1(13) 136 1 (collision)
H2(13) (13/6)6 2
?5, "turquoise"?
Nouvel index 132 761 (collision). . .
Nouvel index 12 363 (collision)
Nouvel index 122 565 (collision)
Dans ce cas, il y a seulement 3 enregistrements
occupés et aucun espace libre ne peut être
localisé.
32
Application de la double fonction de dispersement
  • Soit PN11 (cas où P est un nombre premier) Les
    trois premiers éléments
  • à insérer sont
  • 27,"bleu",
  • 18,"blanc",
  • 29,"rouge",

H2(x) (x/N)1
0 1 2 3 4 5 6 7 8 9 10
H1(27) 2711 5
H1(18) 7
?27, "bleu"?
H1(29) 7 (collision)
?18, "blanc"?
H2(29) (29/11)1 3
Nouvelle position 73 1011 10
?29, "rouge"?
33
Application de la double fonction de dispersement
Soit PN11 (cas où P est un nombre premier) Les
trois premiers éléments à insérer sont
28,"noir", 39,"vert", 13,"gris",
H2(x) (x/N)1
0 1 2 3 4 5 6 7 8 9 10
?13, "gris"?
H1(28) 2811 6
?39, "vert"?
H1(39) 6 (collision)
?27, "bleu"?
H2(39) (39/11)1 4
?28, "noir"?
Nouvelle position (64)11 10 (collision)
?18, "blanc"?
Nouvelle position (624)11 3
?29, "rouge"?
H1(13) 2
34
Application de la double fonction de dispersement
Soit PN11 (cas où P est un nombre premier) Les
trois premiers éléments à insérer sont
16,"mauve", 42,"cyan", 17,"rose",
H2(x) (x/N)1
0 1 2 3 4 5 6 7 8 9 10
?42, "cyan"?
?13, "gris"?
H1(42) 9 (collision)
H1(17) 6 (collision)
H1(16) 5 (collision)
?39, "vert"?
H2(16) (16/11)1 2
H2(42) (42/11)1 4
H2(17) (17/11)1 2
?27, "bleu"?
Nouvel position (944)11 3 (collision)
Nouvel position (934)11 10 (collision)
Nouvelle position (62)11 8
Nouvel position (954)11 7 (collision)
Nouvel position (52)11 7 (collision)
Nouvel position (94)11 2 (collision)
Nouvel position (924)11 6 (collision)
Nouvel position (964)11 0
?28, "gris"?
?18, "blanc"?
?17, "rose"?
Nouvelle position (522)11 9
?16, "mauve"?
?29, "rouge"?
35
Calcul du nombre moyens déléments visités par la
recherche pour le double hashing
36
Rehash
  • Nous avons déjà vu que lorsque le taux
    doccupation de la table atteint 50, le nombre
    de collisions augmente sensiblement
  • Solution augmenter la table aussitôt que lon
    atteint ce taux doccupation

37
Implémentation
  • templateltclass Objectgt
  • class HashTable
  • public
  • HashTable() array(nextPrime(101))
    makeEmpty()
  • void makeEmpty()
  • occupied 0
  • for(int i 0 i lt Array.size() i)
  • arrayi.info EMPTY
  • private
  • enum EntryType ACTIVE, EMPTY, DELETED
  • struct HashEntry
  • Object element
  • EntryType info
  • HashEntry(const Object eObject(), EntryType
    iEMPTY)
  • element(e),info(i)
  • vectorltHashEntrygt array

38
Implémentation (suite)
  • void remove(const Object x)
  • int currentPosfindPos(x)
  • if(isActive(currentPos))
  • arraycurrentPos.infoDELETED
  • else
  • throw ItemNotFoundExc()

39
Implémentation (suite)
  • void insert(const Object x)
  • int currentPosfindPos(x)
  • if(isActive(currentPos))
  • throw DuplicateItemException()
  • arraycurrentPosHashEntry(x,ACTIVE)
  • if(occupiedgtarray.size()/2)
  • rehash()

40
Implémentation (suite)
  • private
  • void rehash()
  • vectorltHashEntrygt oldArray array
  • // Creer nouvelle table vide, 2x la taille
  • array.resize(nextPrime(2oldArray.size()))
  • for(int j0 jltarray.size() j)
  • arrayj.infoEMPTY
  • // Recopier la table
  • makeEmpty()
  • for(int i0 iltoldArray.size() i)
  • if(oldArrayi.info ACTIVE)
  • insert(oldArrayi.element)

41
Implémentation (suite)
  • int findPos(const Object x) const
  • int i0
  • int currentPoshash(x)array.size()
  • while ( arraycurrentPos.info ACTIVE
  • arraycurrentPos.element ! x)
  • currentPos2 i - 1
  • if(currentPos gt array.size() )
  • currentPos - array.size()
  • return currentPos

42
Implémentation (suite)
  • bool isActive (int currentPos) const
  • return arraycurrentPos.info ACTIVE
  • // FIN DE LA CLASSE HashTable

43
Implémentation (suite)
  • unsigned int hash(const Object key)
  • unsigned int hashVal 0
  • const char keyp reinterpret_castltconst
    chargt(key)
  • for(size_t i0 iltsizeof(Object) i)
  • hashVal 37hashVal keypi
  • return hashVal
  • int nextPrime ( int n)
  • if(n2 0)
  • n
  • for( !isPrime(n) n2)
  • return n

44
Conclusions sur le double hashing
  • Un incrément variable permet de briser les amas
  • L'économie en espace mémoire pour les liens
    diminue la performance par rapport à
    l'utilisation du chaînage.

45
Complexité du double-hashing
  • Recherche dans le cas moyen ?(1).
  • Insertion dans le cas moyen ?(1).
  • Retrait dans le cas moyen ?(1).

46
Les tables de dispersement
  • Problématique
  • Il n'est pas toujours pratique, à moins d'avoir
    un support externe dédié, de réserver l'espace
    pour N éléments en laissant des enregistrements
    vides pour appliquer une fonction de
    dispersement. En pratique, tous les
    enregistrements d'un fichier sur support externe
    devraient être occupés.

47
Les tables de dispersement (suite)
  • Idée générale
  • Deux fichiers sont utilisés. Le premier contient
    la table de dispersion ("hashing table") 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.

48
Les tables de dispersement (suite)
  • Algorithme
  • - H1(clé) position dans la table
  • - À cette position dans la table, on relève la
  • position correspondante dans le fichier de
  • données
  • - Lecture de l'enregistrement dans le fichier
    de
  • données
  • - Si la clé dans le fichier n'est pas identique
    à
  • la clé recherchée
  • -Calculer H2(clé) pour obtenir l'incrément
  • dans la table.

49
Les tables de dispersement (suite)
  • La recherche s'effectue donc dans la table.
    L'accès aux enregistrements du fichier de données
    ne se fait que pour accéder à l'information et
    vérifier les collisions.
  • Remarque
  • L'usage de fichiers d'index ne se limite pas à
    l'adressage indirect. Il est possible
    d'effectuer une recherche séquentielle ou binaire
    dans un fichier index ordonné selon le champ clé.
    Dans certaines applications, ces fichiers
    peuvent être hiérarchiques pour en faciliter le
    chargement en mémoire principale.

50
Exemple sur les tables de dispersement
0 1 2 3 4 5 6 7 8 9 10
51
Résumé des complexités
Complexité en moyenne
52
Résumé des complexités (suite)
Complexité au pire
53
IV - Résolution des collisions par chaînage
  • Idée générale
  • Lorsqu'il y a collision, l'enregistrement
    synonyme est lié à l'emplacement mémoire donné
    par la fonction de dispersement grâce à une liste
    chaînée débutant à cet endroit.
  • Algorithme
  • -Si l'enregistrement à cette adresse a la même
    clé que l'enregistrement recherché
  • -Succès
  • -Sinon
  • -Parcourir la liste chaînée débutant à cet
    emplacement.

54
Résolution des collisions par liste chaînée
  • Soit un tableau de N11 éléments, la clé est un
    attribut de la classe
  • H(clé) clé N
  • Les objets à insérer sont les suivants
  • ?27, "bleu"?, ?18, "blanc"?, ?29, "rouge"?, ?28,
    "noir"?,?39, "vert"?, ?13, "gris"?,?16, "mauve"?,
    ?42, "cyan"?, ?17, "rose"?.

55
Résolution des collisions par liste chaînée
(suite)
Insertion des trois premiers objets ?27,
"bleu"?, ?18, "blanc"?, ?29, "rouge"?

0 1 2 3 4 5 6 7 8 9 10
H(27) 5
H(18) 7
H(29) 7 (collision)
27,bleu
NULL
18,blanc
29,rouge
NULL
NULL
56
Résolution des collisions par liste chaînée
(suite)
Insertion des trois autre objets ?28, "noir"?,
?39, "vert"?, ?13, "gris"?
0 1 2 3 4 5 6 7 8 9 10
H(28) 6
H(39) 6 (collision)
13,gris
NULL
H(13) 2
27,bleu
NULL
28,noir
39,vert
NULL
NULL
NULL
18,blanc
29,rouge
NULL
NULL
57
Résolution des collisions par liste chaînée
(suite)
Insertion des trois derniers objets ?16,
"mauve"?, ?42, "cyan"?, ?17, "rose"?
0 1 2 3 4 5 6 7 8 9 10
H(16) 5 (collision)
H(42) 9
13,gris
NULL
H(17) 6
16,mauve
27,bleu
NULL
NULL
NULL
28,noir
39,vert
17,rose
NULL
NULL
NULL
NULL
NULL
18,blanc
29,rouge
NULL
NULL
NULL
42,cyan
NULL
58
Résolution des collisions par chaînage avec lien
explicite
  • Résolution des collisions à l'aide d'un tableau
    avec lien
  • explicite
  • la recherche d'un élément absent est longue car
    il faut parcourir la liste jusqu'à la fin
  • le nombre moyen de cellules visitées en recherche
    peut dépendre de l'ordre initial d'insertion
  • les cellules visitées pour le retrait sont
    complexes
  • Résolution des collisions à l'aide de plusieurs
    listes
  • chaînées
  • la recherche est simple
  • les cellules visitées d'insertion et de retrait
    sont identiques aux cellules visitées d'une liste
    chaînée
  • cette méthode offre une performance intéressante
    au point de vue de la rapidité d'accès
    toutefois, le prix à payer est l'ajout d'un champ
    supplémentaire pour conserver les liens.
Write a Comment
User Comments (0)
About PowerShow.com