Vous êtes sur la page 1sur 4

Maximier - Définition

➻ Un arbre vide est considéré comme un maximier.


Structures de Données ➻ Un arbre binaire non vide est un maximier si et seulement si
➠ sa racine porte la valeur maximale.
et Complexité ➠ ses sous-arbres principaux sont des maximiers.

Maximier – Tri Arbre ➻ À la racine des sous-arbres principaux on trouve donc les
-ème et -ème valeurs selon l’ordre décroissant.
N.E. Oussous ➻ On a un ordre partiel :
➠ Le père est plus grand que ses deux fils.
oussous@lifl.fr

FIL – USTL ➠ Pas d’ordre entre les frères.

SDC - Licence – p.1/32 SDC - Licence – p.2/32

Maximier - Exemple Maximier - Utilité


➻ La structure de maximier n’est pas utilisée pour implémenter
9 les primitives usuelles (recherche, insertion, suppression) sur
les ensembles.
➻ Par exemple, la recherche d’une valeur particulière peut amener
7 8 à parcourir tout l’arbre (donc être en  ).
Elle nécessite de plus la gestion d’une pile dont la hauteur est
celle de l’arbre lui-même.
Cette recherche serait donc inefficace.
6 3 7 5
➻ Un maximier est par contre utilisé pour extraire le maximum
parmi un ensemble de valeurs.

2 3 2 1 6

SDC - Licence – p.3/32 SDC - Licence – p.4/32

Maximier - Cueillette Cueillette - Code


La suppression de l’élément maximal est, par contre, plus efficace. procedure Supprimer_Max(T : in out Maximier)
➻ On remplace cet élément par le plus grand de ses successeurs. X : Curseur := Racine(T);
➻ On recommence l’opération avec le successeur utilisé. Begin
While not Est_Feuille(X) loop
➻ On supprime la feuille utilisée en dernier.
Determiner quel successeur possède
9 8 la valeur maximale ;
Recopier cette valeur;
7 8 7 7 Descendre X du coté où se trouvait
la valeur maximale ;
6 3 7 5 6 3 6 5 end loop ;
Supprimer(X);
2 3 2 1 6 2 3 2 1 End ;

SDC - Licence – p.5/32 SDC - Licence – p.6/32

Pré-Maximier Pré-Maximier Maximier


➻ Un Pré-Maximier est un arbre dont les sous-arbres principaux ➻ Si le pré-maximier n’est pas un maximier, il faut
sont des maximiers. ➠ Échanger la valeur portée à la racine avec la valeur
➻ Un pré-maximier n’est pas nécessairement un maximier, cela maximale de ses successeurs,
dépend de la valeur portée à la racine. ➠ Réorganiser le successeur avec lequel a eu lieu l’échange.
➻ La transformation en maximier (Réorganisation) se fait ➻ La réorganisation nécessite le parcours d’une seule branche,
par une méthode analogue à celle utilisée pour la suppression avec un traitement en  à chaque nœud parcouru.
du maximum.
Réorganisation - Exemple Réorganisation - Code
procedure Reorganiser(T : in out Maximier)
X : Curseur := Racine(T);
2 9
Begin
loop
if not Est_Vide(Gauche(X)) then
9 8 7 8 G := X; G := Gauche(G) ;
if not Est_Vide(Droit(X)) then
D := X; D := Droit(D) ;
7 3 7 5 6 3 7 5 if Valeur(D) > Valeur(G) and Valeur(D) > Valeur(X) then
Changer_Valeur(X, Valeur(D)); X := D;
elsif Valeur(G) > Valeur(D) and Valeur(G) > Valeur(X) then
6 3 2 1 6 2 3 2 1 6 Changer_Valeur(X, Valeur(G)); X := G;
else EXIT;
end if;
else
Changer_Valeur(X, Valeur(G)); X := G;
end if;
elsif not Est_Vide(Droit(X)) then
Changer_Valeur(X, Valeur(D)); X := D;
else EXIT;
end if;
end loop ;
End ;

SDC - Licence – p.9/32 SDC - Licence – p.10/32

Fabrication d’un maximier Fabrication - Exemple


➻ Un arbre binaire quelconque contient des maximiers : toutes 2 9
ses feuilles.
➻ Les sous-arbres de hauteur sont donc des pré-maximiers. 9 6 7 8

➻ Par réorganisations successives, on peut transformer tous les


sous-arbres de hauteur en maximiers, puis ceux de hauteur , 6 1 7 5 6 3 7 5

