Vous devrez soumettre votre travail (un unique fichier Caml valide) en utilisant l'interface TPLab.
Le seul fait que votre programme fonctionne ne suffit pas pour avoir une bonne note. Les points suivants seront pris en compte :
Attention : les points suivants ne rapportent rien, mais ne pas les respecter pourra retrancher jusqu'à 10 points sur la note finale :
Reprenez quelques fonctions du TD sur les listes et programmez les en utilisant
List.fold_right
.
Programmez la fonction renverse
comme nous l'avons fait en TD,
puis comparer l'efficacité de votre fonction avec celle de la fonction
List.rev
, qui fait la même chose.
Expliquez la démarche que vous suivez pour faire cette comparaison en mettant des commentaires dans votre fichier Caml.
La fonction List.map
permet d'appliquer une fonction à tous les éléments
d'une liste.
Écrivez une fonction pam
qui prend en
arguments :
et qui renvoie la liste des valeurs obtenues en appliquant les fonctions de la
liste à la valeur. Par exemple :
pam 3 [ (fun x -> x+1) ; (fun x -> x*x) ; (fun x -> 42-x) ]
donnera [4; 9; 39]
.
Essayez de deviner le type de cette fonction sans regarder le résultat donné par Caml.
Écrivez la fonction pam
uniquement à partir de la fonction map
.
Le tri par insertion et le tri fusion sont deux algorithmes de tri naturellement récursifs.
Le tri par insertion fonctionne de la manière suivante :
a::l
, on commence par trier (récursivement) la liste l
, puis on insère l'élément a
dans le résultat.
Programmez une fonction insere
qui permet d'insérer
un élément à sa place dans une liste triée.
Programmez ensuite le tri par insertion : tri_insertion
en utilisant la fonctions insere
Le tri fusion fonctionne de la manière suivante :
Programmez une fonction fusionne
qui permet de
fusionner deux listes triées en une seule liste triée.
Attention : vous n'avez pas le droit d'utiliser la fonction insere
pour programmer fusionne
.
Programmez une fonction separe
qui permet de séparer
une liste quelconque en deux listes de taille équivalente.
Programmez maintenant le tri fusion : tri_fusion
en utilisant les fonctions separe
et fusionne
.
Comparez l'efficacité de vos deux algorithmes. Qu'en pensez-vous ?
Comparez également l'efficacité de vos deux algorithmes avec l'efficacité de l'algorithme de Caml :
let tri_caml l = List.sort compare l;;
Expliquez la démarche que vous suivez pour faire cette comparaison en mettant des commentaires dans votre fichier Caml.
Imaginez la situation suivante : vous avez une liste de points dans le
plan, c'est à dire une liste de paires de flottants (type float*float list
).
Vous aimeriez trier cette liste selon la hauteur de points, c'est à dire suivant leur seconde coordonnée.
Comment pourrait-on profiter des capacités de Caml à manipuler des fonctions pour généraliser nos fonctions de tri pour les permettre de fonctionner dans ce cas là, ou bien dans d'autres cas (tri en sens inverse, tri par ordre alphabétique, ...).
(Bonus)
Un algorithme de tri est dit stable quand il ne modifie pas l'ordre relatifs des éléments « égaux ». (Par exemple, lorsque vous triez vos fichiers par taille croissante, vous aimeriez que pour les fichiers de même taille, l'ordre soit toujours l'ordre alphabétique.)
Est-ce que vos programmes de tri par insertion et de tri fusion sont stables ?
Sinon, pouvez-vous les rendre stables ?