Académique Documents
Professionnel Documents
Culture Documents
Introduction :
B-Tree est un arbre de recherche auto-équilibré. Dans la plupart des autres
arbres de recherche à équilibrage automatique (comme AVLet Red-Black Trees),
on suppose que tout est dans la mémoire principale. Pour comprendre
l'utilisation des B-Trees, nous devons penser à l'énorme quantité de données qui
ne peuvent pas tenir dans la mémoire principale. Lorsque le nombre de clés est
élevé, les données sont lues à partir du disque sous forme de blocs. Le temps
d'accès au disque est très élevé par rapport au temps d'accès à la mémoire
principale. L'idée principale de l'utilisation de B-Trees est de réduire le nombre
d'accès au disque. La plupart des opérations sur l'arbre (recherche, insertion,
suppression, max, min, ..etc ) nécessitent des accès disque O(h) où h est la
hauteur de l'arbre. L'arbre B est un gros arbre. La hauteur des B-Trees est
maintenue basse en mettant le maximum de clés possibles dans un nœud B-
Tree. En règle générale, la taille du nœud B-Tree est maintenue égale à la taille du
bloc de disque.
Complexité temporelle de B-Abres :
Propriétés de B-Abres :
Solution:
Dans cet exemple, nous pouvons voir que notre recherche a été réduite en
limitant simplement les chances où la clé contenant la valeur pourrait être
présente. De même, si dans l'exemple ci-dessus, nous devons rechercher 180, le
contrôle s'arrêtera à l'étape 2 car le programme trouvera que la clé 180 est
présente dans le nœud actuel. Et de la même manière, s'il s'agit de rechercher 90,
alors en tant que 90 < 100, il ira automatiquement au sous-arbre de gauche et le
flux de contrôle ira donc de la même manière que celui illustré dans l'exemple ci-
dessus.
Comme discuté ci-dessus, pour insérer une nouvelle clé, nous descendons de la
racine à la feuille. Avant de descendre jusqu'à un nœud, nous vérifions d'abord si
le nœud est plein. Si le nœud est plein, nous le divisons pour créer de
l'espace. Voici l'algorithme complet.
Insertion
1) Initialisez x en tant que root.
2) Tant que x n'est pas une feuille, procédez comme suit
.. a) Trouvez l'enfant de x qui va être traversé ensuite. Que l'enfant soit y.
.. b) Si y n'est pas plein, changez x pour pointer vers y.
.. c) Si y est plein, divisez-le et changez x pour pointer vers l'une des deux parties
de y. Si k est plus petit que la clé médiane dans y, alors définissez x comme
première partie de y. Sinon deuxième partie de y. Lorsque nous divisons y, nous
déplaçons une clé de y vers son parent x.
3) La boucle de l'étape 2 s'arrête lorsque x est une feuille. x doit avoir de l'espace
pour 1 clé supplémentaire car nous avons divisé tous les nœuds à
l'avance. Insérez donc simplement k dans x.
Notez que l'algorithme suit le livre de Cormen. Il s'agit en fait d'un algorithme
d'insertion proactif où avant de descendre sur un nœud, on le divise s'il est
plein. L'avantage de diviser avant est que nous ne parcourons jamais un nœud
deux fois. Si nous ne divisons pas un nœud avant d'y descendre et ne le divisons
que si une nouvelle clé est insérée (réactive), nous pouvons finir par traverser à
nouveau tous les nœuds de la feuille à la racine. Cela se produit dans les cas où
tous les nœuds sur le chemin de la racine à la feuille sont pleins. Ainsi, lorsque
nous arrivons au nœud feuille, nous le divisons et déplaçons une clé vers le
haut. Déplacer une clé vers le haut entraînera une division du nœud parent (car le
parent était déjà plein). Cet effet en cascade ne se produit jamais dans cet
algorithme d'insertion proactif. Il y a cependant un inconvénient à cette insertion
proactive, nous pouvons faire des scissions inutiles.
Insérons maintenant 20, 30, 40 et 50. Ils seront tous insérés dans la racine car le
nombre maximum de clés qu'un nœud peut accueillir est de 2*t - 1 qui est 5.
Insérons maintenant 60. Puisque le nœud racine est plein, il sera d'abord divisé
en deux, puis 60 sera inséré dans l'enfant approprié.
Insérons maintenant 70 et 80. Ces nouvelles clés seront insérées dans la feuille
appropriée sans aucune division.