etc   
➻ Il faudra donc parcourir les sous-arbres par hauteurs croissantes
7 3 2 3 8 2 3 2 1 6

(les sous-arbres les plus profonds en premier).

SDC - Licence – p.11/32 SDC - Licence – p.12/32

Fabrication - Code récursif Fabrication - Code itératif


Cet algorithme s’exprime facilement de façon récursive Cet algorithme peut aussi s’exprimer (informellement) de façon
procedure Fabriquer_maximier(C : Curseur) itérative par
Begin for h in 2 .. hauteur(arbre) loop
if not Est_Vide(Gauche(X)) then Réorganiser tous les sous-arbres de hauteur h ;
G := X; G := Gauche(G) ; end loop ;
Fabriquer_maximier(G) ;
end if ; Mais l’interface d’arbre proposée jusqu’ici ne permet
if not Est_Vide(Droit(X)) then pas d’implémenter aisément cette version itérative,
D := X; D := Droit(D) ; faute de moyen efficace pour parcourir tous les
Fabriquer_maximier(D); sous-arbres d’une hauteur donnée.
end ;
-- on a maintenant un pré-maximier
Reorganiser(C);
End ;
SDC - Licence – p.13/32 SDC - Licence – p.14/32

Tri-Arbre : Heapsort La structure de Tas


L’utilisation des maximiers peut amener à une méthode de tri ➻ La structure de tas permet de représenter, dans un tableau, un
appelée Tri-arbre ou Heapsort. arbre quasi-équilibré, dont les feuilles à profondeur maximale
Description informelle de l’algorithme : sont situées le plus à gauche possible.
➻ Elle consiste à ranger les valeurs portées par les nœuds
Tri_Arbre(T : Tableau) ➠ par profondeur croissante
Begin
Constituer un arbre contenant les valeurs de T; ➠ de gauche à droite (pour une profondeur donnée).
Fabriquer un maximier à partir de cet arbre;
for i in Reverse T’Range loop un arbre = un tableau
Ranger le maximum dans T(i) ;
un curseur = un indice du tableau
Retirer le maximum de l’arbre ;
end loop; un nœud = une case du tableau
Tas - Exemple Tas dans 1 tableau d’indices 1..n
9 T(1)

7 8 T(2) T(3)

T(4) T(5) T(6) T(7)


6 3 7 5
T(8) T(9) T(10) T(11) T(12)

2 3 2 1 6 Racine 
Successeur gauche 
1 2 3 4 5 6 7 8 9 10 11 12 Successeur droite 
Prédecesseur
Est_Feuille 
9 7 8 6 3 7 5 2 3 2 1 6 Possède 2 successeurs 
Possède 1 seul successeur 

Dernier nœud interne
SDC - Licence – p.17/32 SDC - Licence – p.18/32

Tas - Cas général La structure de Tas


T(T’First) ➻ Les moins
➠ Les arbres auront une taille maximale, celle du tableau.
T(T’First+1) T(T’First+2)
➠ Un nœud est associé à une case (fixée) du tableau.
T(T’First+3) T(T’First+4) T(T’First+5) T(T’First+6) ➻ Les plus
... ... ... ... T(T’Last) ➠ Pas besoin de pointeurs.
Racine    ➠ Le passage d’un nœud à ses successeurs se fait par
Successeur gauche       adressage calculé.
Successeur droite      ➠ Possibilité de calculer également l’emplacement du
Prédecesseur 
      prédécesseur.
Est_Feuille        
 ➠ Possibilité de parcourir l’arbre de bas en haut.
Possède 2 successeurs        

Possède 1 seul successeur        

Dernier nœud interne 

     

SDC - Licence – p.19/32 SDC - Licence – p.20/32

Réorganiser un Tas : Itératif Réorganiser un Tas : Récursif


procedure Reorganiser( C : Curseur ) is Reorganiser(T, C)
I : Curseur := C; g : Curseur := Gauche(C) ;
begin d : Curseur := Droit(C) ;
loop Begin
if Possede_2_Successeurs(I) then -- on détermine max(T(C), T(g), T(d))
if T(Gauche(I)) > T(Droit(I)) and T(Gauche(I)) > T(I) then if g <= T’Last and then T(g) > T(C) then
Echanger(T(I),T(Gauche(I))); max := g ;
I := Gauche(I); else
elsif T(Droit(I)) > T(Gauche(I)) and T(Droit(I)) > T(I) then max := C ;
Echanger(T(I),T(Droit(I))); end if ;
I := Droit(I); if d <= T’Last and then T(d) > T(max) then
else -- T(i) est la plus grande des 3 valeurs max := d ;
exit; end if ;
end if; if max /= C then -- c’est un pré-maximier
elsif Possede_1_Seul_Successeur(I) and then T(Gauche(I))>T(I) then Echanger(T(C), T(max)) ;
Echanger(T(I),T(Gauche(I))); Reorganiser(T, max) ;
exit; end if ;
else exit; End Reorganiser ;
end if;
end loop;
end Reorganiser;

