Recherche

publicité
INFO 2014
Fichiers et base de données
Philippe Fournier-Viger
Département d’informatique, U.de Moncton
Bureau D216,
[email protected]
2015
1
Calendrier
TP1 énoncé
TP2 énoncé
2
L’INDEXATION
3
Introduction


Plusieurs applications demandent de traiter
une grande quantité d’information qui ne
peut pas être stockée en mémoire vive.
Ex.:
◦
◦
◦
◦

inventaire d’un grand magasin,
historique d’information météorologique,
dossiers médicaux de patients d’un hôpital,
données sur les joueurs d’un jeu massivement
multi joueur.
Cette information est stockée dans de
grands fichiers ou bases de données.
4
Introduction (suite)

Plusieurs opérations peuvent être requises:
◦ insérer, supprimer, rechercher…
En particulier, la recherche est une fonction
clé pour de nombreuses applications traitant
de grand fichiers ou base de données.
 La performance est souvent importante.
 Considérons le scénario de la recherche
dans un fichier stocké sur le disque dur.


5
La structure de fichier que nous
considérerons
Matricule
1234567666
Nom
Roy
Prénom
Linda
Programme
Administration
1234567777
1234569999
1234568888
Sauvé
Pierre
Sauvé
Paul
Marc
Paul
Éducation
Biologie
Informatique
…
…
….
…
1234568668
Fournier
Jean
Informatique
enregistrements
champ
de taille fixe ou variable,
de différents types (date, entier, etc.)
6
La structure de fichier que nous
considèrerons (suite)
Matricule
1234567666
Nom
Roy
Prénom
Linda
Programme
Administration
1234567777
1234569999
1234568888
Sauvé
Pierre
Sauvé
Paul
Marc
Paul
Éducation
Biologie
Informatique
…
…
….
…
1234568668
Fournier
Jean
Informatique
clé primaire
(valeurs uniques)
clés secondaires
(valeurs pas nécessairement uniques)
Comment faire la recherche dans un tel fichier sur disque?
7
Recherche
Solution 1: Recherche séquentielle.
 Supposons un fichier non trié.
 Parcourir le fichier séquentiellement sur le disque
jusqu’à ce qu’on trouve la clé.
 Très coûteux, en moyenne n / 2 où n est la taille du
fichier.
8
Recherche
Solution 2: Hachage.
 Concevoir une fonction de hachage sur une clé.
 La fonction de hachage permet de calculer la position
de l’enregistrement sur le disque.
Clé
Fonction de
hachage
Emplacement sur le disque
9
Recherche
Solution 2: Hachage (suite)
 Efficient seulement pour des recherches par clé.
 Or, pour certaines applications, l’utilisateur
désire faire des requêtes plus complexes telles
que:
◦ trouver l’enregistrement avec la valeur de clé la plus
grande,
◦ parcourir les enregistrement par ordre de valeur de
clé,
◦ trouver tous les enregistrements avec une clé dans un
intervalle donné.
10
Recherche
Solution 2: Hachage (suite)
 De plus, la performance O(1) se dégrade s’il y a des
collisions (plusieurs accès disque peuvent être nécessaires).
 Hachage ouvert
Hachage par sceau
table de hachage
débordement
11
Recherche (suite)
Solution 3: Utilisé un fichier trié
 Trier le fichier selon la clé qui nous intéresse avec un
algorithme de tri externe.
 Utiliser un algorithme de recherche pour une liste
triée (ex.: recherche par interpolation, recherche
binaire…).
 Cela ne fonctionne qui si l’on effectue des recherches
toujours sur la même clé.
 Or en pratique, l’utilisateur désire souvent effectuer
des recherches avec plusieurs clés.
 De plus, si un nouvel enregistrement était inséré,
il faudrait potentiellement trier à nouveau.
12
Recherche (suite)
Solution 3: Utilisé un fichier trié (suite)
 Utiliser une liste auto-organisée ou triée par
fréquence ne règlerait pas le problème.
13
Recherche (suite)
Solution 4: Utiliser des index
 Un index est:
◦ un ensemble de paires
<clé, pointeur> associant une clé à l’emplacement d’un
enregistrement dans le fichier.
◦ un ordonnancement logique sur les enregistrements.

Indexation: processus de création d’un index.
Le fichier
index sur le matricule
Matricule
Pointeur
1234567666
octet 0
1234577777
octet 128
1234569999
octet 256
1234588888
octet 512
14
Recherche (suite)
On peut construire un index pour chaque clé
Exemple:
index sur le matricule
Le fichier
Matricule
Pointeur
1234567666
octet 0
1234577777
octet 128
1234569999
octet 256
1234588888
octet 384
index sur le nom
Nom
Un index pourrait être une liste triée par
clé ou bien un arbre pour avoir de
meilleures performances de recherche!
Pointeur
Pierre
octet 256
Roy
octet 0
Sauvé
octet 128
Sauvé
octet 384
15
Observation
Les recherches sont rarement faites sur la
clé primaire, mais plutôt sur les clés
secondaires (ex.: salaire plutôt que le # de
matricule).
clé primaire (matricule)
Matricule
1234567666
1234567777
1234569999
Nom
Roy
Sauvé
Pierre
clé secondaire (salaire)
Prénom
Linda
Paul
Marc
Salaire
500 $
1500 $
500 $
16
Index
Un index sur une clé primaire est appelé un
index primaire.
 Un index sur une clé secondaire est appelé
un index secondaire.
 Un index secondaire peut référer à des clés
d’un index primaire plutôt qu’un pointeur
vers le fichier.
 Généralement, il y a un seul index primaire
et un ou plusieurs index secondaires.

17
L’indexation
La création des index.
Un processus important dans tout système de
gestion de bases de données.
 Plusieurs méthodes d’indexation telles que:


◦ hachage,
 recherche par clé seulement
◦ une simple liste triée par clé:
 peu efficient pour insertion et suppression,
