Title: Cours 10
1Cours 10
2Plan du cours 10
- Fonctions de hachage
- Traitement linéaire des collisions
- Traitement quadratique des collisions
- Résolutions par chaînage
3I 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.
4Fonctions 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
5Ladressage 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.
6Exemple 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
7Exemple 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
8Exemple 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.
9Exemple 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
10Ladressage 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.
11Ré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.
12Ré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.
13II - 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
14Ré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"?.
15Ré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"?
16Ré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"?
17Ré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"?
18Calcul du nombre moyens déléments visités par la
recherche pour résolution des collisions par
débordement progressif
19Critique 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.
20Critique de la méthode (suite)
l 0,5
21Critique de la méthode (suite)
l 0,9
22Ré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"?.
23Ré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
24Ré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
25Ré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
26Calcul du nombre moyens déléments visités par la
recherche
27Retrait 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.
28Retrait 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
29III - 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.
30Double 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
31Application 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é.
32Application 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"?
33Application 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
34Application 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"?
35Calcul du nombre moyens déléments visités par la
recherche pour le double hashing
36Rehash
- 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
37Implé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
38Implémentation (suite)
- void remove(const Object x)
-
- int currentPosfindPos(x)
- if(isActive(currentPos))
- arraycurrentPos.infoDELETED
- else
- throw ItemNotFoundExc()
-
39Implémentation (suite)
- void insert(const Object x)
-
- int currentPosfindPos(x)
- if(isActive(currentPos))
- throw DuplicateItemException()
-
- arraycurrentPosHashEntry(x,ACTIVE)
- if(occupiedgtarray.size()/2)
- rehash()
-
40Implé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)
41Implé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
-
42Implémentation (suite)
- bool isActive (int currentPos) const
-
- return arraycurrentPos.info ACTIVE
-
- // FIN DE LA CLASSE HashTable
43Implé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
44Conclusions 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.
45Complexité du double-hashing
- Recherche dans le cas moyen ?(1).
- Insertion dans le cas moyen ?(1).
- Retrait dans le cas moyen ?(1).
46Les 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.
47Les 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.
48Les 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.
49Les 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.
50Exemple sur les tables de dispersement
0 1 2 3 4 5 6 7 8 9 10
51Résumé des complexités
Complexité en moyenne
52Résumé des complexités (suite)
Complexité au pire
53IV - 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.
54Ré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"?.
55Ré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
56Ré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
57Ré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
58Ré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.