3 Organisations unidimentionnelles : indexage et hachage
Sélection basée sur une clé d'accès
– recherche associative
–
Ex: Chercher le plant dont le noCatalogue = 10
Sériel
– lire tout le fichier en pire cas
– O(N)
Indexage
– O(log(N))
– sélection par intervalle
Hachage
– ~O(1)
3.1 Indexage
Index et clé d'index (index key)
–
valeur de la clé =>adresse de(s) l'enregistrement
N u m é r o d e b l o c
N u m é r o d 'e n r e g i s t r e m e n t
r e l a t i f
0
1
0 1 2 3 4
5 6 7 8 9
1 0 C è d r e e n b o u l e 1 0 . 9 9 4 0
9 0 6 0 5 0
E p i n e t t e b l e u e P o m m i e r E r a b l e a r g e n t é
C h ê n e
2 5 . 9 9 2 5 . 9 9 1 5 . 9 9 2 2 . 9 9
2 6 . 9 9 1 2 . 9 9 1 0 . 9 9 1 5 . 9 9
P o i r i e r S a p i n H e r b e à p u c e
G é n é v r i e r
8 0 2 0 7 0 9 5
2 5 . 9 9 C a t a l p a
8 1
1 0 0
2 0 8
4 0 1
5 0 4
6 0 3
7 0 7
8 0 9
8 1 5
9 0 2
9 5 6
I n d e x
Index dense secondaire
Fichier séquentiel indexé
Non dense
Index plus petit
Accès séquentiel rapide
Primaire
1 0 0
7 0 1
I n d e x N u m é r o
d e b l o c
N u m é r o d 'e n r e g i s t r e m e n t
r e l a t i f
0
1
0 1 2 3 4 5 6 7 8 9
1 0 C è d r e e n b o u l e 1 0 . 9 9 2 0
4 0 5 0 6 0
S a p i n E p i n e t t e b l e u e
C h ê n e E r a b l e a r g e n t é
1 2 . 9 9 2 5 . 9 9 2 2 . 9 9 1 5 . 9 9
1 5 . 9 9 2 5 . 0 0 2 5 . 9 9 2 6 . 9 9
G é n é v r i e r P o m m i e r
C a t a l p a P o i r i e r
9 5 9 0 8 1 8 0
1 0 . 9 9 H e r b e à p u c e
7 0
Index séquentiel hiérarchique
Ex: ISAM de IBM
Zone de débordement
Réorganisations chroniques
1 0 C è d r e e n b o u l e 1 0 . 9 9
2 0 4 0 5 0
S a p i n E p i n e t t e b l e u e
C h ê n e
1 2 . 9 9 2 5 . 9 9 2 2 . 9 9
6 0 E r a b l e a r g e n t é 1 5 . 9 9
1 0 . 9 9 H e r b e à p u c e
7 0
2 5 . 9 9 2 6 . 9 9 C a t a l p a
P o i r i e r 8 1
8 0
1 5 . 9 9 2 5 . 0 0 G é n é v r i e r
P o m m i e r 9 5
9 0
1 0 4 0
N i v e a u 2 d 'i n d e x
6 0 8 0 9 0
. . . . 1 0
8 0
. . . .
N i v e a u 1 d ' i n d e x
3.1.1 Indexage par Arbre- B et variantes
Arbre-B (B-arbre, B-tree)
– forme d ’index hiérarchique
– équilibré
– O(log(N)) en pire cas
Réoganisation dynamique
– division/fusion des blocs
– taux d ’occupation minimum de 50%
3.1.2 Arbre-B+
Hypothèse initiale : clé simple et unique
Nœud = bloc
1 0 B l o c 0
2 0
2 5 4 0 4 5
B l o c 2
2 5 B l o c 3
3 0 4 0
B lo c 1
4 3 4 4 6 0
B l o c 4 7 0 5 0
B lo c 5 5 3
6 0 B lo c 6 5 0
B l o c 7
4 5 4 8
B l o c 8
Structure d ’une feuille
1. Remplie à moitié au minimum FBM
f/2 ≤ n = nombre de clés ≤ FBM
f
2. Clés triées : i < j C
i< C
j
3. Clés d'une feuille < clés de la suivante
4. Au même niveau (équilibré)
Ci : Clé
Ri : reste de l'enregistrement ou référence
S : Pointeur sur le bloc suivant dans la liste des feuilles
C
1R
1. . . C
nR
nE s p a c e S
l i b r e
Structure d’un bloc interne
1. Remplie à moitié au minimum:
–
Ordre
I/2 ≤ n = nombre de pointeurs ≤ Ordre
I
2. Clés triées : i < j C
i< C
j
3. C
i-1<= Clés sous P
i-1< C
iP 1 C 1 P 2 . . . C i- 1 P i- 1 C i . . . P n - 1 C n - 1 P n
C i- 1 < = C < C i
E s p a c e l i b r e
C < C 1 C n - 1 < = C
3.1.2.1 Recherche dans un arbre-B+
RechercherClé (noBloc, clé, indice) Entrée
noBloc : typeNuméroBloc {numéro du bloc à chercher; racine au premier appel}
clé : typeClé {la clé à chercher}
Sortie
noBloc : typeNuméroBloc {numéro du bloc où est la clé }
indice : 1..FBMf { si clé trouvée, indice de la clé dans le tableauClés du bloc}
valeur de retour : BOOLÉEN;{vrai si clé a été trouvée}
Pré-condition : arbre n'est pas vide DÉBUT
lireBloc(fichierArbre-BPlus, noBloc, bloc);
TANT QUE bloc n'est pas une feuille
indice := l'indice de la plus petite clé de tableauClés plus grande que clé (ou n);
noBloc:= tableauEnfants[indice];
lireBloc(fichierArbre-BPlus, noBloc, bloc);
FIN TANT QUE;
SI la clé est présente dans tableauClés
indice := l'indice de la clé dans le tableauClés;
retourner VRAI;
SINON
retourner FAUX FIN SI
Rechercher 43
1 0 B l o c 0
2 0
2 5 4 0 4 5
B lo c 2
2 5 B lo c 3
3 0 4 0
B l o c 1
4 3 4 4 6 0
B lo c 4 7 0 5 0
B l o c 5 5 3
6 0 B l o c 6 5 0
B lo c 7
4 5 4 8
B lo c 8
3.1.2.2 Complexité de la recherche et hauteur de l'arbre
FBM f = 20 et Ordre I = 200
Hauteur = nombre de niveaux
Hauteur 2 N 2 * 10 = 20 clés (pire cas)
Hauteur 3 N 2 * 100 * 10 = 2,000 clés
Hauteur 4 N 2 * 100 * 100 * 10 = 200,000clés
Hauteur 5 N 2 * 100 * 100 * 100 * 10 = 20,000,000 clés
Hauteur H N 2*Ordre
I/2
H-2* FBM
f/2 pour H 2
H 2 + log OrdreI /2 (N /(2*FBM f /2))
– O(log N)
Hauteur moyenne
H ~ 1 + log OrdreMoyenI (N / FB f )
– OrdreMoyen
I= 2/3 Ordre
I
– FB
f= 2/3 FBM
f
Index secondaire
– FB
f~ OrdreMoyen
I– H = log
OrdreMoyenI(N)
3.1.2.3 Insertion dans un arbre-B+
FBM = 3, Ordre I = 4
4 0 . . .
B l o c 0
2 0 . . . 4 0 . . .
B l o c 0
2 0 . . . 4 0 . . . 6 0 . . .
B l o c 0
Débordement et division
Insertion de 30
Débordement et la division du bloc 0
40 est promue
Nouvelle racine
2 0 . . . 4 0 . . . 6 0 . . .
B l o c 0
2 0 . . . 3 0 . . .
B l o c 0
4 0 . . . 6 0 . . .
B l o c 1 4 0
B l o c 2
Insertion de 25
2 0 . . . 3 0 . . .
B l o c 0
4 0 . . . 6 0 . . .
B l o c 1 4 0
B l o c 2
4 0 B l o c 2
2 0 B l o c 0
2 5 3 0 4 0
B l o c 1
6 0
Insertion de 10
4 0 B l o c 2
2 0 B l o c 0
2 5 3 0 4 0
B l o c 1 6 0
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1 6 0
Débordement et la division du bloc 0
25 est promue
Insertion de 70
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1 6 0
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
6 0 7 0
Insertion de 50
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
6 0 7 0
1 0 B l o c 0
2 0
2 5 4 0 6 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
5 0 6 0
B l o c 4 7 0
Débordement et la division du bloc 1
60 est promue
Insertion de 53
1 0 B l o c 0
2 0
2 5 4 0 6 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
5 0 6 0
B l o c 4 7 0
1 0 B l o c 0
2 0
2 5 4 0 6 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
5 0 5 3 6 0
B l o c 4 7 0
Insertion de 45
1 0 B l o c 0
2 0
2 5 4 0 6 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
5 0 5 3 6 0
B l o c 4 7 0
10 Bloc 0
20
25 40
Bloc 2
25 Bloc 3
30 40
Bloc 1
45 60
Bloc 4 70 50
Bloc 5 53
60 Bloc 6 50
Bloc 7
Division du bloc 1
50 est promue
Division de la racine
3.1.2.4Suppression dans un arbre-B+
Cas simple
–
minimum préservé
–
pas la première
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
6 0 7 0
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1 6 0
Première clé du bloc et pas la première feuille
Remplacer dans le parent (si pas « aîné »)
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
6 0 7 0
1 0 B l o c 0
2 0
2 5 6 0
B l o c 2
2 5 B l o c 3
3 0 6 0
B l o c 1 7 0
Première clé du bloc et pas la première feuille
Remonter tant que l'enfant est l ’«
aîné »
1 0 B l o c 0
2 0
2 5 4 0 4 5
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
4 3 4 4 6 0
B l o c 4 7 0 5 0
B l o c 5
5 3 5 5
6 0 B l o c 6 5 0
B l o c 7
4 5 4 8
B l o c 8
B l o c 0
2 5 4 0 4 5
B l o c 2
B l o c 3 B l o c 1 B l o c 5 B l o c 4
6 0 B l o c 6 5 3
B l o c 7
B l o c 8
Violation du minimum : redistribution si possible
Ajuster séparateur B l o c 2 4 0
2 0 B l o c 0
2 5 3 0 4 0
B l o c 1 6 0
3 0 B l o c 2
2 0 B l o c 0
2 5 3 0
B l o c 1
6 0
Violation du minimum : fusion
F u s i o n d e s d e u x f r è r e s 1 0
B l o c 0 2 0
2 5 6 0
B l o c 2
2 5 B l o c 3
3 0 6 0
B l o c 1 7 0
1 0 B l o c 0
2 5 3 0
6 0 B l o c 2
6 0 B l o c 1
7 0
V io la t io n d e la r è g le d u m in im u m
Cas de fusion de feuilles et de
redistribution au niveau du parent
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
4 5 6 0
B l o c 4 7 0 5 0
B l o c 5 5 3
6 0 B l o c 6 5 0
B l o c 7
V io la t io n d e la r è g l e d u m in im u m
B l o c 0
2 5 4 0
B l o c 2
B l o c 3 B l o c 1 B l o c 5
6 0 B l o c 6 5 0
B l o c 7
V io la t io n d e la r è g le d u m in im u m
R e d i s t r i b u t i o n
F u s i o n d e s d e u x f r è r e s
Cas de fusion de feuilles et de
redistribution au niveau du parent (suite)
1 0 B l o c 0
2 0
2 5 4 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
4 5 5 0
B l o c 5
6 0 7 0
6 0 B l o c 6 5 0
B l o c 7
V io la t io n d e la r è g le d u m in im u m
R e d i s t r i b u t i o n
B l o c 0
2 5 B l o c 2
B l o c 3 B l o c 1 B l o c 5
5 0 B l o c 6 4 0
B l o c 7
Cas de fusion en cascade
F u s i o n d e s d e u x f r è r e s 1 0
B l o c 0 2 0
2 5 B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
4 5 5 0
B l o c 5
6 0 7 0
5 0 B l o c 6 4 0
B l o c 7
V io l a t i o n d e l a r è g le d u m i n i m u m
F u s i o n d e s d e u x f r è r e s
1 0 B l o c 0
2 5 3 0
2 5 B l o c 2
4 0 B l o c 1
4 5 5 0
B l o c 5
6 0 7 0
5 0 B l o c 6 4 0
B l o c 7
V i o l a t io n d e la r è g le d u m in im u m
Cas de fusion en cascade (suite) : réduction de la hauteur
F u s i o n d e s d e u x f r è r e s
1 0 B l o c 0
2 5 3 0
2 5 B l o c 2
4 0 B l o c 1
4 5 5 0
B l o c 5
6 0 7 0
5 0 B l o c 6 4 0
B l o c 7
V io la t io n d e la r è g le d u m in im u m
1 0 B l o c 0
2 5 3 0
4 0 5 0
B l o c 2
4 0 B l o c 1
4 5 5 0
B l o c 5
6 0 7 0
3.1.3 Arbre-B
4 0
2 5 6 0
3 0 5 0 5 3 7 0
1 0 2 0
B l o c 0 B l o c 3 B l o c 1 B l o c 4
B l o c 2 B l o c 5
B l o c 6
1 0 B l o c 0
2 0
2 5 4 0 6 0
B l o c 2
2 5 B l o c 3
3 0 4 0
B l o c 1
5 0 5 3 6 0
B l o c 4 7 0
Arbre-B
Arbre-B
+
Clés non dupliquées
Ordre <
Hauteur >
3.1.4 Autres variantes du concept d'arbre-B
Redistribuer plutôt que diviser
–
occupation moyenne 67% => 86%
Diviser deux en trois
–
Arbre-B*
Ordre variable
–
clés de taille variable
Arbre B préfixe
–
comprimer les clés diminue la hauteur
Algorithme de chargement en lot
–
feuilles consécutives
–
taux de remplissage prédéterminé
Cas d'une clé non unique
Arbre-B
+primaire sur une clé non unique
– IDE difficile
Arbre B
+secondaire avec clés répétées
– clé d ’accès + pointeur (unique)
Arbre B
+secondaire avec collection de références
– listes inversées dans les feuilles
Arbre B
+secondaire avec référence à une collection d'enregistrements
– Index groupant (“ clustering index ”)
organisation primaire par grappe et index secondaire sur même clé
Arbre B
+secondaire avec référence à collection de références
– listes inversées à part
Arbre B
+avec vecteurs booléens
– index « bitmap »
3.1.5 Réalisation de l'accès par IDE à l'aide d'une organisation par index
Index primaire
– IDE = id_fichier, valeur de la clé unique
– nécessite le passage par l ’index
IDE logique
– index secondaire
– clé d ’index = IDE
3.1.6 Sélection par intervalle ou préfixe
Arbre B
+–
recherche de la valeur minimale
–
parcours des feuilles jusqu ’à la valeur maximale
. . . . . .
. . .
. . . . . . . . .
. . .
3.1.7 Index sur une clé composée
Clé composée ~ clé simple formée de la concaténation des champs
Sélection par préfixe de la clé
composée
3.2Arbre digital (trie)
Chaque niveau : position d'un symbole de la clé vue comme une séquence de symboles s
1s
2…s
n« A C B »
A B C
« A »
A C
« A A »
A B
« A C A »
« B A »
A
« C »
B
« B B »
3.3 Hachage
Hachage ou adressage dispersé (hashing)
Fonction h(clé de hachage) => l'adresse d'un paquet
Fichier = tableau de paquets (bucket)
–
~ARRAY paquet [0..TH-1]
–
TH : taille de l'espace d'adressage primaire
Habituellement paquet = bloc
Pas d ’index à traverser : O(1) en meilleur cas
Sélection par égalité (pas intervalle)
3.3.1 Hachage statique
6 0 E r a b l e a r g e n t é 1 5 . 9 9
9 0 P o m m i e r 2 5 . 9 9
8 1 C a t a l p a 2 5 . 9 9
7 0 H e r b e à p u c e 1 0 . 9 9
4 0 E p i n e t t e b l e u e 2 5 . 9 9 1 0 C è d r e e n b o u l e 1 0 . 9 9
2 0 S a p i n 1 2 . 9 9
5 0 C h ê n e 2 2 . 9 9
9 5 G é n é v r i e r 1 5 . 9 9
8 0 P o i r i e r 2 6 . 9 9
0
1
2 c l é = 1 0
h ( 1 0 ) = 1 0 M O D 3 = 1
3.3.1.1 Problème de débordement dû aux collisions
Méthode de résolution des collisions
–
Adressage ouvert
AC+1, AC+2,..., n-1, 0, 1, ....AC-1
–
Chaînage
6 0 E r a b l e a r g e n t é 1 5 . 9 9
9 0 P o m m i e r 2 5 . 9 9
8 1 C a t a l p a 2 5 . 9 9
7 0 H e r b e à p u c e 1 0 . 9 9
4 0 E p i n e t t e b l e u e 2 5 . 9 9 1 0 C è d r e e n b o u l e 1 0 . 9 9
4 3 M a g n o l i a 2 8 . 9 9
2 0 S a p i n 1 2 . 9 9
5 0 C h ê n e 2 2 . 9 9
9 5 G é n é v r i e r 1 5 . 9 9
8 0 P o i r i e r 2 6 . 9 9
0
1
2
5 2 P i n 1 8 . 9 9
Fonction de hachage
Répartition uniforme des clés dans [0..TH- 1]
– h(clé) = clé MOD TH
TH est premier
– h(clé) = clé p MOD TH
TH et p sont relativements premiers
– h(clé) = (∑ s
i) MOD TH
s
iest une sous-séquence des bits de la clé
Clé non numérique
– représentation binaire vue comme un entier
Hachage vs indexage
O(1) en meilleur cas vs O(log(N))
Pas d ’espace supplémentaire d ’index
Gaspillage d ’espace si TH trop >
Performance dégradée si TH trop <
Gestion plus délicate
– déterminer h et TH
– maintenance : réorganisations
Clé non numérique ?
– représentation binaire vue comme un entier
Calcul d ’espace
Heuristique : Taux d ’occupation moyen ~ 80%
– TauxOccupation = N/(TH FB) 0.8
Taux de débordement moyen sous
distribution uniforme [Merrett, 1984
#217] :
– FB = 1~ 30%
– FB = 10 ~ 5%
– FB = 100 ~1%
3.3.1.2 Fonction de hachage préservant la relation d'ordre
(tidy functions)
clé 1 < clé 2 h(clé 1 ) < h(clé 2 )
Connaissances préalables au sujet
de la distribution des clés
3.3.2 Hachage dynamique
Adaptation de TH et h aux
variations du volume des données
~ arbre-B
– division et fusion de paquets (blocs)
Deux variantes de base
– linéaire
– extensible
3.3.2.1Hachage linéaire
Adaptation de TH
– suite d ’expansions
Début de dième expansion, d {0, 1,
…}
– TH passera de 2
dà 2
d+1– adresse du paquet : h
d(clé) = b
d-1, b
d-2,…, b
1, b
01 0 1 0 0
21 1 1 0 1
20 0 0 0 1
21 1 0 1 0
20 1 1 1 1
21 1 0 1 1
20 0
20 1
21 0
21 1
2p
d = 2
Insertion de h(clé) = 10101 2
1 0 1 0 0 2 1 1 1 0 1 2 0 0 0 0 1 2
1 1 0 1 0 2 0 1 1 1 1 2 1 1 0 1 1 2
0 0 2 0 1 2 1 0 2 1 1 2
p
1 1 1 0 1 2 0 0 0 0 1 2
1 1 0 1 0 2 0 1 1 1 1 2 1 1 0 1 1 2
0 0 0 2 0 1 2 1 0 2 1 1 2
p 1 0 1 0 1 2
1 0 1 0 0 2 1 0 0 2 D i v i s i o n d u b l o c 0 0 2
Bloc #01
2déborde
Division du bloc p = #00
2(pas #01
2)
p := p+1
FONCTION AdresseLinéaire (clé) DÉBUT
SI hd(clé) >= p Retourner hd(clé)
SINON Retourner hd+1(clé) FINSI
FIN
Insertion de h(clé) = 10111 2
1 1 1 0 1 2 0 0 0 0 1 2
1 1 0 1 0 2 0 1 1 1 1 2 1 1 0 1 1 2
0 0 0 2 0 1 2 1 0 2 1 1 2
p 1 0 1 0 1 2
1 0 1 0 02
1 0 0 2
Bloc #11
2déborde
00001 2 11010 2 01111 2 11011 2
000 2 001 2 10 2 11 2
p
10111 2
10100 2
100 2 Division du bloc 01 2 ( p = 01 2)
10101 2 11101 2 101 2
Insertion de 11000 2 , 11001 2 et 10110 2
0 0 0 0 1 2 1 1 0 1 0 2 0 1 1 1 1 2 1 1 0 1 1 2
0 0 0 2 0 0 1 2 1 0 2 1 1 2
p
1 0 1 1 1 2
1 0 1 0 0 2 1 0 0 2
1 0 1 0 1 2 1 1 1 0 1 2 1 0 1 2
1 1 0 0 0 2 0 0 0 0 1 2 1 1 0 0 1 2
1 1 0 1 0 2 1 0 1 1 0 2
0 1 1 1 1 2 1 1 0 1 1 2
0 0 0 2 0 0 1 2 1 0 2 1 1 2
p
1 0 1 1 1 2
1 0 1 0 0 2 1 0 0 2
1 0 1 0 1 2 1 1 1 0 1 2 1 0 1 2
Insertion de 10010 2
1 1 0 0 0 2 0 0 0 0 1 2 1 1 0 0 1 2
1 1 0 1 0 2 1 0 0 1 0 2
0 1 1 1 1 2 1 1 0 1 1 2
0 0 0 2 0 0 1 2 0 1 0 2 1 1 2
p 1 0 1 1 1 2
1 0 1 0 0 2 1 0 0 2
D i v i s i o n d u b l o c 1 0 2 (p = 1 0 2)
1 0 1 0 1 2 1 1 1 0 1 2 1 0 1 2
1 0 1 1 0 2 1 1 0 2 1 1 0 0 0 2 0 0 0 0 1 2
1 1 0 0 1 2
1 1 0 1 0 2 1 0 1 1 0 2
0 1 1 1 1 2 1 1 0 1 1 2
0 0 0 2 0 0 1 2 1 0 2 1 1 2
p
1 0 1 1 1 2
1 0 1 0 0 2 1 0 0 2
1 0 1 0 1 2 1 1 1 0 1 2 1 0 1 2
Bloc #10
2déborde et est
divisé
Insertion de 01101 2
1 1 0 0 0 2 0 0 0 0 1 2 1 1 0 0 1 2
1 1 0 1 0 2 1 0 0 1 0 2
0 1 1 1 1 2 1 1 0 1 1 2
0 0 0 2 0 0 1 2 0 1 0 2 1 1 2
p 1 0 1 1 1 2
1 0 1 0 0 2 1 0 0 2
1 0 1 0 1 2 1 1 1 0 1 2 1 0 1 2
1 0 1 1 0 2 1 1 0 2
Bloc #101
2déborde
–
zone d ’expansion !
Fin de l ’expansion
p := 0
d := d+1 = 3
1 1 0 0 0 2 0 0 0 0 1 2 1 1 0 0 1 2
1 1 0 1 0 2 1 0 0 1 0 2
1 1 0 1 1 2
0 0 0 2 0 0 1 2 0 1 0 2 0 1 1 2
p
1 0 1 0 0 2 1 0 0 2
D i v i s i o n d u b l o c 1 1 2
1 0 1 0 1 2 1 1 1 0 1 2 1 0 1 2
1 0 1 1 0 2 1 1 0 2 0 1 1 0 1 2
0 1 1 1 1 2 1 0 1 1 1 2 1 1 1 2
d = 3
3.3.2.1.1 Variantes du hachage linéaire
Variante du contrôle de la division
–
algorithme de base
débordement => division : taux d ’occupation ~ 60%
–
division/fusion contrôlée par taux d ’occupation
Variante de gestion des débordements
–
hachage linéaire au niveau suivant
Variante de division
–
biais dans les chaînages (à droite de p)
–
expansions partielles
diviser n blocs en n+1
–
fonction de hachage exponentielle
Gestion de l ’espace d ’adressage primaire
–
préserver la contiguité de l ’espace malgré expansions ?
3.3.2.2 Hachage extensible
Ajoute un niveau d ’indirection
Répertoire d'adresses de paquets
– espace supplémentaire
– accès disque supplémentaire pour répertoire
antémémoire
Bloc qui déborde est divisé
– pas de dégradation due au chaînage
– pire cas : 2 transferts
Analogie avec arbre digital
Répertoire vu comme arbre digital
Chemin = suffixe
Pas de lien direct entre suffixe et #bloc
1 0 1 0 0 2 1 1 0 0 0 2
0 1
0 1 0 1 0 2 0 1 1 1 0 2
0 1 1 0 0 0 1 2
1 1 1 0 1 2
B l o c 0
B l o c 1
B l o c 2
Insertion de h(clé) = 10011 2
Débordement et division du bloc #1
Utilisation d ’un bit de plus
1 0 1 0 0
21 1 0 0 0
20 1
0 1 0 1 0
20 1 1 1 0
20 1 1 0 0 0 1
21 1 1 0 1
2B l o c 0
B l o c 1
B l o c 2
1 0 1 0 0
21 1 0 0 0
20 1
0 1 0 1 0
20 1 1 1 0
20 1
1 0 0 0 1
21 1 1 0 1
2B l o c 0 B l o c 2 B l o c 1
0 1
1 0 0 1 1
2B l o c 3
«Remplacer» l'arbre digital par un répertoire
1 0 1 0 0
21 1 0 0 0
20 1
0 1 0 1 0
20 1 1 1 0
20 1 1 0 0 0 1
21 1 1 0 1
2B l o c 0
B l o c 1
B l o c 2
1 0 1 0 0
21 1 0 0 0
20 1
0 1 0 1 0
20 1 1 1 0
20 1
1 0 0 0 1
21 1 1 0 1
2B l o c 0 B l o c 2 B l o c 1
0 1
« Compléter » l ’arbre
Arbre digital => un répertoire
1 0 1 0 0
21 1 0 0 0
20 1
0 1 0 1 0
20 1 1 1 0
20 1
1 0 0 0 1
21 1 1 0 1
2B l o c 0 B l o c 2 B l o c 1
0 1
Bijection chemin <-> indice
1 0 1 0 0
21 1 0 0 0
22 1 0 0 0 1
21 1 1 0 1
21 0 1 0 1 0
20 1 1 1 0
22
2
0 0
20 1
21 0
21 1
2P r o f o n d e u r g lo b a l e d u r é p e r t o i r e ( d )
P r o f o n d e u r lo c a le d u
b lo c
Sens de
lecture
des
indices
Insertion de h(clé) = 10011 2 avec répertoire
1 0 1 0 0
21 1 0 0 0
2B l o c 0
2 1 0 0 0 1
21 1 1 0 1
2B l o c 1
1 0 1 0 1 0
20 1 1 1 0
2B l o c 2 2
2
0 0
20 1
21 0
21 1
2P r o f o n d e u r g lo b a l e d u r é p e r t o ir e ( d )
P r o f o n d e u r lo c a le d u
b lo c
1 0 1 0 0
21 1 0 0 0
22 1 0 0 0 1
21 1 1 0 1
22 0 1 0 1 0
20 1 1 1 0
22
2
0 0
20 1
21 0
21 1
2P r o f o n d e u r g lo b a l e d u r é p e r t o i r e ( d )
P r o f o n d e u r l o c a l e d u
b l o c
1 0 0 1 1
22
Cas de dédoublement de répertoire : insertion de h(clé) = 10110 2
1 0 1 0 02 1 1 0 0 02 B l o c 0
2 1 0 0 0 1 2
1 1 1 0 1 2 B l o c 1
1 0 1 0 1 02
0 1 1 1 02 B l o c 2 2 2
0 02 0 12 1 02 1 12
P r o f o n d e u r g lo b a l e d u r é p e r t o ir e ( d )
P r o f o n d e u r lo c a le d u
b lo c
1 0 1 0 02 1 1 0 0 02
0 1
0 1 0 1 02 0 1 1 1 02
0 1 1 0 0 0 12
1 1 1 0 12
B l o c 0
B l o c 1 B l o c 2
1 0 1 0 02 1 1 0 0 02
0 1
0 1 1 0 0 0 12
1 1 1 0 12
B l o c 0
B l o c 1
0 1 0 1 02 0 1 1 1 02 1 0 1 1 02
0 1
B l o c 2 B l o c 3
1 0 1 0 02 1 1 0 0 02
0 1
0 1
1 0 0 0 12 1 1 1 0 12 0 1 0 1 02 0 1 1 1 02
1 0 1 1 02
0 1 0 1
0 1
0 1
0 1 1 0 1 0 02
1 1 0 0 02 B l o c 0
2 1 0 0 0 12
1 1 1 0 12 B l o c 1
1 0 1 0 1 02
B l o c 2 3 3
0 0 02 0 0 12 0 1 02 0 1 12 1 0 02 1 0 12 1 1 02 1 1 12
0 1 1 1 02 1 0 1 1 02 B l o c 3 3
Profondeur locale dépasse
profondeur globale
Hachage extensible (suite)
Occupation d ’espace
– comportement oscillatoire assez prononcé
entre .53 et .94
moyenne : ln 2 = .69
Variation
– contrôle de la division par taux d ’occupation
– gestion des débordements
3.3.3 Réalisation de l'accès par IDE avec le hachage
Hachage statique
– bloc d ’ancrage fixe
– IDE = idFichier, #blocAncrage, #séquence
HASH CLUSTER d ’Oracle
– applicable dans le cas non unique
Cas d ’une clé de hachage unique
– IDE = id_fichier, valeur de la clé unique
– nécessaire avec hachage dynamique
3.3.4 Hachage sur une clé non unique et effet de grappe
Regroupement des mêmes valeurs de clé
– v 1 = v 2 h(v 1 ) = h(v 2 )
6 0 E r a b l e a r g e n t é 1 5 . 9 9
9 0 P o m m i e r 2 5 . 9 9
8 1 C a t a l p a 2 5 . 9 9
7 0 H e r b e à p u c e 1 0 . 9 9
4 0 E p i n e t t e b l e u e 2 5 . 9 9
1 0 C è d r e e n b o u l e 1 0 . 9 9
4 3 M a g n o l i a 2 8 . 9 9
2 0 S a p i n 1 2 . 9 9
5 0 C h ê n e 2 2 . 9 9
9 5 G é n é v r i e r 1 5 . 9 9
8 0 P o i r i e r 2 6 . 9 9
0
1
2
1 5
2 0 1
6
2 0 6 1 5
1 1 5
1
5
5 2 P i n 1 8 . 9 9 1 5
h(t a il l e) = t a il l e M O D 3
t a il l e
3.3.5 Hachage secondaire
Hachage sur
– (clé de hachage, IDE)
3.4 Tableau comparatif des organisations
Critère Sériel Arbre-B+
primaire Arbre-B+
secondaire Hachage
statique Hachage dynamique Sélection par égalité sur
clé unique O(N/ FB)
Cas moyen : O(N/ FB/ 2)
O(log (N)) O(log (N)) Meilleur cas :O(1)
Pire cas : O(N/ FB)
Meilleur cas :O(1)
Pire cas : O(N/ FB) Sélection par égalité sur
clé non unique O(N/ FB) O(log (Card(clé))+
Sel/ FB) Approche par duplication O(log (N)+
Sel)
Meilleur cas : O(Sel/ FB) Pire cas : O(N/ FB)
Meilleur cas : O(Sel/ FB) Pire cas : O(N/ FB) Sélection par intervalle O(N/ FB) O(log (Card(clé))+
Sel/ FB) O(log (N)+
Sel) O(N/ FB) O(N/ FB)
Itération sérielle O(N/ FB) O(N) O(N/ FB) O(N/ FB)
Itération séquentielle O(tri) O(N/ FB) O(N) O(tri) O(tri)
Insertion/ suppression O(1) O(log N) O(log N) Meilleur cas
:O(1)
Pire cas : O(N/ FB)
Meilleur cas :O(1)
Pire cas : O(N/ FB) Taux d'occupation
mémoire secondaire Maximal
approche 100% En moyennne :
66% (2/ 3) Ajouter à
l'organisation primaire
~80%À ajuster Pire cas non borné
~69% (ln 2) Peut augmenter au prix d'une diminution de performance.
Autres considérations Support difficile de l'accès par IDE et donc des organisations secondaires
Peut y avoir plusieurs index secondaires sur la même table
Distribution des clés par fonction de hachage ? Problème avec tables volatiles
Disponibilité restreinte