◦ utiliser un index en arbre
 B-Arbre, B+Arbre…
 le type d’indexation le plus utilisé pour de larges bases de
données stockées sur disque.
 insertion, suppression, recherche par intervalle…
18
L’indexation (suite)
Défis:
pouvoir réaliser toutes les opérations utiles
(recherche par clé, par intervalle, etc.)
 minimiser les accès disque requis pour les
opérations désirées,
 minimiser les accès disque pour l’ajout ou la
suppression d’enregistrements et la mise à jour
des index,
 …

19
INDEXATION LINÉAIRE
20
Index linéaire

Un index linéaire est une séquence de paires
<clé, pointeur> où chaque pointeur indique
soit:
◦ la position d’un enregistrement sur le disque,
◦ ou bien une clé primaire dans l’index primaire,
Illustration:
(trié)
(pas trié)
21
Index linéaire (suite)
Un index linéaire peut être stockée en mémoire
vive ou sur disque (dépendant de la taille),
Avantages d’un index linéaire:
 permet un accès simple à des enregistrements de taille
variable,
 recherche et accès aléatoire efficient grâce à la
recherche binaire.

(trié)
(pas trié)
22
Index linéaire à deux niveaux



Si un index linéaire ne peut entrer en mémoire
vive, il doit être stocké sur le disque.
Dans ce cas, la recherche binaire devient moins
efficace.
une solution: deux niveaux d’index.
◦ un index sur le disque
( « index de niveau 1 »),
◦ un index sur l’index en mémoire vive
( « index de niveau 2 »).
Exemple 
23
Index linéaire de niveau 1 (sur le disque)
Stocké sur des secteur de 1024 octets.
sur disque dur
en mémoire vive
Index linéaire de niveau 2 (en mémoire vive)
Des paires <clé, pointeur> indiquant la première valeur de clé de chaque secteur
de l’index de niveau 1.
Recherche:
1. L’index de niveau 2 est consulté pour trouver la plus grande valeur
inférieure ou égale à la clé cherchée,
2. Le secteur correspondant de l’index de niveau 1 est chargé en
mémoire.
3. Une recherche binaire est faite dans le secteur pour obtenir
l’emplacement de l’enregistrement sur le disque.
24
Index linéaire à deux niveaux(suite)
Taille de l’index de niveau 2 (en mémoire vive)
Si 500 secteurs contenant 10,000 enregistrements, l’index
de niveau 2 ne contiendra que 500 entrées.
Coût d’une recherche?
2 accès disque (un pour lire le secteur de l’index de
niveau 1 et un pour l’accès à l’enregistrement).
Insertion/suppression d’un enregistrement:
coûteux! demande de mettre à jour tous les index de
niveau 2 (possiblement de tout décaler…).
25
Index à deux dimensions
Considérons un index à deux niveaux sur une clé
secondaire tel que « Nom ».
 Si plusieurs enregistrements possèdent la même valeur
pour la clé secondaire, il se peut que l’index de
niveau 2 contiennent plusieurs entrées correspondant
aux mêmes valeurs.
 Ceci peut représenter un gaspillage d’espace.
Un fichier:

clé secondaire
clé primaire
AA10
Jones
Paul
..
AB12
Jones
Marc
…
AB39
Jones
Luc
…
AX33
Smith
John
…
…
…
…
..
26
Index linéaire à deux dimensions (suite)
Une solution:
 Pour l’index de niveau 2 (en mémoire vive), un tableau a deux
dimensions : une clé secondaire et une clé primaire.
 Permet de chercher par clé secondaire en premier, puis par clé
primaire (ex.: par recherche binaire sur la clé secondaire).
clés primaires ou pointeurs
clés secondaires
(rangées)
27
Index linéaire à deux dimensions (suite)
L’insertion/suppression d’un enregistrement
demande de mettre à jour une seule ligne.
 Si une nouvelle clé secondaire, alors une ligne
est ajoutée au tableau.
 Problème: taille fixe, espace inutilisé.

clés primaires ou pointeurs
clés secondaires
(rangées)
28
Index linéaire à deux dimensions (suite)
Une meilleure solution:
 Liste inversée: un
tableau et des listes
chaînées.
 Efficient en mémoire vive,
moins sur le disque, car
une liste chaînée peut
être stockée sur plusieurs
secteurs.
clés
secondaires
clés
primaires
ou
pointeurs
On dit « inversée » car les accès se font par la clé secondaire, puis par la clé primaire.
29
Une alternative:
Toutes les listes chaînées sont stockées
dans un même tableau.
Pourrait permettre d’économiser de
l’espace..
30
L’APPROCHE
D'INDEXATION ISAM
(UNE APPROCHE HISTORIQUE PAR IBM
NOMMÉE ISAM: INDEXED SEQUENTIAL ACCESS
METHOD
~1974)
31
Introduction
Les approches à base d’index linéaires ont en
général des difficultés avec les mises à jour
fréquentes.
◦ risque de décalage complet!
Les listes inversées aident à résoudre ce
problème, mais seulement si le nombre de valeurs
de clé secondaire est largement inférieur au
nombre d’enregistrements.
 Nous discuterons de l’approche ISAM, une
tentative de résoudre le problème de la gestion
de grandes bases de données.
 Puis, nous verrons comment une approche à base
d’arbre en pallie les problèmes.

32
ISAM





Développé par IBM.
Une tentative pour gérer de
grandes bases de données.
Les enregistrements sont
triés par clé primaire.
Un fichier est divisé sur
plusieurs cylindres sur le
disque.
Les données sur chaque
cylindre sont une partie de
liste triée.
33
ISAM (suite)
Un cylindre n’est pas rempli.
Une zone appelée
« débordement de
cylindre » est laissée vide.
 En mémoire, une table indique
la plus petite valeur pour
chaque cylindre.
 Les nouveaux enregistrements
sont insérés dans la zone
« débordement de
cylindre » de cylindre
approprié.
 Si un cylindre est plein, une
