Algorithmie
PC 3 : Arbres
corrig´e
1 Arbres Maximier
On a vu en cours la d´efinition et les possibles utilit´ees des arbres maximier. Par
d´efinition, un arbre maximier est un arbre binaire tel que les clefs des fils d’un
noeud soient plus petites que la clef du noeud.
Cette d´efinition implique en particulier que la clef de la racine soit la plus
grande.
Nous allons nous ineresser ici `a l’impl´ementation la plus concise possible
d’un arbre maximier.
1.1 Codage d’arbre
1.1.1
La figure 1 montre 3 arbres binaires. Lequel de ces arbres est plein
ou complet ?
(a) (b)
(c)
Figure 1: Trois arbres binaires
1
L’arbre (a) est un arbre ni plein (le niveau 3, qui n’est pas le dernier niveau
n’est pas rempli), ni complet (puisqu’il n’est pas plein).
L’arbre (b) est plein, car tous les niveaux except´e le dernier sont remplis. Il
n’est par contre pas complet, car tous les nœuds du dernier niveau ne sont pas
`a gauche.
L’arbre (c) est plein et complet.
1.1.2
Soit A un arbre binaire complet plane. Quel est le nombre de nœuds
par niveaux ?
Au niveau 1 de l’arbre se trouve la racine et au niveau 2 ses deux fils. Les
deux fils ayant chacuns 2 fils, il y en a au maximum 4, etc. Un arbre binaire
complet a donc 2i1´el´ements par niveau, `a part pour le dernier niveau.
1.1.3
Si on num´erote les ´el´ements d’un arbre complet plant´e de gauche `a
droite et de haut en bas (la racine aura ainsi le num´ero 1, son fils
de gauche le num´ero 2, son fils de droite le num´ero 3, etc), quel est
l’indice du p`ere du nœud i?
1
2 3
4 5 6
8 9 10 11
7
Figure 2: Code d’un arbres binaires
La figure 2 montre un tel code en action. Il est alors facile de se convaincre
que si le num´ero d’un nœud est i, son p`ere est en i/2 (on prend la partie enti`ere
si i est impair).
De l`a, on voit aussi que les fils du nœud isont en 2iet en 2i+ 1.
Ce code est particulier au arbres binaires complets. En effet, si les niveaux
interm´ediaires ne sont pas remplis et si les nœuds du dernier niveau ne sont pas
`a gauche, ¸ca ne marchera pas. On pourra essayer sur les arbres (a) et (b) de la
figure 1 pour s’en convaincre.
1.1.4
Conclure de ce qui pr´ed`ede une fa¸con simple, ´el´egante et prenant tr`es
peu de m´emoire de coder un arbre binaire complet.
2
Il suffit d’utiliser un tableau de taille N o`u N est le nombre de nœuds.
L’indice de la racine est 1, et pour tout nœud d’indice i , les indices de ses fils
sont 2iet 2i+ 1.
1.1.5
`
A quel arbre binaire complet correspond le tableau [S,U,G,A,T,A,S,S,L,L,E,R]
en utilisant le code pr´ec´edent ?
L’arbre est pr´esene en figure 3.
U
S
SL
A
LE
T
G
A S
1
2 3
4 5 6
8 9 10 11
7
R
12
Figure 3: Arbre correspondant `a [S,U,G,A,T,A,S,S,L,L,E,R]
1.2 Manipulations d’arbres binaires complets
1.2.1
Proposez un algorithme permettant d’ins´erer un ´el´ement dans un
arbre maximier coe comme dans la partie pr´ec´edente.
On commence par ajouter un ´el´ement `a l’arbre binaire complet `a la fin du
tableau. Si son p`ere est plus petit que lui, on ´echange. Si apr`es l’´echange le
nouveau p`ere est plus petit on ´echange encore, et ainsi de suite jusqu’`a la racine.
Ces ´echanges `a r´ep´etitions assurent le fait qu’`a la fin la structure maximier est
respect´ee. Il faut cependant faire attention `a ne pas d´epasser la racine (une
sentinelle est plac´ee).
L’algorithme 1 explicite cette m´ethode.
1.2.2
eme question pour le codage du remplacement de la clef de la racine.
Cela se fait de la fa¸con oppos´ee `a l’insertion. On commence par remplacer
la valeur de la racine par la nouvelle valeure. Si la valeur de la nouvelle racine
est plus petite que la plus grande valeur de ses fils, on ´echange les valeurs. Si le
probl`eme presiste, on continue les ´echanges de la mˆeme mani`ere. Ces ´echanges
successifs assurent le fait `a la fin de la proedure, la structure maximier est
respect´ee.
3
Algorithme 1 Insertion d’un ´el´ement dans un arbre maximier
Donn´ees
tab (les indices vont de 0 `a n-1)
n
obj (l’objet `a rajouter)
ebut
tab[n]=obj
n = n+1
k = n+1
Tant que k>1et tab[k/2-1] <tab[k-1] faire (Attention : d`epart `a l’indice 0)
tempo=tab[k-1], tab[k-1] = tab[k/2-1], tab[k/2-1] = tempo
k = k/2
rendre tab
Fin
Il faut cependant faire attention `a la fin du tableau ainsi qu’au cas o`u un
p`ere ne poss`ede qu’un seul fils.
L’algorithme 2 explicite cette m´ethode.
1.2.3
Enfin, codez une fa¸con de supprimer la racine d’un arbre maximier.
La suppression d’un ´el´ement peut se faire tr`es simplement (comme vu en
cours). Il suffit remplacer (en utilisant l’algorithme 2) la valeur de la racine par
la valeur du dernier ´el´ement du tableau.
2 M´ethodes de recherche
Cette partie va s’atteler `a savoir si un ´el´ement particulier se trouve dans un
ensemble d’´el´ements. On verra que la performance de la recherche d´epend de
la structure utilis´ee pour stocker les ´el´ements.
2.1 Recherche s´equentielle
Ici, la structure pour stocker les ´el´ements est un tableau. Tout nouvel
´el´ement est plac´e en queue de tableau.
Quelle est la complexit´e de recherche d’un ´el´ement dans une telle
structure ? Et en moyenne ?
Ici, pour trouver un ´el´ement, il faut parcourir le tableau ´el´ement apr`es
´el´ement. Ainsi, en cas de recherche infructueuse, il faut comparer tous les
´el´ements du tableau `a l’´el´ement recherch´e : on a donc besoin de N compara-
isons.
4
Algorithme 2 de la racine dans un arbre maximier
Donn´ees
tab (les indices vont de 0 `a n-1)
n
obj (l’objet `a rajouter)
ebut
tab[0]=obj
k=1
Tant que k<=n/2 faire
decalage=0
Si 2k <Net tab[2k-1] <tab[(2k+1)-1] alors
decalage=1
Si tab[k-1] <tab[2k-1+decalage]
tempo=tab[k-1], tab[k-1] = tab[2k-1+decalage], tab[2k-1+decalage] = tempo
k = 2k+decalage
Sinon
k =n (sortie de boucle)
rendre tab
Fin
Dans le cas d’une recherche fructueuse, l’´el´ement recherch´e peut ˆetre de
fa¸con ´equiprobable dans toutes les cases du tableau (il a 1/N chance d’ˆetre en
position i, pour tout 1 iN).
Ainsi, s’il est en position i, il y aura juste i comparaisons `a effectuer. L’esp´erance
du nombre d’op´eration est alors P1iN(1
Ni) = N+1
2
2.2 Recherche dichotomique
Ici, notre structure est un tableau tri´e. `
A chaque nouvel ´el´ement, on re-trie le
tableau.
2.2.1
Quel est la complexit´e d’un ajout ou d’une suppression d’´el´ement ?
Il faut retrier `a chaque fois le tableau. Comme on ne rajoute ou on ne
supprime qu’un ´el´ement, ceci revient `a trouver o`u l’´el´ement doit ˆetre plac´e ou
supprimer, puis `a d´ecaler tous les autres ´el´ements.
De l`a, le fait de d´ecaler les ´el´ements revient – au pire – `a tous les d´ecaler et
donc am`ene `a une complexit´e de N. En moyenne, comme l’´el´ement `a d´eplacer
peut ˆetre de fa¸con ´equiprobable `a toutes les positions du tableau, et comme si
le premier ´el´ement `a d´ecaler est en position i, il faut en d´ecaler Ni, le nombre
moyen de d´ecalage est : P1iN(1
N(Ni)) = N+1
2.
5
1 / 8 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !