Lycée Carnot — 2016-2017 Option informatique MP/MP*
TD 1 : Révisions et structures de données
1 Remise en route
EXERCICE 1 (Typage) Quel est le type des fonctions suivantes ?
let f1x=let y= !x+ 1 in y;;
let f2mn=if n=mthen melse n;;
let f3l=match lwith [] -> [] |y:: s-> [s];;
let f4xy=for i=xto 10 do y:= x:: !ydone; !y;;
let f5xy=x y;;
let f6xy=x(x y);;
let f7xy=x(y x);;
let f8xyz=xyz;;
let f9 =fun (x,y,z) -> fun x-> (x,y,z);;
EXERCICE 2 (Prévoir le résultat) Dans le programme suivant :
let f=fun u-> (u4) / 5;;
let g=fun v-> fun x-> v(fun y-> x+y)+x;;
let h=g f;;
let a=h11;;
Que vaut a?
EXERCICE 3 (Currification) Quelle est la signature des deux fonctions suivantes?
let add1(x,y)=x+y;;
let add2 x y =x+y;;
Ajouter les parenthèses implicites. On dit que la deuxième fonction est sous forme curryfiée. Expliquer
la différence d’approche et les avantages et inconvénients de ces deux choix possibles.
Écrire une fonction uncurry qui prend en argument une fonction curryfiée à deux arguments et re-
tourne la même fonction non curryfiée, ainsi que sa réciproque curry. Quels sont leurs types?
EXERCICE 4 (Sur les listes)
1. Réécrire la fonction list__map, de type (a-> b) -> alist -> blist, qui renvoie
une liste constituée du résultat de l’appel d’une fonction sur chacun des éléments d’une liste.
2. On cherche à écrire l’équivalent de l’opérateur @:
(a) Écrire une fonction rev_append de type alist -> alist -> alist telle que rev_append
l1 l2 renvoie le renversement de l1 concaténé avec l2. Cette fonction est-elle récursive termi-
nale ? Quelle est sa complexité ?
(b) En déduire une fonction rev :alist -> alist
(c) En déduire une fonction append :alist -> alist -> alist qui concatène deux
listes. Quelle est sa complexité ? À votre avis, quel est son avantage par rapport à @?
3. Écrire le tri par insertion sur une liste.
EXERCICE 5Le problème de la vache égarée
Une vache distraite se retrouve par mégarde dans le mauvais champs. Une clôture infinie s’étend de-
vant elle et impossible de se souvenir si le passage se trouve à droite où à gauche.
http://carnot.cpge.info 1
Lycée Carnot — 2016-2017 Option informatique MP/MP*
1. La vache se souvient qu’elle a fait au plus nNpas entre sa position et le passage à travers la
clôture. Donner un algorithme en temps linéaire qui permet à la vache de retrouver le passage pour
aller de l’autre côté. Calculer la constante multiplicative et montrer que cet algorithme est optimal.
2. La vache ne se souvient en fait pas du tout du nombre de pas qui la sépare de l’ouverture. Peut-on
toujours trouver un algorithme en temps linéaire ? Si oui, calculer la constante multiplicative.
2 Structures de données
type ’a mstack;;
exception StackEmpty;;
exception StackFull;;
value empty :unit -> a mstack;;
value is_empty :a mstack -> bool;;
value is_full :a mstack -> bool;;
value push :a-> a mstack -> unit;;
value pop :a mstack -> a;;
FIGURE 1 – Signature pour une file impérative.
EXERCICE 6Implémentation d’une file à l’aide de listes circulaires
L’année dernière et en TP vous avez implémenté une file impérative (modifiable) à l’aide d’un tableau
et de deux indices. Dans cet exercice on propose d’utiliser plutôt une liste chaînée circulaire, c’est-à-dire
que le dernier élément de la liste pointe sur le premier. Pour pouvoir insérer et extraire en temps constant,
il suffit de conserver un pointeur sur le dernier élément de la liste. La signature d’une file impérative est
rappelée à la figure 1.
1. Faire un dessin.
2. Implémenter la structure de file à l’aide d’une liste chaînée circulaire.
3. Quelle est la complexité des différentes opérations ?
EXERCICE 7Files de priorité
Dans cet exercice on se propose d’implémenter la structure de file de priorité. Dans une file de priorité,
les éléments sont retirés non pas en fonction de leur ordre d’arrivée, mais en fonction d’une valeur attachée,
appelée priorité. Pour simplifier on suppose que la priorité est représentée par un entier. Une signature pour
une file de priorité persistante est donnée à la figure 2.
type ’a pprio;;
exception PrioEmpty;;
value empty :a pprio;;
value is_empty :a pprio -> bool;;
value add :a-> int -> a pprio -> a pprio;;
value get_min :a pprio -> a*int;;
value remove_min :a pprio -> a pprio;;
FIGURE 2 – Signature pour une file de priorité persistante.
http://carnot.cpge.info 2
Lycée Carnot — 2016-2017 Option informatique MP/MP*
1. Donner des exemples de files de priorité et de leurs applications.
2. Au vu de la signature de la structure de données, que font les différentes opérations?
3. Expliquer comment implémenter une pile et une file si l’on dispose d’une file de priorité.
4. On propose d’implémenter cette structure de données à l’aide d’un tas-min. On défini alors
type ’a pprio =Empty |a pprio *a*int *a pprio;;
5. Implémenter les fonctions empty,is_empty et get_min.
6. On suppose disposer d’une fonction merge :a pprio -> a pprio -> a pprio qui fu-
sionne deux tas. Implémenter les opérations add et remove_min.
7. Implémenter la fonction merge. On ne cherchera pas à équilibrer les arbres.
8. Proposer la signature pour une file de priorité impérative. On pourra ajouter une exception dans le
cas où la file est pleine et un opérateur is_full. Ceci n’est bien sûr pas lié à l’aspect modifiable mais
au fait que nous allons utiliser un tableau (non redimensionnable).
9. Pour réaliser la version impérative on propose toujours d’utiliser un tas-min, mais on représente
celui-ci à l’aide d’un tableau. La racine de l’arbre occupe la case d’indice 0. Les racines des sous-
arbres du nœud stocké à la case isont stockées respectivements aux cases 2i+1 et 2i+2. Où est
stocké le père du nœud i?
10. Proposer un type a mprio utilisant un tas-min représenté dans un tableau. Implémenter les opé-
rations empty,is_empty,is_full et get_min.
11. Écrire une fonction récursive percolate_up :a mprio -> a-> int -> int -> unit
telle que percolate_up p elt prio i insère l’élément elt de priorité prio dans un tas pen
partant de la position i. Cette fonction suppose que l’arbre de racine iobtenu en plaçant elt en i
est un tas.
12. En déduire une implémentation de l’opération add.
13. Écrire une fonction récursive percolate_down :a mprio -> a-> int -> int -> unit
telle que percolate_down p elt prio i insère l’élément elt de priorité prio dans le tas p, à
la place de l’élément en position i.
14. Implémenter l’opération remove_min. On pourra insérer à la racine l’élément le plus à droite du tas.
15. Quelle est la complexité des différentes opérations ?
EXERCICE 8Arbres binomiaux
Pour kN, un arbre binomial Bkest un arbre ordonné (la liste des fils est ordonnée) défini récursivement
par : (a) B0est constitué d’un nœud unique ; (b) pour k1, Bkest l’arbre Bk1auquel on a rajouté comme
fils le plus à gauche un autre arbre Bk1.
1. Dessiner les arbres Bkpour 0 k4.
2. Montrer qu’un arbre binomial Bkest constitué de 2knœuds.
3. Montrer que sa hauteur est k.
4. Pour 0 ik, montrer qu’il existe exactement (k
i)noeuds de profondeur i.
5. Montrer que la racine a pour degré k, et que ce degré est supérieur à celui des autres nœuds. Montrer
que les fils de Bksont, dans l’ordre : Bk1,Bk2, . . . , B0.
6. Montrer que le degré maximal d’un nœud quelconque dans un arbre binomial à nnœuds est log2n.
http://carnot.cpge.info 3
1 / 3 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 !