zone de débordement globale
est utilisée.

34
ISAM (suite)
Les étapes de la recherche avec
ISAM:
1. Déterminer le cylindre contenant
l’information en utilisant la table
globale,
2. Consulter le bloc index du cylindre
pour déterminer le bloc à consulter.
3. Si l’enregistrement est trouvé, la
recherche est terminée.
4. Sinon, chercher dans la zone de
débordement du cylindre.
5. Si non trouvé et que la zone est
pleine, chercher dans la zone de
débordement globale.
35
Performance

Quand la base de données vient d’être
construite:
◦ très efficient,
◦ seulement deux accès disque pour accéder à un
enregistrement.

Toutefois, après plusieurs insertions:
◦ les zones de débordement s’allongent, ce qui
réduit la performance,
◦ éventuellement, la zone globale peut se remplir
aussi, ce qui détériore davantage la performance
36
Performance (suite)
une « solution » est de périodiquement
restructurer la base de données en
profondeur.
 Ceci demande de:

◦ balancer le nombre d’enregistrements par
cylindres,
◦ trier les enregistrements dans chaque
cylindre,
◦ mettre à jour la table globale,
◦ mettre à jour l’index pour chaque cylindre.
37
MyISAM
Dans MySQL < 5.5, il était possible d’utiliser un
stockage en utilisant une version de ISAM
nommée « MyISAM ».
 « MyISAM » est offert en option dans MariaDB.
 Utile pour des applications où la lecture des
données est intensive et peu de modifications.
 Limites importantes: ne supporte pas les clés
étrangères, l’intégrité référentielle et le concept
de transactions.

38
INDEXATION À BASE
D’ARBRES
39
Introduction
L’indexation linéaire est efficiente quand
la base de données est statique.
 ISAM est efficient pour des mises à jour
limitées.
 Un autre problème avec ISAM est lorsque
l’index global ne peut pas être stocké en
mémoire vive à cause d’un trop grand
nombre de cylindres pour stocker le
fichier.

40
Introduction (suite)

De façon générale, une application de base
de données a les caractéristiques suivantes:
◦ un grand nombre d’enregistrements mis à jour
fréquemment,
◦ la recherche est faite en combinant une ou
plusieurs clés,
◦ la recherche par intervalle ou par minimum ou
maximum est utilisée.

Il faut donc trouver une meilleure
organisation…
41
Arbres binaires?

On pourrait utiliser des arbres binaires
pour les index plutôt que des listes.
◦ un arbre binaire peut stocker des données en
double
◦ insertion/suppression, recherche efficiente,
◦ recherche par intervalle,..

En mémoire vive, cela fonctionnerait bien.
42
Arbres binaires? (suite)
Toutefois les arbres peuvent être débalancés
(souvent par un facteur de 2 ou plus).
 En mémoire vive, ce n’est pas un problème, car
O(log n).
 Sur disque, par contre, cela a un grand impact.

◦ Tous les nœuds d’un chemin doivent être lu à partir
du disque,
◦ Dans le pire cas, les nœuds sont sur des blocs
différents.
◦ Plus un chemin est long, plus il y a d’accès disque.
◦ Un bassin de tampon aiderait, mais ne réglerait pas le
problème…
43
Illustration (pire cas)
1
2
• Dans ce cas, l’arbre binaire
opère comme une liste chaînée.
• O(n) opérations.
3
4
44
Arbres binaires? (suite)

Deux problèmes importants à résoudre:
◦ comment s’assurer que l’arbre reste balancé?
◦ comment arranger les feuilles sur des blocs de
façon à réduire le nombre de blocs à lire pour
tous les chemins?

Ajouter une technique de balancement à un
arbre binaire et allouer les nœuds à des
blocs?
◦ difficile à réaliser pour insertions et suppressions
sans faire des réorganisations majeures.
Exemple 
45
Exemple
arbre initial
résultat
L’élément « 1 » est inséré dans l’arbre.
Balancer l’arbre requiert de réorganiser l’arbre au
complet.
46
Une solution

Choisir un autre type d’arbre qui permet le
balancement et peut être modifié pour
stocker les nœuds par blocs tel que:
◦
◦
◦
◦

arbre AVL
arbre splay (section 13.2)
arbre 2-3
…
Nous discuterons des arbres 2-3, ce qui
nous amènera aux B arbres, puis
B+ arbres.
47
LES ARBRES 2-3
48
Arbres 2-3

Trois propriétés:
1. Un nœud contient une ou deux clés,
2. Chaque nœud interne a deux fils (s’il contient une
clé) ou trois fils (s’ils contient deux clés)
3. L’arbre est toujours balancé (toutes les feuilles
sont au même niveau).
49
Arbres 2-3
Propriétés pour la recherche:
 Toutes les valeurs du sous-arbre de gauche sont
inférieures à la valeur de la première clé.
 S’il y a un arbre à droite, alors toutes les valeur du
sous-arbre du centre sont inférieures à la valeur de la
deuxième clé, et les valeurs du sous-arbre de droite
sont plus grandes que la valeur de la deuxième clé.
50
Arbres 2-3
Un nœud contient des enregistrements
complets ou des pointeurs.
 Les feuilles peuvent contenir une ou deux clés.

51
Arbres 2-3 - Classe « Nœud »
variables
méthodes
52
Arbres 2-3 - Classe « Nœud »
(suite)
Observations:
 La classe « Nœud » ne distingue pas
entre nœud et feuille. Elle est donc
inefficiente, car trois pointeurs seront
inutilisés pour les feuilles.
 La classe « Nœud » est une classe
« privée » utilisée par la classe « Arbre »
(non présentée).
53
Arbres 2-3
Au minimum combien de feuilles un arbre
2-3 de hauteur k possède t’il?
 Si chaque nœud a deux fils, cela devient un
arbre binaire. Donc, un arbre de taille k doit avoir
aura au moins 2k-1 feuilles
 Ex.: k = 4
24-1 = 8

