CHAPITRE 4 : LA HAUTEUR, ET POURQUOI ELLE RESTE MINUSCULE
Tout l'intérêt du B-arbre tient dans un seul résultat :
sa hauteur est bornée par un logarithme en base t. Comme t vaut
couramment une centaine, cette hauteur est ridiculement petite. Démontrons-le.
L'énoncé
Théorème. Soit T un B-arbre de degré minimal t ≥ 2
contenant n ≥ 1 clés. Alors sa hauteur h vérifie :
h ≤ logt ( (n + 1) / 2 )
Avant de le démontrer, mesurons ce qu'il dit. Pour n = 1 000 000 de
clés :
Degré t
Borne sur h
Accès disque
2
18,9 → 18
18
10
5,7 → 5
5
100
2,8 → 2
2
128
2,7 → 2
2
Deux niveaux pour un million de clés. C'est cela, le gain.
L'idée de la démonstration
Pour majorer la hauteur, on cherche à minorer le nombre de clés : on se
demande quel est le plus petit nombre de clés que peut contenir un
B-arbre de hauteur h. Si même le plus dégarni des arbres de hauteur h
contient beaucoup de clés, alors un arbre contenant peu de clés ne peut pas être
haut.
On majore la hauteur en minorant le remplissage. C'est le
raisonnement type pour toutes les structures équilibrées.
Compter les nœuds, niveau par niveau
Plaçons-nous dans le cas le plus défavorable : chaque nœud contient le
minimum de clés autorisé.
La racine a au moins 1 clé, donc au moins
2 fils.
Tout autre nœud a au moins t − 1 clés, donc au moins
t fils.
Comptons alors les nœuds à chaque profondeur :
Profondeur
Nombre de nœuds, au minimum
0 (racine)
1
1
2
2
2t
3
2t²
…
…
i (pour i ≥ 1)
2 ti−1
La racine donne 2 fils ; ensuite chaque nœud en donne t, d'où la puissance
qui démarre à i = 1.
Du nombre de nœuds au nombre de clés
Chaque nœud de profondeur ≥ 1 porte au moins t − 1 clés, et la racine en
porte au moins 1. Donc :
Le moment clé : le facteur (t − 1) de la borne
inférieure sur les clés s'annule exactement avec le dénominateur (t − 1) de la
somme géométrique. C'est ce qui rend le résultat aussi propre, et ce n'est pas
un hasard : les deux viennent de la même contrainte de remplissage.
Conclure
De n ≥ 2th − 1, on isole th :
th ≤ (n + 1) / 2
Puis on passe au logarithme de base t, qui est croissant :
h ≤ logt ( (n + 1) / 2 ) ∎
Pourquoi la base du logarithme compte
Au chapitre sur la complexité, on apprend qu'on néglige la base d'un
logarithme, puisque changer de base revient à multiplier par une constante.
C'est vrai, et ici, c'est précisément cette constante qui nous intéresse.
log_t(n) = log_2(n) / log_2(t)
t = 2 : on divise par 1 -> aucun gain
t = 128 : on divise par 7 -> 7 fois moins de niveaux
t = 1024: on divise par 10 -> 10 fois moins de niveaux
Un facteur 7 serait anecdotique sur des opérations à 10 nanosecondes. Sur des
accès à 10 millisecondes, il fait passer une requête de 0,2 seconde à
0,03 seconde.
La théorie dit « c'est la même complexité ». L'ingénierie dit
« c'est sept fois moins de disque ». Les deux ont raison, et c'est la seconde
qu'on paie.
La borne est pessimiste
Le théorème suppose tous les nœuds au minimum de remplissage. En
pratique, après des insertions quelconques, les nœuds sont remplis à environ
70 % en moyenne, et la hauteur réelle est souvent inférieure
d'un niveau à la borne.
On peut d'ailleurs encadrer la hauteur des deux côtés. Dans le meilleur cas,
tous les nœuds sont pleins avec 2t − 1 clés, et :
log2t(n + 1) ≤ h ≤ logt((n + 1)/2)
À retenir
h ≤ logt((n + 1)/2) : la hauteur est logarithmique en base t.
La démonstration majore la hauteur en minorant le remplissage, dans le pire
cas où chaque nœud est au minimum.
Le facteur (t − 1) de la borne s'annule avec celui de la somme
géométrique : c'est le pivot du calcul.
La base du logarithme est ici la grandeur utile, pas un détail qu'on
néglige.
Exercices d'application
Exercice 1
Démontrez que le nombre de nœuds à la profondeur i vaut au moins 2t^(i−1) pour i ≥ 1, par récurrence.
Voir le corrigeMasquer le corrige
Initialisation (i = 1). La racine a au moins 1 clé, donc au moins 2 fils. Il y a donc au moins 2 nœuds à la profondeur 1. Or 2t0 = 2 × 1 = 2. ✔
Hérédité. Supposons qu'il y ait au moins 2ti−1 nœuds à la profondeur i, pour un i ≥ 1 donné.
Chacun de ces nœuds n'est pas la racine (puisque i ≥ 1). Il porte donc au moins t − 1 clés, et possède par conséquent au moins (t − 1) + 1 = t fils.
Le nombre de nœuds à la profondeur i + 1 est donc au moins :
2 t^(i-1) x t = 2 t^i = 2 t^((i+1)-1)
ce qui est bien la propriété au rang i + 1. ✔
La propriété est donc vraie pour tout i ≥ 1. Noter que l'hérédité utilise le fait que les nœuds considérés ne sont pas la racine : c'est là que l'exception sur la racine est soigneusement contournée.
Exercice 2
Un B-arbre de degré minimal t = 50 a une hauteur de 3. Entre quelles valeurs est compris son nombre de clés ?
Voir le corrigeMasquer le corrige
Minimum. Tous les nœuds au minimum donne, d'après la démonstration, n ≥ 2th − 1 :
n >= 2 x 50^3 - 1 = 2 x 125 000 - 1 = 249 999
Maximum. Tous les nœuds pleins : chaque nœud porte 2t − 1 = 99 clés et a 2t = 100 fils. L'arbre complet de hauteur 3 compte 1 + 100 + 100² + 100³ nœuds :
L'écart est d'un facteur 400 : à hauteur égale, un B-arbre peut contenir des quantités de clés très différentes selon son remplissage. C'est pour cela que la borne du théorème est si prudente.
Exercice 3
À partir de quel nombre de clés un B-arbre de degré t = 128 a-t-il besoin d'un quatrième niveau ?
Voir le corrigeMasquer le corrige
Un arbre de hauteur 3 contient au maximum, tous nœuds pleins :
soit 2564 − 1, c'est-à-dire 2³² − 1, environ 4,3 milliards de clés.
Il faut donc dépasser 4,3 milliards de clés pour qu'un quatrième niveau devienne inévitable, et encore, seulement si l'arbre est parfaitement rempli. Avec un remplissage réaliste de 70 %, le quatrième niveau apparaît plutôt vers le milliard.
Dans les deux cas, la conclusion pratique est la même : trois à quatre accès disque suffisent à indexer la quasi-totalité des bases de données existantes.
Cherchez avant d'ouvrir le corrige : c'est en butant sur les difficultes que l'on progresse.
Questions / Réponses
Aucune question. Soyez le premier à poser une question.