Consignes

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 :

  1. la lisibilité de votre programme (choix pertinent pour les noms de variables etc.),
  2. la présence de commentaires aux endroits appropriés,
  3. ...

Attention : les points suivants ne rapportent rien, mais ne pas les respecter pourra retrancher jusqu'à 10 points sur la note finale :

Liens utiles

1. Manipulation des listes (1h)

Reprenez quelques fonctions du TD sur les listes et programmez les en utilisant

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.

2. Deux algorithmes de tri pour les listes (2h)

Le tri par insertion et le tri fusion sont deux algorithmes de tri naturellement récursifs.

2.1. Tri par insertion

Le tri par insertion fonctionne de la manière suivante :

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

2.2. Tri fusion

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.

2.3. Comparaison entre les deux tris

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.

2.4. Généralisation

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 ?