54
Arbres 2-3
Au maximum combien de feuilles un arbre
2-3 de hauteur k possède t’il?
 Si chaque nœud a trois fils, un arbre de taille k
doit avoir aura au plus 3k-1 feuilles
 Ex.: k = 4
34-1 = 27

55
Plus précisément

Un arbre de taille k aura combien de
noeuds?
◦ minimum: 20 + 21 + … + 2k-2 + 2k-1
◦ maximum: 30 + 31 + … + 3k-2 + 3k-1

Exemple: considérons k = 4
◦ 20 + 21 + 22 + 23 = 15 nœuds
◦ 30 + 31 + 32 + 33 = 40 nœuds
56
Arbre 2-3 - recherche
La recherche dans un arbre 2-3 est similaire à la
recherche dans un arbre binaire (les clés d’un
nœud déterminent dans quel arbre chercher).
 Ex.: 30

>
>
<
=
57
Arbre 2-3 - recherche
La recherche dans un arbre 2-3 est similaire à la
recherche dans un arbre binaire (les clés d’un
nœuds déterminent dans quel arbre chercher).
 Ex.: 15

<
>
=
58
Arbre 2-3 - recherche
La recherche dans un arbre 2-3 est similaire à la
recherche dans un arbre binaire (les clés d’un
nœuds déterminent dans quel arbre chercher).
 Ex.: 16

<
>
>
Non trouvé!
59
Arbre 2-3 – recherche (suite)
Méthode pour la recherche d’une clé dans un arbre 2-3.
Retourne un enregistrement de type E.
60
Arbre 2-3 – insertion
Insertion dans un arbre 2-3:
 Similaire à l’insertion dans un arbre binaire sauf
que l’arbre ne croît pas vers le bas comme suite
à l’ajout d’un nœud.
61
Arbre 2-3 – insertion
Exemple 1: insertion de 14 (cas simple)
Première étape: trouver le nœud L qui
contiendrait l’élément s’il était dans l’arbre.
<
>
62
Arbre 2-3 – insertion
Deuxième étape: insérer la valeur.
 Puisque le nœud n’est pas plein, on insère la
valeur directement dans le nœud (cas simple).
<
>
63
Arbre 2-3 – insertion (suite)
Exemple 2: Insertion de 55
Première étape: trouver le nœud L qui contiendrait
l’élément s’il était dans l’arbre.
>
>
>
L
64
Arbre 2-3 – insertion (suite)
Deuxième étape
Si le nœud L est une feuille contenant deux valeurs, alors:
 L est divisé en deux et un nœud L’ est créé.
 L reçoit la plus petite valeur des trois.
 L’ reçoit la plus grande valeur.
 La valeur du milieu est passée au parent avec un pointeur à L’
(promotion). Si le parent contient deux nœuds, le processus est
> >
répété.
>
L
65
Arbre 2-3 – insertion (suite)
Deuxième étape
Si le nœud L est une feuille contenant deux valeurs, alors:
 L est divisé en deux et un nœud L’ est créé.
 L reçoit la plus petite valeur des trois.
 L’ reçoit la plus grande valeur.
 La valeur du milieu est passée au parent avec un pointeur à L’
(promotion). Si le parent contient deux nœuds, le processus
est répété.
L
L’
66
Arbre 2-3 – insertion (suite)
Exemple 3: ajout de 19
S’il est nécessaire de diviser le nœud racine, alors cela ajoutera un
nouveau niveau à l’arbre.
>
<
<
Il faut diviser, mais comme il y
déjà trois nœuds fils du parent, il
faudra aussi diviser le nœud
parent
67
Arbre 2-3 – insertion (suite)
Exemple 3: ajout de 19
S’il est nécessaire de diviser le nœud racine, alors cela ajoutera un
nouveau niveau à l’arbre.
68
Arbre 2-3 – insertion (suite)
Exemple 3: ajout de 19
S’il est nécessaire de diviser le nœud racine, alors cela ajoutera un
nouveau niveau à l’arbre.
69
Arbre 2-3 – insertion (suite)
Exemple 3: ajout de 19
S’il est nécessaire de diviser le nœud racine, alors cela ajoutera un
nouveau niveau à l’arbre.
70
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
71
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
50
72
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
50 60
73
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
60
50
70
74
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
60
40 50
70
75
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
40 60
30
50
70
76
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
40 60
20 30
50
70
77
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
40
20
10
30
60
50
70
78
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
40
20
10
30
60
50
70 80
79
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
40
20
10
30
60 80
50
70
90
80
Exercice
Création d’un arbre 2-3 en insérant
successivement les nombres:
50, 60, 70, 40, 30, 20, 10, 80, 90, 100
Résultat final:
40
20
10
30
60 80
50
70
90 100
81
Arbre 2-3 – insertion – le code
Paramètres:
• rt: racine du sous
arbre courant.
• k: la clé de
l’enregistrement à
insérer
• e: l’enregistrement à
insérer.
Retourne:
• pointeur vers un
nœud
• Si rt est inchangé, un
pointeur vers rt.
• Si changé, un
pointeur vers la
nouvelle racine du
sous-arbre
82
83
Traverser un arbre 2-3 en ordre croissant
de clés (ordre infixe)
visite(nœud* courant)
1. SI courant.filsgauche != null
visite(courant.filsgauche);
2. Écrire courant.clégauche;
3. Si courant.filscentre != null
visite(courant.filscentre);
4. Écrire courant.clédroite;
5. Si courant.filsdroit != null
visite(courant.filsdroit);
40
20
10
30
60
50
70 8084
Arbre 2-3 – suppression (suite)
Trois cas:
1. Si feuille avec 2 enregistrements.
2. Si feuille avec 1 enregistrement.
3. Si le nœud n’est pas une feuille.
Cas 1: l’enregistrement est enlevé.
Cas 2 et 3: l’enregistrement est remplacé par
un autre qui prend sa place. Si aucun
disponible, des nœuds frères sont fusionnés.
Complexe!
Un exemple 
85
Suppression - exemple
Considérez l’arbre suivant:
50
30
10 20
40
65 90
60
70 8086
99
86
Suppression - exemple
Suppression de 65
50
30
10 20
40
65 90
60
70 8087
99
87
Suppression - exemple
Suppression de 65
 Puisque nœud interne, il faut remplacer 65 par la
