TP Algorithmique & Programmation, période 1
Algorithmes de tri de tableaux
Alternants première année
2016 – 2017
1 Modalités
Le TP est à commencer à partir du 22 septembre 2016 et à rendre au plus tard le 21 octobre à 20h00. Il est
à réaliser en binôme exclusivement, durant le temps libre. L’application Teide servira pour la formation des
binômes et le rendu du TP.
1.1 Travail à rendre
Il vous est demandé un document synthétique tenant sur au maximum trois feuilles recto-verso où vous fe-
rez figurer les réponses aux questions ainsi que tout élément que vous jugeriez bon de préciser. Vous déposerez
sur Teide, dans une archive .tar.gz :
le document synthétique au format électronique .pdf ;
les sources dûment commentées de votre réalisation (un code qui ne compile pas ne sera pas accepté) ;
les jeux de tests (les programmes de tests et les fichiers contenant toutes les images testées et les anima-
tions).
L’ensemble des programmes ayant servi à l’élaboration du TP doit être dûment commenté. Essayez d’attacher
une grande importance à la lisibilité du code : il est indispensable de respecter les conventions d’écriture (coding
style) du langage que vous utilisez et de bien présenter le code (indentation, saut de ligne, etc.) ; les identifica-
teurs (nom de types, variables, fonctions, etc.) doivent avoir des noms cohérents documentant leur rôle ; enfin,
un commentaire se doit d’être sobre, concis et aussi précis que possible.
1.2 Barème indicatif (sur 4 points)
Rapport (questions 1 à 3, 6 à 8, 11 à 13, 16 et 17) : 1.5 point
Code (algorithmique, programmation et mise en forme ; questions 4, 9, 14, 18 à 21) : 1.5 point
Tests (questions 5, 10, 15 et 22) : 1 point
2 Problème
On se propose dans ce T.P. d’étudier divers algorithmes de tri de tableaux. Le but est à la fois théorique et
pratique :
étudier la complexité asymptotique d’algorithmes de tri connus ou moins connus ;
les implémenter et étudier leur coût réel ;
comparer la théorie et la pratique.
La complexité asymptotique s’étudiera en pire cas et en moyenne si c’est possible, en fonction du nombre
d’affectations de cases du tableau.
Afin d’étudier le coût réel des algorithmes, vous les testerez sur des tableaux d’entiers de taille ncroissante
remplis aléatoirement. Pour qu’une mesure de temps soit fiable, il faut la faire plusieurs fois (par exemple 10
fois) pour une taille de tableau donnée. C’est à vous de choisir les valeurs de nqui vous semblent pertinentes.
Pour chaque tri étudié, vous tracerez un graphe représentant le temps de calcul en fonction de n.
2.1 Algorithmes classiques
Echauffez-vous sur trois algorithmes classiques : le tri par insertion (InsertSort), le tri fusion (MergeSort) et
le tri rapide (QuickSort).
1
2.1.1 Etude théorique
Pour chacun de ces trois algorithmes :
Question 1 Rappelez brièvement son principe en quelques phrases (pas de code ou de pseudo-langage) ;
Question 2 Rappelez son coût en pire cas et son coût en moyenne ;
Question 3 Dites, en le justifiant, s’il est en place et/ou stable.
2.1.2 Etude pratique
Pour chacun de ces trois algorithmes :
Question 4 Implémentez l’algorithme dans le langage de votre choix parmi Ada, C, C++, C#, Java, Python.
Question 5 Mesurez le temps de calcul effectif sur votre machine, en suivant la procédure décrite précédem-
ment.
2.1.3 Analyse
Pour chacun de ces trois algorithmes :
Question 6 Analysez la similitude ou la différence entre le comportement réel et le comportement théorique
attendu de l’algorithme. Comment peut-elle s’expliquer ?
2.2 Tri par base
2.2.1 Description
Le tri par base est un algorithme de tri de grande importance historique. En effet, il s’agit de l’algorithme
qui était utilisé pour trier automatiquement les cartes perforées des premiers ordinateurs. Supposons que nous
disposons, dans un tableau T, de nnombres codés chacun sur dchiffres. Les chiffres vont de 0àb1(on code
en base b). L’algorithme de tri par base trie les éléments de Tchiffre par chiffre, en commençant par le chiffre
de poids faible. Par exemple, 15,12 et 05 vont d’abord être triés 12 15 05 (on trie le chiffre des unités),
puis 05 12 15 (on trie le chiffre des dizaines). Le tri par chiffre s’effectue en stockant dans chaque case
d’un tableau auxiliaire de taille ble nombre d’éléments dont le chiffre étudié est inférieur ou égal à l’indice de
la case. Ceci permet d’affirmer que si eéléments ont des valeurs inférieures ou égales à celle de l’élément i,
celui-ci doit figurer dans la e+ 1-ème case du tableau trié.
Le tri par base peut s’écrire :
Pour iallant de 1àd(on commence par le chiffre “de poids faible”)
// Pour tout j, on note T i[j]le i-ème chiffre de T[j]
Allouer un tableau T res de taille n
Allouer un tableau T aux de taille b
Initialiser toutes les cases de T aux à0
Pour jallant de 0àn1
Incrémenter T aux[T i[j]]
// Pour tout j,T aux[j]contient maintenant le nombre d’éléments de Tdont le i-ème chiffre vaut j
Pour jallant de 1àb1
T aux[j] := T aux[j] + T aux[j1]
// Pour tout j,T aux[j]contient maintenant le nombre d’éléments dont le i-ème chiffre vaut au plus j
Pour jallant de n1à0
T res[T aux[T i[j]] 1] := T[j]
Décrémenter T aux[T i[j]]
// Le résultat du tri pour le i-ème chiffre est maintenant dans T res
T:= T res
2
2.2.2 Etude théorique
Question 7 Calculez le coût en pire cas et le coût en moyenne de l’algorithme de tri par base.
Question 8 Dites, en le justifiant, s’il est en place et/ou stable.
2.2.3 Etude pratique
Question 9 Implémentez l’algorithme dans le langage de votre choix parmi Ada, C, C++, C#, Java, Python.
Question 10 Mesurez le temps de calcul effectif sur votre machine, en suivant la procédure décrite précédem-
ment.
2.2.4 Analyse
Question 11 Analysez la similitude ou la différence entre le comportement réel et le comportement théorique
attendu de l’algorithme. Comment peut-elle s’expliquer ?
2.3 Tri par paquets
2.3.1 Description
Le tri par paquets est un algorithme efficace si les données à trier sont uniformément distribuées. On suppose
pour simplifier qu’elles sont réelles et dans l’intervalle [0,1[. En cas de tri d’entiers compris entre 0et max, il
suffit pour s’y ramener de diviser tous les éléments par max+1 par exemple. L’idée de l’algorithme par paquets
est de diviser cet intervalle en nsous-intervalles de même taille, appelés paquets, et de trier indépendamment
chaque paquet. Il nécessite une structure auxiliaire T aux qui est un tableau de nlistes simplement chaînées.
Chaque case de T aux correspond à un paquet différent.
Le tri par paquets peut s’écrire :
Pour iallant de 0àn1
Insérer T[i]dans la liste T aux[bnT [i]c]
// T aux[i]contient maintenant les éléments de Tsont les valeurs sont dans l’intervalle [(i1)/n, i/n[
Pour iallant de 0àn1
Trier la liste T aux[i]par insertion
Concaténer les listes T aux[0], T aux[1], . . . , T aux[n1] dans cet ordre
Remarque : bkcreprésente la partie entière inférieure du réel k. Ainsi b2.5c= 2,b1.9c= 1,b0.7c= 0.
2.3.2 Etude théorique
Question 12 Calculez le coût en pire cas et le coût en moyenne de l’algorithme de tri par paquets.
Question 13 Dites, en le justifiant, s’il est en place et/ou stable.
2.3.3 Etude pratique
Question 14 Implémentez l’algorithme dans le langage de votre choix parmi Ada, C, C++, C#, Java, Python.
Question 15 Mesurez le temps de calcul effectif sur votre machine, en suivant la procédure décrite précédem-
ment.
2.3.4 Analyse
Question 16 Analysez la similitude ou la différence entre le comportement réel et le comportement théorique
attendu de l’algorithme. Comment peut-elle s’expliquer ?
3
2.4 Comparaison des algorithmes
Question 17 Discutez de l’intérêt de chacun des algorithmes de tri par rapport aux autres :
Est-il efficace en théorie ?
Est-il efficace en pratique ? Si oui, dans quel(s) cas ?
Que dire de la place mémoire nécessaire ?
2.5 Bonus
2.5.1 Contexte
Une image en niveaux de gris peut être représentée comme un tableau bi-dimensionnel Ide taille n×m,
avec n1et m1. Un pixel est simplement un élément I[i, j]du tableau. Chacun de ces éléments contient
un entier compris entre 0et une valeur maximale, appelé le niveau de gris du pixel. Un pixel de valeur 0est dit
noir, et un pixel de valeur maximale est dit blanc. Une image étant un tableau bi-dimensionnel, on dira qu’elle
est triée si les pixels sont ordonnés ligne après ligne : I[0,0] I[0,1] I[0,2] · · · I[0, m 1] I[1,0]
... I[1, m 1] ≤ · · · ≤ I[n1, m 1].
Cinq images vous sont fournies pour les questions suivantes. Vous pouvez bien sûr aussi utiliser d’autres
images. Les images fournies sont au format P GM (Portable Graymap File Format) ASCII. Ce format est très
simple :
la première ligne stocke le “nombre magique” P2 ;
la deuxième ligne stocke la largeur mpuis la hauteur nde l’image (en nombre de pixels) ;
les nlignes suivantes stockent chacune mentiers codés en ASCII : un entier peut valoir entre 0lorsque
le pixel correspondant est noir et 65536 lorsque le pixel est blanc ;
aucune ligne ne peut faire plus de 70 caractères : une ligne trop longue est scindée en plusieurs lignes
séparées par un saut de ligne.
2.5.2 Questions
Question 18 Implémentez une fonction qui lit une image au format P GM ASCII et stocke ses pixels dans un
tableau bidimensionnel. La fonction doit traiter comme un cas d’erreur le fait que le fichier n’est pas conforme
au format tel que décrit ci-dessus. Précisez les cas d’erreur que vous identifiez, traitez-les et validez le traitement
par des tests que vous préciserez.
Question 19 Implémentez une fonction qui, à partir d’un tableau bidimensionnel de pixels en niveaux de
gris, génère une image au format P GM ASCII. La fonction doit traiter comme un cas d’erreur le fait que les
structures de données ne permettent pas la génération d’une image conforme au format tel que décrit ci-dessus.
Précisez les cas d’erreur que vous identifiez, traitez-les et validez le traitement par des tests que vous préciserez.
Question 20 Pour tout ou partie des algorithmes de tri vus précédemment, adaptez le code au cas des tableaux
bi-dimensionnels en niveaux de gris. Sauvegardez les résultats intermédiaires au format P GM ASCII.
Question 21 Ecrire un script qui convertit une suite d’images au format P GM ASCII en une animation GIF
(vous pouvez utiliser un outil externe, comme The Gimp ou ImageMagick).
Attention : si vous sauvegardez tous les résultats intermédiaires pour une image de taille assez grande, vous
risquez d’obtenir une animation très longue, et qui prend beaucoup de place en mémoire.
Question 22 Testez sur les images en niveaux de gris fournies (ou d’autres de votre choix).
4
1 / 4 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 !