Professional Documents
Culture Documents
Laurent Cheno
Luminy, - mai
http://lcheno.free.fr/arbres23/
R
esum
e
Nous decrivons ici les arbres 2-3, structure (decrite pour la premi`ere fois en ) darbres de
recherche qui maintiennent un equilibrage susant pour garantir par exemple un tri en O(n lg n).
Nous presentons le code Caml correspondant aux fonctions de base sur une telle structure (recherche,
insertion, suppression, et donc tri). Nous donnons egalement les elements theoriques qui permettraient
une generalisation aux arbres a-b sous la condition b 2a 1 3. Enn, nous tentons une approche
combinatoire de la structure presentee.
lyc
ee
arbres 2-3
Arbres de recherche . . .
Arbres bi- ou ter- naires .
Equilibrage
. . . . . . . .
Un petit point historique
Recherche dune cle . . . .
Insertion dune cle . . . .
Suppression dune cle . . .
.
.
.
.
.
.
.
3
3
3
4
4
4
4
7
2 G
en
eralisation : les arbres a-b
2.1 Denitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Insertion et suppression dune cle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
9
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
10
10
12
12
12
12
4 Quelques
el
ements pour une combinatoire des arbres 2-3
4.1 Fonctions generatrices associees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Pour une analyse plus ne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
15
16
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
5
5
5
6
6
7
7
8
8
8
17
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
11
13
14
14
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1.1
Arbres de recherche
Considerons un ensemble de cles dun certain type . Nous supposerons quil existe une application que
nous nommerons valuation v : a v(a) qui associe un entier naturel a` chaque cle, permettant ainsi de
munir leur ensemble dun ordre1 deni par a b v(a) v(b).
Nous cherchons `a denir une structure sur lensemble de ces cles qui permettent les operations de base
suivantes :
(i) linsertion dune nouvelle cl
e dans la structure ;
(ii) la recherche dune cl
e particuli`ere ;
(iii) la suppression dune cl
e presente dans la structure ;
(iv) lextraction de la cl
e de valuation minimale (resp. minimale).
Une methode habituelle consiste a` utiliser une structure darbre binaire : les feuilles de larbre contiendront
les cles de la structure, les nuds une fonction de selection qui pourra decider, la valuation dune cle
etant donnee, sil convient de descendre `a gauche ou a` droite dans larbre.
Les types Caml generiques correspondant seraient donc les suivants :
type descente = Gauche | Droite ;;
type a valuation == a -> int ;;
type a arbre_de_recherche =
| Feuille of a
| Nud of (int -> descente)
* (a arbre_de_recherche)
* (a arbre_de_recherche) ;;
1.2
Soit donc un ensemble (inni) de cles A pour lequel existe une valuation v : A N.
On leur associe lensemble B2,3 des arbres dont les feuilles portent des valeurs de lensemble A ; qui
verient la propriete tout nud est darite 2 ou 3 ; et dont les nuds darite 2 portent un entier quand
les nuds darite 3 en portent deux. De tels arbres seront appeles arbres 2-3 generaux.
` un nud darite 2 qui porte lentier r est associee la fonction de selection qui fait descendre a` gauche
A
(resp. `
a droite) toute cle x telle que v(x) r (resp. v(x) > r).
` un nud darite 3 qui porte le couple dentiers (r, s) avec r < s est associee la fonction de selection qui
A
fait descendre a` gauche (resp. au milieu) (resp. `a droite) toute cle x telle que v(x) r (resp. r < v(x) s)
(resp. s < v(x)).
Nous utiliserons la representation graphique de la gure 1 page suivante pour les deux types de nuds.
Une telle structure conserve linformation dans ses feuilles, et les cles sont triees en ordre croissant dans
le parcours prexe, inxe ou suxe, de ses feuilles.
1 tout
v(x) < r
r < v(x)
v(x) < r
r<v(x)
v(x)<s
s < v(x)
1.3
Equilibrage
Soit n le nombre de feuilles dun arbre dont tous les nuds sont darite 2 ou 3, et p sa profondeur,
cest-`a-dire le nombre maximal daretes quil faut traverser dans un parcours depuis la racine jusqu`
a une
des feuilles.
On dispose alors dun resultat (classiquement demontre dans le cas darbres strictement binaires) qui
enonce que
log3 n p n 1.
Si lon garantit que toutes les feuilles etaient de meme profondeur p, on dispose dun resultat plus fort
quon peut enoncer ainsi :
Th
eor`
eme 1
Si un arbre 2-3 general comporte n feuilles qui sont toutes `a profondeur p, alors on dispose de la relation :
2 p n 3p ,
1.4
ou encore
lg3 n p lg2 n.
Dans la suite, nous ne considererons que des arbres 2-3 generaux dont toutes les feuilles sont a` la meme
profondeur, que nous appellerons simplement arbres 2-3.
Ces arbres, quon appelle parfois aussi des arbres B + , ont ete imagines ainsi que les algorithmes que
nous allons decrire ci-dessous pour la premi`ere fois en par D. Comer dans [1].
1.5
Recherche dune cl
e
La recherche dune cle dans un arbre 2-3 ne pose pas de probl`eme particulier : linformation incluse dans
chaque nud permet de choisir la branche de descente.
Dapr`es le theor`eme precedent, il est clair que la recherche dune feuille dun arbre 2-3 qui en poss`ede n
a un co
ut logarithmique c(recherche) = (lg n). Notons quil sagit dune evaluation qui vaut dans tous
les cas, et pas seulement dans le meilleur.
1.6
Insertion dune cl
e
Linsertion dune cle se fait classiquement comme toute insertion aux feuilles dans un arbre de recherche.
Considerons lexemple de larbre 2-3 de la gure 2 page suivante.
Linsertion dune nouvelle cle de valeur 3 se fait en remplacant simplement un nud binaire par un nud
ternaire, et on obtient larbre de la gure 3 page suivante.
10 16
15
18
10 16
2 4
15
18
10 16 ?
15
18
21
7 16
18
10
15
18
21
10 11
11
18
15
18
21
11
16
13
10
11
18
13
15
18
21
1.7
Suppression dune cl
e
De la meme facon, pour supprimer une cle, on commence par descendre dans larbre jusqu`
a trouver la
feuille concernee.
Si son p`ere est un nud 3, il ny a pas de diculte : on remplace ce nud ternaire par un nud binaire,
et la feuille est supprimee.
Si, en revanche, on trouve un nud binaire, la suppression conduit a` un nud unaire qui ne respecte pas
les contraintes de denition dun arbre 2-3.
Il sagit donc de gerer le cas o`
u la suppression dans une branche de larbre conduit a` un nud unaire.
On consid`ere alors le p`ere.
Ou bien il sagit dun nud ternaire : par exemple, un nud de sous-arbres g, m et d, et tel que g
soit unaire. On distinguera les manipulations necessaires selon que m est binaire ou ternaire. La gure 8
explicite le premier cas, la gure 9 page suivante le deuxi`eme.
r s
r t
devient
D
A
r s
t s
t u
devient
E
r
s t
devient
r
s
r s
devient
G
en
eralisation : les arbres a-b
2.1
D
enitions
2.2
ou encore
Les algorithmes dinsertion et de suppression sont tout a` fait analogues a` ceux quon a decrit plus haut
dans le cas o`
u a = 2 et b = 3.
Pour linsertion, il conviendra declater un nud de degre b + 1 en deux nuds de degres respectifs
(b + 1)/2
et
(b + 1)/2. On constate que la condition b 2a 1 entrane
(b + 1)/2 (b + 1)/2
a,
et il est alors facile de generaliser lalgorithme dinsertion dej`a ecrit.
De la meme facon, on reecrira lalgorithme de suppression, en remontant au p`ere dun nud qui naurait
plus que a 1 ls, ce que nous laissons faire au lecteur de ces lignes. . .
3
3.1
Le typage correspond naturellement a` la denition quon a donnee des arbres 2-3 : pour faciliter la
lecture des structures, il nous a paru plus agreable decrire un Nud3 de branches g, m et d et de selecteur
(r,s) sous la forme Nud3(g,r,m,s,d), de sorte que chaque entier se positionne entre les branches quil
discrimine. Nous avons choisi des etiquettes enti`eres pour cet article, et la valuation est donc simplement
la fonction identite.
Programme 1 le typage des arbres 2-3
type type_des_cl
es == int ;;
let valuation x = x ;;
type arbre23 =
| Feuille of type_des_cl
es
| Nud2 of arbre23 * int * arbre23
| Nud3 of arbre23 * int * arbre23 * int * arbre23 ;;
3.2
(* par exemple *)
La recherche dune cl
e
La recherche dune cle est une simple adaptation du programme classique de recherche dans un arbre
binaire de recherche et na pas besoin de davantage de commentaires.
Programme 2 la recherche dune cle
let recherche v a x =
let vx = v x
in
let rec cherche = function
| Feuille y -> x = y
| Nud2(g,r,d) -> cherche (if vx <= r then g else d)
| Nud3(g,r,m,s,d) -> cherche (if vx <= r then g else if vx <= s then m else d)
in
cherche a ;;
3.3
Linsertion dune cl
e
Linsertion dune cle, qui fait lobjet du programme 3 page suivante, est beaucoup plus interessante.
La clef du programme est dans lutilisation dune exception : la description de lalgorithme que nous
avons propose `a la sous-section 1.6 page 4 prevoyait, dans le cas o`
u linsertion se faisait a` un niveau
o`
u se trouvaient dej`
a 3 cles, declater larbre obtenu, et de remonter dans larbre, o`
u pouvaient encore
se produire des eclatements supplementaires. La diculte est donc de remonter dans un arbre dont la
structure ne prevoit a priori que le moyen dy descendre. . . Cest l`
a quintervient dune mani`ere qui me
semble tr`es elegante lutilisation dune exception.
Notons que leclatement peut se propager jusqu`
a la racine de larbre (rappelons au passage que cest
dailleurs le seul cas o`
u larbre voit sa profondeur augmenter dune unite), et cest l`a quintervient la
structure try ... with ... de la ligne .
10
exception
Eclat
e of arbre23 * int * arbre23 ;;
let insertion23 v a x =
let vx = v x
in
let rec ins`
ere a = match a with
| Feuille y when x = y -> a
| Feuille y when vx < (v y)
-> raise (
Eclat
e (Feuille x, vx, Feuille y))
| Feuille y (* when vx > (v y) *)
-> raise (
Eclat
e (Feuille y,v y,Feuille x))
| Nud2(g,r,d) when vx <= r
-> (try Nud2(ins`
ere g,r,d)
with
Eclat
e(g,r,d) -> Nud3(g,r,d,r,d))
| Nud2(g,r,d) (* when vx > r *)
-> (try Nud2(g,r,ins`
ere d)
with
Eclat
e(g,r,d) -> Nud3(g,r,g,r,d))
| Nud3(g,r,m,s,d) when vx <= r
-> (try Nud3(ins`
ere g,r,m,s,d)
with
Eclat
e(g,r,d) -> raise (
Eclat
e(Nud2(g,r,d),r,Nud2(m,s,d))))
| Nud3(g,r,m,s,d) when vx <= s (* and vx > r *)
-> (try Nud3(g,r,ins`
ere m,s,d)
with
Eclat
e(g,r,d) -> raise (
Eclat
e(Nud2(g,r,g),r,Nud2(d,s,d))))
| Nud3(g,r,m,s,d) (* when vx > s *)
-> (try Nud3(g,r,m,s,ins`
ere d)
with
Eclat
e(g,s,d) -> raise (
Eclat
e(Nud2(g,r,m),s,Nud2(g,s,d))))
in
match a with
(* les cas particuliers du d
epart *)
| Feuille y
-> if x = y then a
else if vx < (v y) then Nud2( Feuille x,vx, Feuille y)
else Nud2( Feuille y,v y, Feuille x)
| _ -> try ins`
ere a with
Eclat
e(g,r,d) -> Nud2(g,r,d) ;;
11
3.4
La suppression dune cl
e
On ecrit lalgorithme de suppression dune facon similaire : pour remonter dans la structure, on denit
une exception, qui sappelle cette fois FilsUnique, et qui est declenchee quand la suppression normale
dune cle produit un nud unaire, quil est alors necessaire de remonter.
On obtient le programme 4 page suivante.
On notera lutilisation de cas de ltrage du genre Feuille _ -> raise Unexpected qui nont dautre
fonction que satisfaire le parseur de Caml, et eviter des messages davertissement de ltrages non exhaustifs. Cest toujours de bonne politique que deviter ce genre de messages, et cela garantit une programmation plus s
ure.
3.5
3.5.1
On ecrit tr`es facilement la recherche de la cle de valuation minimale (resp. maximale) dun arbre 2-3 : il
sut de descendre syst`ematiquement `a droite (resp. `a gauche) dans la structure.
De meme, `a laide de la fonction dinsertion, peut-on ecrire une fonction qui transforme une liste en
arbre 2-3.
Ces fonctions font lobjet du programme 5 page 14.
3.5.2
Le tri nest alors quune suite dextractions des maximas successifs de larbre 2-3 construit a` partir de la
liste argument, ce que realise facilement le programme 6 page 14.
12
13
let tri23 v l =
let a = arbre23_of_list v l
in
let rec recompose tampon = function
| Feuille x -> x :: tampon
| a -> let x = max23 a in recompose (x :: tampon) (suppression23 v a x)
in
recompose [] a ;;
14
Quelques
el
ements pour une combinatoire des arbres 2-3
4.1
Fonctions g
en
eratrices associ
ees
Nous noterons, pour une profondeur p Net n N, Bp,n le nombre darbres 2-3 de profondeur p qui
1, si n = 1 ;
poss`edent n feuilles. Par exemple : B0,n =
0, sinon.
Les fonctions generatrices associees sont les series formelles, elements de N[[z]], denies par :
Bp (z) =
+
Bp,n z n .
n=0
n1 +n2 +n3 =n
0
1
1
B0,n
B1,n
B2,n
B3,n
B4,n
B
p p,n
1
2
2
4
2 ou 3
8 9
3
10
11
12
13
14
15
3
1
1
4
14
23
32
43
63
14
23
32
43
63
2 mais
0
1
1
2
2
12
3
1872
n
3 ou 4
16 17
18
19
20
96
1
97
192
32
224
240
92
332
267
222
489
141
8
149
4
6563711232
15
5
282779810171805015122254036992
Si lon sinteresse au nombre moyen de feuilles dun arbre 2-3 de profondeur p, il sut devaluer la quantite
n
= Bp (1)/Bp (1), et Maple nous aide a` trouver les valeurs suivantes :
p
n
0
1
1
2,5
2
6,667
3
19,487
4
58,451
5
175,353
6
526,060
Il nest pas beaucoup plus dicile devaluer la variance de ce nombre de feuilles, puisque la moyenne du
carre de n secrit (Bp (1) + Bp (1))/Bp (1), et l`
a encore Maple nous fournit les resultats demandes :
p
V
(n)
V (n)
4.2
0
0
0
1
0,25
0,5
2
2,056
1,434
3
9,164
3,027
4
27,691
5,262
5
83,073
9,114
6
249,218
15,787
Pour raner notre analyse de la combinatoire des arbres 2-3, nous pouvons nous interesser au nombre k
(k)
de nuds (binaires ou ternaires) dun arbre 2-3 de profondeur p et de taille n, que nous noterons Bp,n .
Pour un arbre binaire, on sait que le nombre de feuilles est egal au nombre de nuds plus un.
Dans le cas de nos arbres 2-3, nous disposons de lencadrement analogue : k + 1 n 2k + 1. En outre,
p
k et p verient la relation : 2p 1 k 3 21 ce qui donne encore : 2p n 3p comme on pouvait sy
attendre.
Pour montrer que linformation decrite par le triplet (n, p, k) est plus riche que prevue, montrons le
Th
eor`
eme 3
Soient k2 (resp. k3 ) le nombre de nuds binaires (resp. ternaires) dun arbre 2-3 possedant k nuds et n
feuilles. Alors : k2 = 2k n + 1 et k3 = n k 1.
Observons tout dabord que lon dispose bien s
ur de k2 + k3 = k.
Une deuxi`eme equation sobtient facilement, en considerant que tout nud/feuille sauf la racine a un
p`ere et quon a donc : 2k2 + 3k3 = k + n 1.
Il sut alors de resoudre le syst`eme de nos deux equations.
(k) n k
Introduisons la fonction generatrice `a deux variables Bp (z, u) =
Bp,n
z u .
n
Bien s
ur, on aura Bp (z) = Bp (z, 1) et B0 (z, u) = z.
(k)
Essayons detablir des recurrences sur ces entiers Bp,n .
Partant de la racine, on construit un arbre de profondeur p 1 depuis une racine binaire ou ternaire, ce
qui fournit :
(k1 )
(k2 )
(k1 )
(k2 )
(k3 )
(k)
p 1, k 1, Bp,n
=
Bp1,n
B
+
Bp1,n
Bp1,n
Bp1,n
.
p1,n
1
2
1
2
3
n1 +n2 =n
k1 +k2 =k1
n1 +n2 +n3 =n
k1 +k2 +k3 =k1
Cest cette deuxi`eme recurrence que nous avons utilisee pour ecrire en Caml le calcul de la fonction
generatrice. On trouvera le listing correspondant dans le dossier complet lie `a cet article, mais nous ne le
reproduisons pas ici.
La gure 12 (qui est une copie decran, bien entendu) presente la repartition des nuds binaires/ternaires
pour les arbres 2-3 de profondeur p = 4 : on lit en abscisses le rapport k3 /k [0, 1] (graduation tous les
dixi`emes), et en ordonnees les frequences relatives (normalisees par la frequence maximale). On aurait
aime presenter des statistiques pour des profondeurs plus importantes, mais Caml declenche trop vite
lexception Out of memory. . .
17
R
ef
erences
[1] D. Comer. The ubiquitous b-tree. Computing Surveys, 11 :121137, 1979.
ements dalgorithmique. Masson, Paris,
[2] Dani`ele Beauquier, Jean Berstel et Philippe Chretienne. El
1992.
[3] Philippe Flajolet and Robert Sedgewick. An Introduction to the Analysis of Algorithms. AddisonWesley, Reading, Massachussets, 1996.
[4] Ronald L. Graham, Donald E. Knuth, and Oren Patashnik. Concrete Mathematics : A Foundation
for Computer Science. Addison-Wesley, Reading, Massachussets, 2nd edition, 1994.
[5] Derick Wood. Data structures, algorithms, and performance. Addison-Wesley, Reading, Massachussets, 1993.
18