Algorithmique et programmation. TD1 1

publicité
Université de Provence
Master1 Mathématiques et applications
2009-2010
Algorithmique et programmation. TD1
1- Deux tris élémentaires
On se propose d’étudier deux algorithmes visant à trier par ordre croissant les éléments d’un
tableau t d’entiers. Dans tout l’énoncé on notera t[i .. j] la partie du tableau composée des éléments
d’indice k, i ≤ k ≤ j. Par convention, cette partie est vide si i > j.
Tri par sélection
Le tri par sélection consiste à itérer le processus suivant : si t[0 .. (i − 1)] est la partie du tableau
déjà triée, chercher l’indice m du minimum de la partie restante t[i..n] et échanger t[i] et t[m].
1. Exprimer en français structuré cet algorithme, démontrer sa correction et calculer sa complexité en temps.
2. Définir dans la classe T ri selection munie de la variable t correctement déclarée, une méthode
min qui prend en entrée un indice i et qui renvoie l’indice du minimum de t[i..n] où n désigne
l’indice de la dernière case du tableau t.
3. Définir une méthode echange qui prend en paramètres deux entiers i et j et qui échange le
contenu des cases t[i] et t[j].
4. Définir une méthode tri qui prend en paramètre un tableau d’entiers a, et qui opère sur a le
tri par sélection. Elle utilisera bien sûr, les méthodes définies aux 2 questions précédentes.
Tri par insertion
Le tri par insertion consiste à itérer le processus suivant : si t[0 .. (i − 1)] est la partie du tableau
déjà triée, placer à l’endroit correct la valeur t[i] dans la liste t[0..(i − 1)] de façon à ce que t[0..i]
soit triée.
1. Exprimer en français structuré cet algorithme. On structurera l’algorithme de telle sorte qu’il
fasse appel à un algorithme placer qui prend en entrée un indice i et qui, en supposant que
t[0 .. (i − 1)] est triée par ordre croissant, insère correctement la valeur t[i] dans t[0 .. (i −
1)]. On donnera deux version de l’algorithme placer, l’une utilisant notamment la recherche
dichotomique.
2. Démontrer sa correction.
3. Calculer sa complexité en temps (pour les deux versions).
4. Définir dans une classe T ri insertion munie de la variable t correctement déclarée, une
méthode placer qui prend en entrée un indice i et qui, en supposant que t[0 .. (i − 1)] est
triée par ordre croissant, insère correctement la valeur t[i] dans t[0 .. (i − 1)].
5. Définir dans la classe T ri insertion une méthode tri qui prend en paramètre un tableau
d’entiers a, et qui opère sur a le tri par insertion.
Programme principal
Ecrire une classe T ris, contenant la méthode main, qui opère un tri par sélection ou un tri par
insertion sur une liste d’entiers donnés en paramètre du programme et affiche à l’écran la liste une
fois triée.
2- Coefficients binômiaux
Pour tout couple d’entiers (n,p) tels que 0 ≤ p ≤ n, on note Cnp le nombre de combinaisons à p
éléments dans un ensemble à n éléments. Ces nombres Cnp sont aussi appelés coefficients binômiaux
car ils interviennent dans la formule du binôme. On rappelle les formules suivantes qui permettent
de calculer tout coefficient binômial :
(
(F )
Cnn
Cnp
= 1 et Cn0 = 1
p
p−1
pour tout couple (n, p) tel que 1 ≤ p ≤ (n − 1)
+ Cn−1
= Cn−1
On se propose d’écrire de deux manières différentes un algorithme qui étant donnés deux nombres
entiers p et n supposés valides, calcule le nombre Cnp .
1. Donner l’algorithme récursif induit par les formules (F ).
2. On note t(n, p) le nombre d’additions nécessaires au calcul de Cnp par la méthode précédente
(les décrémentations d’indices ne seront pas comptées comme additions : seules seront prises
en compte les sommes de coefficients binômiaux). Montrer que t(n, p) = Cnp − 1. En déduire,
pour un entier n donné, le nombre moyen pour 0 ≤ p ≤ n, d’additions nécessaires au calcul
de Cnp .
3. Cet algorithme est-il efficace ? Pouvait-on s’en douter ? Justifier.
On peut aussi utiliser les formules (F ) pour donner un algorithme itératif. On emploie pour
cela la méthode du triangle de Pascal : c’est une matrice dont les lignes et les colonnes sont
numérotées à partir de 0 et dans laquelle Cnp se trouve à l’intersection de la ligne numéro n
et de la colonne numéro p. Cette matrice est triangulaire inférieure puisque p ≤ n. De plus
toute ligne de la matrice peut-être déduite de la ligne précédente et des formules (F ).
4. Donner les six premières lignes du triangle de Pascal.
5. Donner un algorithme itératif pour calculer Cnp .
6. Evaluer en fonction de n la complexité de l’algorithme en nombre d’additions pour le calcul
de Cnp . Que peut-on dire de l’espace occupé par cet algorithme ?
7. Cet algorithme peut-il être considéré comme efficace ? Comparer avec l’algorithme récursif.
Pouvait-on se douter du résultat ? Pourquoi ?
Téléchargement