Documente Academic
Documente Profesional
Documente Cultură
2 3 2 1 6
Réorganisation - Code
procedure Reorganiser(var T : Maximier) ;
Fabrication d’un maximier Fabrication - Exemple
X : Curseur ; ➻ Un arbre binaire quelconque contient des maximiers : toutes ses 2 9
Begin
X := Racine(T) ; feuilles.
➻ Les sous-arbres de hauteur 2 sont donc des pré-maximiers.
Repeat
if not Est_Vide(sag(X)) then begin 9 6 7 8
G := X; G := sag(G) ;
➻ Par réorganisations successives, on peut transformer tous les
sous-arbres de hauteur 2 en maximiers, puis ceux de hauteur 3, etc
if not Est_Vide(sad(X)) then begin
D := X; D := sad(D) ; 6 1 7 5 6 3 7 5
if Valeur(D) > Valeur(G) and Valeur(D) > Valeur(X) then begin
Changer_Valeur(X, Valeur(D)); X := D; :::
end else
if Valeur(G) > Valeur(D) and Valeur(G) > Valeur(X) then begin ➻ Il faudra donc parcourir les sous-arbres par hauteurs croissantes (les 7 3 2 3 8 2 3 2 1 6
Changer_Valeur(X, Valeur(G)); X := G; sous-arbres les plus profonds en premier).
end else exit;
end else begin
Changer_Valeur(X, Valeur(G)); X := G;
end;
end else
if not Est_Vide(sad(X)) then begin
Changer_Valeur(X, Valeur(D)); X := D;
end else exit;
until false ; // Repeat
End ;
2 ( )+1
end else
Successeur gauche i low T calculé. if T[sad(I)] > T[sag(I)] and T[sad(I)] > T[I] then begin
Successeur droite 2 ( )+2
i low T
➠ Possibilité de calculer également l’emplacement du
Echanger(T[I],T[sad(I)]);
2( + ( ) 1)
1 I := sad(I);
Prédecesseur i low T end else // T[I] est la plus grande des 3 valeurs
Est_Feuille 2 i ( )+1
low T > high T ( ) prédécesseur. exit;
2 ( )+1= ( )
if Possede_1_Seul_Successeur(I) and T[sag(I)]>T[I] then begin
Possède 1 seul successeur i low T high T Echanger(T[I],T[sag(I)]);
2( ( )+ ( ) 1)
1 exit;
Dernier nœud interne high T low T
end else exit;
Until false ;
end; // Reorganiser
() 6
d : Curseur ; n
d’exécution de Reorganiser sur un sous-arbre enraciné sur l’un
3
Begin T n T
g := sag(C) ; des deux fils du nœud i.
d := sad(C) ;
2n
// on détermine max(T[C], T[g], T[d]) ➻ Les sous-arbres des fils ont chacun une taille au plus égale à 3 .
if g <= high(T) and T[g] > T[C] then
max := g ➻ 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
else
= 32 ( ) = (1)
exactement à moitié.
= 1
max := C ;
if d <= high(T) and T[d] > T[max] then max := d ; a b f n
if max <> C then begin // c’est un pré-maximier
Echanger(T[C], T[max]) ;
Reorganiser(T, max) ;
end; // if
Ainsi log a = 0 = 1 et
n b n ( ) = ( log a)
f n n b
End; // Reorganiser
➻ La solution est donc ( ) = O(log2 )
T n n
T[( n2 +1)..n]. 1 2 3 4 5 6 7 8 9 10 4 16
2 3 2 3
4 1 3 2 16 9 10 14 8 7
➻ On parcourt les sous-arbres par hauteurs croissantes en parcourant 1 3 14 10
begin 14 8 7 2 4 1
4
for i:=Dernier_arbre_h2 downto Racine do begin
Reorganiser(i); // Reorganiser(T,i) 2 3
end;
1 3
end Fabriquer_Tas;
4 5 6 7
14 8 7
Fabriquer Tas : Complexité Fabriquer Tas : Complexité Le tri par tas : Heapsort
➻ Une analyse plus fine est basée sur les propriétés des tas : ➻ On a l’égalité : ➻ On construit un tas par Fabriquer_Tas à partir de T[1..n],
➠ La hauteur d’un tas à n éléments est h = blog2 n
. 1 n=length(T).
X 12
➠ 2h i sous-arbres de hauteur i.
2i = (1 1 2)2 = 2
i =
➻ L’élément maximum de T se trouve à la racine T[1].
=
i=0 ➻ On le place à sa position finale en l’échangeant avec T[n].
➻ Le temps de calcul de Reorganiser sur un nœud de hauteur h est
O(h). ➻ On décrémente la taille du tableau en ne considérant que le
➻ Le coût total pour Fabriquer_tas sera ➻ Donc, le temps d’exécution de Fabriquer_tas peut être borné sous-tableau T[1..(n-1)].
! par ➻ On transforme T[1..(n-1)] en tas puisque les fils de la racine
h
X h
X 0 1
( )=
T n 2h i O( ) = O 2h
i
i
2i
blog
X 2 n
1
X
! restent des tas. Il y aura éventuellement à descendre la nouvelle
i=0 i=0 O n
i
2i
A = O n
2i = O( 2) = O( )
i
n n
racine à sa place.
i=0 i=0