SDC - Licence – p.21/32 SDC - Licence – p.22/32

Réorganiser Tas : Complexité Réorganiser Tas : Complexité


➻ Le temps d’exécution de Reorganiser sur un sous-arbre de ➻ On aboutit à la relation de récurrence suivante :
taille enraciné en un nœud i est la somme du temps  et 
le temps d’exécution de Reorganiser sur un sous-arbre     
enraciné sur l’un des deux fils du nœud i. 
➻ Les sous-arbres des fils ont chacun une taille au plus égale à  .
➻ Le pire des cas est atteint lorsque le dernier niveau est rempli ➻ On est dans le cas 2 du théorème général avec
exactement à moitié. 
      

Ainsi      et      


Fabriquer un Tas Exemple
➻ Les feuilles
  sont situées dans les dernières cases du tableau : ➻ Soit le tableau suivant :
1 2 3 4 5 6 7 8 9 10
T(( +1)..n).
4 1 3 2 16 9 10 14 8 7
➻ On parcourt les sous-arbres par hauteurs croissantes en
parcourant les cases du tableau en ordre inverse.
➻ Il lui correspond l’arbre suivant :
procedure Fabriquer_Tas(T : in out Arbre) is 1
begin 4
for i in reverse Racine..Dernier_arbre_h2 loop
Reorganiser(i); - Reorganiser(T,i) 2 3

end loop; 1 3
end Fabriquer_Tas;
4 5 6 7

➻ Le temps d’exécution de Fabriquer_tas : Chaque appel à 2 16 9 10

Reorganiser coûte 


. Il existe   appels de ce 8 9 10

type. Donc, le temps d’exécution est au plus  


. 14 8 7

SDC - Licence – p.25/32 SDC - Licence – p.26/32

Exemple Fabriquer Tas : Complexité


1 1
➻ Une analyse plus fine est basée sur les propriétés des tas :
➠ La hauteur d’un tas à éléments est   
.
4 16

2 3 2 3

1 3 14 10
➠   sous-arbres de hauteur .
4 5 6 7 4 5 6 7

➻ Le temps de calcul de Reorganiser sur un nœud de hauteur


 est .
2 16 9 10 8 7 9 3

8 9 10 8 9 10

14 8 7 2 4 1

➻ Le coût total pour Fabriquer_tas sera


 

 


         

 

SDC - Licence – p.27/32 SDC - Licence – p.28/32

Fabriquer Tas : Complexité Le tri par tas : Heapsort


➻ On a l’égalité : ➻ On construit un tas par Fabriquer_Tas à partir de
 
 
T(1..n), n=T’Length.
  ➻ L’élément maximum de T se trouve à la racine T(1).

  
➻ On le place à sa position finale en l’échangeant avec T(n).
➻ On décrémente la taille du tableau en ne considérant que le
➻ Donc, le temps d’exécution de Fabriquer_tas peut être sous-tableau T(1..(n-1)).
borné par ➻ On transforme T(1..(n-1)) en tas puisque les fils de la
    racine restent des tas. Il y aura éventuellement à descendre la
¾  




         
nouvelle racine à sa place.
 

➻ Ainsi, on peut construire un tas à partir d’un tableau non


ordonné en un temps linéaire.
SDC - Licence – p.29/32 SDC - Licence – p.30/32

Exemple Tri Tas : Code


1 Tri_Tas(T)
Begin
1
Fabriquer_Tas(T) ;
2 3 n := T’Length ;
for i in reverse 2..n loop
2 i 3
Echanger(T(1), T(i)) ;
4 5 6 7 Reorganiser(T(1..n-1), 1) ;
end loop ;
4 7 8 9
End ;
8 9 10
➻ L’appel à Fabriquer_Tas prend un temps en  .
10 14 16
➻ Chacun des  appels à Reorganiser prend un temps en

Vous aimerez peut-être aussi