Proposer une interface pour les arbres binaires, vues au TP 6.
On souhaite implémenter un module de file first-in first-out, avec l'interface suivante
une solution naïve consiste à définir :
L'ajout d'un élément doit alors se faire en queue de la liste (ce qui est terriblement inefficace). Implémenter un module réalisant l'interface MinFile avec cette solution.
On va maintenant fournir des fonctionnelles sur notre file, en donnant un foncteur transformant un module de type MinFile en module de type File :
Coder ce foncteur.
On se propose d'implémenter une file de priorité (un tas) en programmation fonctionnelle. Souvenons-nous qu'un tas sur un type ordonné implémente les opérations d'insertion, et de suppression du minimum. Pour cela, nous nous baserons sur une structure concrête appelée tas par appariement (nous avions vu en cours d'algorithmique avancée les tas gauchers).
Commençons par écrire une implémentation sur les entiers, la dernière question consistera à transformer notre code en foncteur. Nous allons utiliser le type suivant :
Écrire les valeurs suivantes :
La première chose à faire est d'écrire une fonction prenant deux tas, et retournant l'union de ces deux tas. Si les deux tas sont non-vides, il suffit de rajouter le tas dont le minimum est le plus grand à la liste contenue dans l'autre tas :
Coder la fonction merge
Cette première solution offre dans certains cas des performances médiocres. À la place, nous faisons les opérations de merge dans un ordre bien particulier. Si la liste de tas est $[t_1;t_2;\ldots;t_n]$ et $\oplus$ dénote l'opérateur infixe pour merge, on calcule :
$$(t1 \oplus t2) \oplus (t3 \oplus t4) \oplus (t5 \oplus t6) \oplus \ldots \oplus \left(t_n\;\text{ou}\;(t_{n-1} \oplus t_n)\;\text{selon la parité de}\;n\right)$$
Écrire une fonctionnelle de liste généralisant cette expression, puis l'appliquer pour obtenir l'opération de suppression du minimum.
Les tas par appariement sont très efficaces en pratique, mais très difficiles à analyser de manière théorique (il est conjecturé que la complexité amortie des opérations d'insertion et fusion est $O(1)$, mais personne n'est parvenu à le prouver).