Vous êtes sur la page 1sur 2

Algorithmique : exercices et lments de cours

L2 informatique
Vendredi 13 fvrier

Preuves de correction

Exercice 1.
Montrer rigoureusement la correction de lalgorithme de tri par insertion vu la fin du dernier cours :
on prouvera un invariant pour chaque boucle. Donner le pire et le meilleur cas pour la complexit et
valuer cette complexit dans les deux cas.
Lorsque lon a une boucle Pour i de 1 n, on sait quelle sera excute exactement n fois : au bout
de n itrations, la boucle se termine. En revanche, ce nest nullement le cas des boucles Tant que qui
continuent tant que la condition est vrifie. Il se peut quon entre dans une boucle infinie (condition
toujours vraie), et dans les cas qui nous intressent il nest pas toujours ais de montrer que ce genre
de boucle termine. Par exemple, on ne sait pas montrer que la boucle suivante termine pour tout a
(problme de Syracuse) :
x <- a
Tant que (x > 1) faire
Si x est pair, x <- x/2
Sinon x <- 3*x+1
La mthode standard pour montrer quune boucle Tant que termine est de montrer quil existe une
quantit (typiquement un entier positif) qui dcrot chaque itration : dans ce cas, la boucle sarrte
ds que lentier devient nul car il ne peut plus dcrotre. Par exemple, dans la boucle suivante :
S : tableau dentiers
x <- a
y <- b
Tant que (x > 0 et y > 0) faire
Si S[x] est pair alors x <- x-1
Sinon y <- y-1
cest la quantit x + y qui dcrot chaque tape. Puisque la condition x>0 et y>0 impose que la somme
soit positive, on en dduit que la boucle termine (en au plus a + b itrations).
Exercice 2.
On se donne un tableau S dentiers tris par ordre croissant et un entier cible x. Proposer un algorithme
linaire pour trouver sil existe deux lments de S dont la somme vaut x. Prouver que la boucle termine (quelle quantit dcrot chaque itration ?) et que votre algorithme est correct (en montrant un
invariant).

Tri fusion

On rappelle le principe du tri fusion dun tableau A : on coupe le tableau A au milieu, de faon
avoir les deux moitis A1 et A2 . On trie rcursivement A1 et A2 , puis on fusionne les deux moitis de
manire ce que le tableau A entier soit tri.
On appellera Fusion(A1,A2,A) la procdure qui fusionne les deux tableaux A1 et A2 dans A. On a
donc un algorithme de la forme :
1

Tri_fusion(A) :
Si A a un seul lment, sortir
Recopier A[1..n/2] dans A1
Recopier A[n/2+1..n] dans A2
Tri_fusion(A1)
Tri_fusion(A2)
Fusion(A1,A2,A)
Exercice 3.
Proposer un algorithme linaire pour la procdure de fusion. Prouver que cet algorithme est correct,
cest--dire que la fusion de deux tableaux tris donne un tableau tri dont les lments sont tous ceux
des deux tableaux de dpart.
Afin dvaluer la complexit dun algorithme rcursif, on appelle T (n) le nombre dtapes ncessaires
pour trier un tableau de taille n. Puisque lon fait deux appels Tri_fusion sur des tableaux de taille
n/2 et que la fusion a un cot linaire, on obtient la relation de rcurrence suivante :

T (1) (1)
T (n) = 2T (n/2) + (n)
Exercice 4.
Pour simplifier, on suppose que la taille du tableau est une puissance de 2 (donc les divisions par
2 tombent juste ), que T (1) = 1 et que la fusion a un cot exactement n (cest--dire T (n) =
2T (n/2) + n). On pose un = T (2n ). Montrer que u0 = 1 et un = 2un1 + 2n . En posant vn = un /2n ,
montrer que vn = vn1 + 1. En dduire la valeur de vn , puis de un et de T (2n ). Si N = 2n , exprimer
T (N ) en fonction de N .

Divers

Exercice 5.
Tours de Hano
Dans le jeu des tours de Hano, on dispose de trois tiges A, B et C sur lesquelles peuvent venir se poser
des disques de diamtres tous distincts. Au dbut de la partie, on dispose de n disques sur la tige A,
celui de plus grand diamtre en dessous et rangs par diamtres dcroissants (donc celui de plus petit
diamtre au dessus). Le but du jeu est de dplacer toute la pile de disques sur la tige B. Pour cela,
chaque tape on a le droit de dplacer un disque dune tige une autre tant quon le pose sur un disque
de plus grand diamtre ou sur une tige vide.
crire un algorithme rcursif pour rsoudre le problme. valuer sa complexit.

Indications pour les exercices

Exercice 2 : utiliser 2 curseurs, lun partant du dbut du tableau et lautre de la fin. On comparera la somme
des deux lments points par les curseurs avec la valeur cible x et on mettra jour les curseurs en fonction.
On pourra utiliser un invariant ( formaliser) de la forme x ne peut pas tre atteint comme somme de deux
lments dont lun dentre eux est avant le premier curseur ou aprs le second curseur.
Exercice 3 : on utilise trois curseurs, un pour A1 , un pour A2 et un pour A, qui partent du dbut des tableaux.
On crit dans le tableau A la position du curseur soit llment de A1 point par le curseur, soit celui de A2
(selon leur valeur) puis on met jour les curseurs.
On pourra utiliser un invariant ( formaliser) de la forme le dbut du tableau A jusquau curseur est tri et
contient tous les lments prcdant les curseurs de A1 et A2 .
Exercice 4 : on a vn = n + 1, un = (n + 1)2n , T (2n ) = (n + 1)2n et donc T (N ) = (1 + log N )N (N log N ).
Exercice 5 : pour dplacer une pile de taille n, on dplace dabord les n 1 premiers disques sur la tige C, puis
le plus grand disque sur la tige B, puis on redplace la pile de la tige C sur la tige B. Pour la complexit de
lalgorithme, on a donc la relation de rcurrence T (n) = 2T (n 1) + O(1) ce qui donne T (n) (2n ) (mthode
similaire lexercice 4).