valeur suivante selon l’ordre infixe (ordre croissant).
(sera toujours dans une feuille)
 Cette valeur est 70
 80 prendra la place de 70
50
30
10 20
40
65 90
60
70 8088
99
88
Suppression - exemple
50
30
10 20
40
70 90
60
80
89
99
89
Suppression - exemple
Suppression de 70
50
30
10 20
40
70 90
60
80
90
99
90
Suppression - exemple
Suppression de 70
 Puisque nœud interne, il faut remplacer 70 par la
valeur suivante selon l’ordre infixe (ordre
croissant). (sera toujours dans une feuille)
 Cette valeur est 80
50
30
10 20
40
70 90
60
80
91
99
91
Suppression - exemple
Suppression de 70
 (suite)
 Résultat: un nœud est vide!
 Il faut fusionner deux nœuds pour réparer l’arbre.
50
30
10 20
40
80 90
60
92
99
92
Suppression - exemple
Suppression de 70
 (suite)
 Résultat: un nœud est vide!
 Il faut fusionner deux nœuds pour réparer l’arbre.
50
30
10 20
40
80 90
60
93
99
93
Suppression - exemple
Suppression de 70
 (suite)
 Résultat: un nœud est vide!
 Il faut fusionner deux nœuds pour réparer l’arbre.
50
30
10 20
40
90
60 80
99
94
Suppression - exemple
Suppression de 99
 Pour une feuille, on efface simplement la valeur.
50
30
10 20
40
90
60 80
99
95
Suppression - exemple
Suppression de 99
 Pour une feuille, on efface simplement la valeur.
50
30
10 20
40
90
60 80
96
Suppression - exemple
Suppression de 99
 Un nœud est vide. Il faut redistribuer les
valeurs. Puisqu’un frère à une valeur à partager,
on déplace de la façon suivante:
50
30
10 20
40
90
60 80
97
Suppression - exemple
50
30
10 20
40
80
60
90
98
Suppression - exemple
Suppression de 80
 80 est dans un nœud interne, donc on le
remplace par son successeur en ordre infixe qui
est 90.
50
30
10 20
40
80
60
90
99
Suppression - exemple
Suppression de 80
 80 est dans un nœud interne, donc on le
remplace par son successeur en ordre infixe qui
est 90.
50
30
10 20
40
80
60
90
100
Suppression - exemple
Suppression de 80
 80 est dans un nœud interne, donc on le
remplace par son successeur en ordre infixe qui
est 90.
50
30
10 20
40
90
60
101
Suppression - exemple
Suppression de 80
 Pour le nœud vide, on ne peut pas emprunter
de valeur d’un frère, donc on doit fusionner.
50
30
10 20
40
90
60
102
Suppression - exemple
Suppression de 80
 Pour le nœud vide, on ne peut pas emprunter
de valeur d’un frère, donc on doit fusionner.
50
30
10 20
40
60 90
103
Suppression - exemple
Suppression de 80
50
30
10 20
40
60 90
104
Suppression - exemple
Suppression de 80
 Pour le nœud vide, on ne peut pas emprunter
d’un frère, donc on doit fusionner.
50
30
10 20
40
60 90
105
Suppression - exemple
Suppression de 80
 Pour le nœud vide, on ne peut pas emprunter
d’un frère, donc on doit fusionner.
30 50
10 20
40
60 90
106
Suppression - exemple
Suppression de 80
Finalement, puisque la racine est vide, on change
le pointeur de la racine vers le nœud fils.
FIN
30 50
10 20
40
60 90
107
Arbre 2-3
Propriété de balancement
 L’ajout et la suppression n’ajoutent pas de
nœuds en bas de l’arbre.
 Ils provoquent plutôt la fusion ou la division
de nœuds, causant un effet qui peut
remonter jusqu’à la racine.
 La racine peut être divisée pour créer un
nouveau niveau.
 Pour la suppression, si les deux derniers fils
de la racine fusionnent, alors la racine est
retirée et l’arbre perd un niveau.
108
Arbre 2-3
Quel est le coût de la recherche?
 L’arbre est toujours balancé donc le
pire cas, on atteint une feuille à la
profondeur maximale qui est log(n).
 Par conséquent, ajout, recherche et
suppression prennent dans le pire cas
O(log n) temps.
 Dans le meilleur cas, la clé se trouve à la
racine.
109
Comparaison avec arbre binaire
L’arbre 2-3 est toujours balancé.
 L’arbre 2-3 peut nécessiter davantage
davantage d’espace.

◦ Un arbre binaire peut en théorie être stocké
dans un tableau.
110
LES B-ARBRES
111
Les B-arbres

Structure de données attribuée à:
◦ R. Bayer & E. M. McCreight (1972) Organization and
Maintenance of Large Ordered Indices. Acta Informatica 1:
173–189.
En 1979, les B-arbres avaient pratiquement
remplacé toutes autres formes d’indexation pour
de gros fichiers sauf le hachage.
 Les B-arbres sont l’approche standard pour
organiser un fichier pour une application
demandant insertion, suppression et
recherche par intervalle.
 Utilisé pour les bases de données et les systèmes
de fichiers.

112
Les B-arbres (suite)
Les B-arbres adressent les principaux problèmes
d’implémentation d’un arbre de recherche sur
disque:
 un B-arbre est balancé (toutes les feuilles sont
au même niveau)
 la mise à jour et la recherche affectent
seulement quelques blocs du disque,
 les b-arbres conservent les enregistrements
avec des clés similaires sur les mêmes
blocs,
 les b-arbres garantissent que chaque nœud
interne est plein à au moins un
pourcentage minimum (efficience en termes
d’espace et réduit le nombre d’accès disque)
113
Les B-arbres (suite)
Les B-arbres sont une généralisation des
arbres 2-3.
 Les arbres 2-3 sont vus comme des Barbres d’ordre 3.

114
Les B-arbres (suite)
Propriétés d’un arbre d’ordre m
 La racine est soit une feuille ou a au
moins deux fils.
 Chaque nœud interne sauf la racine a
entre m/2 et m fils.
 Un nœud peut avoir au maximum m -1
éléments.
115
Les B-arbres (suite)
Nœud d’un B-arbre:
 Un nœud est équivalent à un bloc sur le
disque.
 Le nombre d’entrées par nœud est
déterminé en fonction de la taille d’un
bloc sur le disque (peut typiquement
contenir plus de 100 clés).
 Les pointeurs vers d’autres nœuds sont
des adresses de bloc (nœud).
116
Les B-arbres (suite)
Exemple: un B-arbre d’ordre 4:
•
•
•
•
•
Cela est en quelque sorte un « arbre 3-4 ».
Chaque nœud a au plus 3 clés.
Un nœud peut avoir jusqu’à 4 fils.
La racine est soit une feuille ou au moins deux fils.
Les nœuds internes ont de 1 à 3 clés
117
Les B-arbres (suite)
Exemple: un B-arbre d’ordre 5:
7 17
1 3 5 6
•
•
•
•
•
9 13
21 25
Cela est en quelque sorte un « arbre 4-5 ».
Chaque nœud a au plus 4 clés.
Un nœud peut avoir jusqu’à 5 fils.
La racine est soit une feuille ou au moins 2 fils.
Les nœuds internes ont de 2 à 4 clés
118
Les B-arbres (suite)
Pour un accès efficient à chaque nœud sur
disque:
 L’accès au B-arbre sur disque se fait
généralement avec un bassin de
tampon avec l’heuristique du plus ancien
utilisé.
119
Recherche dans un B-arbre
La recherche dans un B-arbre est une
généralisation de la recherche dans un
arbre 2-3.
 La recherche débute à la racine de l’arbre.
 La recherche est réalisée par l’alternance
entre deux étapes.

120
Recherche dans un B-arbre (suite)
Étapes de la recherche:
1. Effectuer une recherche binaire sur les
enregistrements du nœud courant.
2. Si l’enregistrement avec la clé cherchée est
trouvé, retourner l’enregistrement.
3. Si le nœud courant est une feuille et que la
clé n’est pas trouvée, la recherche est un
échec.
4. Sinon, suivre la branche appropriée et
répéter le processus.
121
Recherche dans un B-arbre (suite)
Exemple: recherche de 47
(pas présent)
>
(pas présent) >
<
Combien d’accès disque?
3 accès disque
122
Recherche dans un B-arbre (suite)
Exemple: recherche de 46
(pas présent)
>
(pas présent) >
<
(pas présent)
Combien d’accès disque?
3 accès disque
Recherche
infructueuse!
123
Insertion dans un B-arbre
Une généralisation de l’insertion pour l’arbre 2-3.
L’insertion se fait en deux étapes:
 Étape 1:
◦ Trouver le nœud où la valeur serait.
◦ S’il y a assez de place dans le nœud, insérer
l’enregistrement à cet endroit.
◦ Sinon, diviser le nœud en deux, insérez la valeur à cet
endroit, et promouvoir la valeur médiane dans le parent.

Étape 2:
◦ Répéter l’étape 1 pour le parent si nécessaire.
124
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
125
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
10
126
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
10 30
127
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
10 30 50
128
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
10 30 50 70
129
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
10 30 50 70 90
130
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
50
10 25 30
70 90
131
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
50
10 25 30 40
70 90
132
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
50
10 25 30 40
70 90 95
133
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
50
10 25 30 40 45
70 90 95
134
Insertion dans un B-Arbre (suite)
10, 30, 50, 70, 90, 25, 40, 95, 45, 48
B-arbre d’ordre 6
30 50
10 25
40 45 48
70 90 95
Fin !
135
Insertion dans un B-arbre


Ce processus d’insertion garanti que tous les
nœuds internes sauf la racine sont au (m -1)
/ 2 plein.
Exemple:
◦ Un B-arbre d’ordre 5 avec un nœud interne
contenant 4 éléments.
70 90 95 100
◦ Ce nœud a 5 fils.
◦ Si un élément est promu à ce nœud interne, le
nœud est divisé en deux nœuds qui contiendront
chacun 2 éléments avec 3 fils.
70 90
95 100
136
Suppression dans un B-arbre

Deux stratégies pour la suppression:
◦ Localiser et supprimer l’élément, puis
restructurer l’arbre.
◦ Descendre dans l’arbre et restructurer l’arbre
en même temps de telle façon que lorsque
l’élément est trouvé, il peut simplement être
supprimé.
◦ Nous verrons le fonctionnement pour une
variante du B Arbre qui est le B+ arbre
137
B-arbre - complexité
Moyenne
Espace
O(n)
Recherche
O(log(n))
Insertion
O(log(n))
Suppression
O(log(n))
Pire cas
O(n)
O(log(n))
O(log(n))
O(log(n))
138
LES B+ ARBRES
139
Introduction
En pratique, la variante appelée B+ arbre
est la plus utilisée.
 Quand de meilleures performances sont
désirées, une variante appelée B* arbre
peut être utilisée.
 Les B+ arbre:

◦ utilisés notamment dans HFS+ (Apple), NTFS
et ReFS (Microsoft) et ext4 (Linux).
◦ une sorte de croisement entre B-arbres et
index linéaires.
140
Introduction (suite)
Nous avons vu précédemment le concept d’index linéaire.
 Lorsque les données sont statiques, utiliser la recherche binaire
avec un index linéaire est très performant.
 Le problème majeur des index linéaire est comment gérer les
insertions et suppressions.
 De plus un autre problème qui peut survenir est si l’index ne peut
pas être stocké en mémoire vive.

141
Introduction (suite)




Nous avions vu une solution qui est de construire un
index linéaire à plusieurs niveaux (un index sur un
index).
Une autre idée serait de diviser l’index en plusieurs
morceaux. Un bon choix serait de diviser selon la taille
des blocs sur le disque ou un multiple de cette taille.
Si un enregistrement doit être inséré, on peut l’insérer
dans le bloc s’il reste de la place.
Si les enregistrements dans un bloc doivent être un peu
déplacé, ce n’est pas grave, car c’est toujours un accès
disque pour un bloc.
142
Introduction (suite)





Qu’est ce qu’on fait si un bloc est entièrement plein?
On peut le diviser en deux.
Pour la suppression? On peut supprimer
l’enregistrement du bloc tout simplement.
Toutefois, pour de meilleures performances, il est
préférable d’avoir des blocs qui ne sont pas trop vide.
Une solution est de fusionner des blocs adjacents après
une suppression.
Mais comment trouver un enregistrement? Une solution
serait d’utiliser une structure en arbre….
143
Introduction (suite)
Ces idées ont mené aux B+ arbres.
 Un B+ arbre est un mécanisme pour
gérer une liste triée séparés en
morceaux.
 Les B+ arbres sont semblables aux B
arbre, mais ne contiennent des
enregistrements que dans les feuilles.
 En ce sens, les B+ arbres ressemblent aux
index linéaires à plusieurs niveaux.

144
Les B+ arbres
Dans un B+ arbre d’ordre m:
 Les nœuds internes stockent des paires <clé,
pointeur> utilisées pour guider la recherche.
 Les feuilles contiennent les enregistrements ou
des pointeurs vers des enregistrements.
 Dépendant de la taille des enregistrements, une
feuille peut contenir plus ou moins un maximum de
m enregistrements (il est toutefois requis que les
feuilles contiennent assez d’enregistrements pour
être au moins à moitié pleines).
145
Les B+ arbres (suite)


Les feuilles d’un B+ arbre sont généralement liées sous
forme d’une liste doublement chaînée.
Ceci permet de traverser en ordre séquentiel les
enregistrements.
Un B+ arbre d’ordre 4:
Une liste doublement chaînée (rappel):
tête
queue
146
Les B+ arbres (suite)
Classe abstraite pour les « Nœud » de
l’arbre:
147
Recherche dans un B+ arbre
La recherche dans un B+ arbre est effectuée
essentiellement de la même façon que dans un
B arbre, sauf que la recherche continue toujours
jusqu’aux feuilles.
 Exemple: recherche de 33

>=
<
148
Recherche dans un B+ arbre (suite)
Pseudocode:
149
Recherche dans un B+ arbre (suite)
Les B+ arbres sont très efficient pour la
recherche par intervalle.
 Quand le premier enregistrement de l’intervalle
est trouvé, les autres peuvent être accédés
séquentiellement grâce à la liste chaînée.

150
Recherche dans un B+ arbre (suite)
Illustration de la recherche par intervalle
avec [17, 20]
<
<
151
Recherche dans un B+ arbre (suite)
Illustration de la recherche par intervalle
avec [17, 20]
<
<
Quel est le coût en terme d’accès disque ?
152
Insertion dans un B+ arbre
Étapes de l’insertion d’un enregistrement:
 Trouver la feuille qui devrait contenir
l’enregistrement.
 Si la feuille n’est pas pleine, insérez
l’enregistrement.
 Si la feuille est pleine, diviser la feuille en deux et
promouvoir la clé la plus petite du nœud de
droite.
 La promotion peut provoquer la division du
nœud parent et ainsi de suite comme pour les B
arbres.
 Si le nœud racine est divisé, cela entraîne la
création d’un nouveau niveau dans l’arbre.
153
Insertion dans un B+ arbre (suite)
L’insertion préserve la propriété de
balancement (que toutes les feuilles soient au
même niveau dans l’arbre).
 Pseudocode de l’insertion:

154
Insertion dans un B+ arbre (suite)
Exemple d’insertion:
Insérer 50 dans le B+ arbre avec des nœuds internes
contenant maximum 3 clés et des feuilles de 5 clés.
155
Insertion dans un B+ arbre (suite)
Exemple d’insertion:
Après plusieurs autres insertions:
On veut insérer la valeur 30
Cela produit la division de la feuille,
puis la division de son parent.
156
Suppression dans un B+ arbre
Étapes de la suppression:
1. localiser la feuille contenant l’enregistrement à
supprimer.
2. Si la feuille est plus qu’à moitié pleine, alors
supprimer l’enregistrement.
3. Si la feuille est seulement à moitié pleine, alors
quelque chose doit être fait pour préserver la
propriété que les nœuds sont toujours au
moins à moitié plein.
Stratégie 
157
Suppression dans un B+ arbre (suite)

Stratégie:
◦ consulter les feuilles adjacentes pour voir s’il est
possible de transférer des enregistrements à partir de
ces feuilles.
◦ si possible, alors un nombre d’enregistrements est
transféré de façon à équilibrer le nombre
d’enregistrements entre les deux feuilles.
◦ L’équilibrage vise à réduire la probabilité que le
problème se répète éventuellement.
◦ Finalement, il peut être nécessaire de réajuster les
clés du parent.
158
Suppression dans un B+ arbre (suite)
Exemple 1: 18 est supprimé
159
Suppression dans un B+ arbre (suite)
Exemple 1: 18 est supprimé
Note: la clé 18 dans le nœud interne n’est
pas supprimée.
160
Suppression dans un B+ arbre (suite)
Exemple 2: 12 est supprimé de l’arbre
suivant:
L’élément 12 est supprimé,
Maintenant, il faut tenter de déplacer des éléments
d’une feuille adjacente, car la feuille n’est pas assez
pleine. Quel élément ?
161
Suppression dans un B+ arbre (suite)
Exemple 2: 12 est supprimé de l’arbre
suivant:
L’élément 18 a été déplacé.
La clé du parent 18 a été remplacée par 19 pour quelle
indique correctement les intervalles.
162
Suppression dans un B+ arbre (suite)
Que se passe t-il si aucun nœud adjacent ne peut
fournir d’enregistrement?




Les enregistrements de la feuille courante sont
transférés dans un des nœuds adjacents et la feuille
courante est effacée.
Cela est possible, car les nœuds adjacents sont au plus à
moitié plein.
Ce processus de fusion réduit le nombre de fils du
parent et peut dont devoir être répété chez le parent.
Si ce processus atteint la racine, alors l’arbre perd un
niveau.
163
Suppression dans un B+ arbre (suite)
Exemple 3: 33 est supprimé de
l’arbre suivant:
Après la suppression, il n’y a plus assez
d’éléments. Comme il est impossible
d’emprunter d’un nœud adjacent, il y a
aura fusion
164
Suppression dans un B+ arbre (suite)
Exemple 3: 33 est supprimé de
l’arbre suivant:
La fusion a été faite, mais le parent
n’a qu’un seul fils!
Puisque le parent n’a qu’un seul fils et
que son voisin de gauche en a un en
surplus, il y a déplacement.
165
Suppression dans un B+ arbre (suite)
Pseudocode de la suppression:
166
B+ -arbre - complexité
Coût
Recherche
O(log(n))
Insertion
O(log(n))
Suppression O(log(n))
La base du logarithme est le nombre de fils
moyen.
En pratique, les applications utilisent des
valeurs comme 100, ce qui fait des arbres
très peu profond.
167
Quelques observations
Un B+ arbre d’ordre 100 avec un seul niveau peut
avoir au maximum 100 enregistrements.
 Un B+ arbre d’ordre 100 avec 2 niveaux a au
minimum 100 enregistrements et au maximum
10,000 (100 feuilles de 100 enrg.).
 Un B+ arbre d’ordre 100 avec 3 niveaux a au
minimum 5000 enregistrements et au maximum 1
million.
 Un B+ arbre d’ordre 100 avec 4 niveaux a au
minimum 250,000 et au maximum 100 millions
d’enregistrements.

168
Quelques observations (suite)
Pour un B+ arbre d’ordre 100, il est
attendu qu’ environ 1 / 75 des nœuds
soient des nœuds internes.
 Par conséquent la consommation
mémoire des nœuds internes est faible.

169
Optimisations
Stocker les deux plus hauts niveaux de
l’arbre en mémoire vive améliore la
performance et est possible, car ils sont
généralement relativement petits.
 Ceci réduit le nombre d’accès disque.
 Une autre optimisation: utiliser un bassin
de tampons.
…

170
COMPARAISON
B ARBRES ET B+ ARBRES
171
Complexité

Complexité similaire pour opérations de
base:
◦
◦
◦
◦
espace O(n)
recherche O(log(n))
insertion O(log(n))
suppression O(log(n))
172
Stockage des enregistrements

B+ arbre:
◦ seules les feuilles contiennent les enregistrements
ou pointeurs vers les enregistrements.
◦ Les nœuds internes ne servent qu’à orienter la
recherche.

B arbre:
◦ tous les nœuds contiennent des enregistrements
ou pointeurs vers des enregistrements
Dans les deux cas, une feuille peut être un bloc (si
stocké sur disque dur)
173
Stockage en mémoire vive

Stocker les niveaux du haut de l’arbre
peut être réalisé plus facilement avec un
B+ arbre car les nœuds internes ne
contiennent que des clés et donc peuvent
nécessiter moins de mémoire vive.
174
Liste chaînée

Pour un B+ arbre, l’utilisation d’une liste
chaînée permet de faire deux opérations
plus simplement et de façon plus
efficiente:
◦ lecture séquentielle
◦ recherche par intervalle.
175
Propriétés « moitié plein »
B arbre:
1. tous les nœuds sont au moins à moitié plein.
B+ arbre:
1. toutes les feuilles sont au moins à moitié
pleine
2. tous les nœuds internes possèdent au moins
la moitié du nb de fils maximal (sauf la racine
qui doit en avoir >= 2)
176
La recherche

B arbre:
◦ Un enregistrement (ou pointeur) peut être
trouvé dans n’importe quel nœud de l’arbre

B+ arbre:
◦ La recherche atteint toujours les feuilles, car
les enregistrements (ou pointeurs) sont
stockés dans les feuilles.
177
LE QUIZ
178
Questions
Dans quelle(s) situation(s), il serait
préférable d’utiliser un B+ arbre plutôt que
le hachage comme technique d’indexation?
2. Quel est l’avantage de stocker des clés
dans les feuilles d’un B+ arbre plutôt que
des enregistrements?
3. Quel est l’avantage de stocker des
enregistrements dans les feuilles d’un B+
arbre plutôt que des clés?
4. Pourquoi est-t-il requis que les feuilles d‘un
B+ arbre soient à moitié pleines?
1.
179
Questions (suite)
5.
6.
7.
8.
9.
Pourquoi un B arbre est généralement plus
avantageux qu’un arbre 2-3 pour l’indexation
sur disque?
Pourquoi un arbre binaire ne serait pas une
bonne méthode d’indexation sur disque?
Quelle technique suggéreriez-vous d’utiliser
pour la recherche par intervalle dans un fichier
sur disque?
Dans quelles situations, il est utile d’utiliser une
liste auto-organisée?
Dans quelle situations un vecteur de bits est
une bonne technique pour l’indexation?
180
Questions (suite)
10.
Pourquoi utiliser une liste chaînée au
niveau des feuilles d’un B+ arbre?
181
Bibliographie

Shaffer Clifford, A practical introduction to data
structures and algorithm analysis,
edition 3.2., chapitre 10.
182
Téléchargement