Correction de la feuille de TD n˚3
MPSI option informatique
Exercice 1 : Sauf indication contraire, td´esigne le nom d’un tableau (vecteur) et nun entier (indice).
1) ´
Ecrire une fonctions recevant comme argument tun tableau permettant de g´en´erer les valeurs de t. (0) , . . . , t. (n1),
o`u nest la longueur du tableau.
Correction : cf fichier Caml
2) ´
Ecrire une fonction recevant comme argument tet renvoyant le plus grand des ´el´ements t(0) , . . . , t. (n1).
´
Evaluer le nombre de comparaisons effectu´ees.
´
Elaborer un algorithme qui trouve le plus grand et le plus petit des ´el´ements t. (1) , . . . , t. (n) en effectuant un
nombre de comparaisons ´equivalent `a 3n/2(on pourra consid´erer les ´el´ements deux par deux et commencer
par comparer deux ´el´ements successifs).
Programmer une fonction mettant en œuvre cet algorithme.
Correction : cf fichier Caml
3) On veut mettre en œuvre l’algorithme de tri par insertion des valeurs t. (1) , . . . , t. (n) :
“pour kallant de 1 `a n1, t. (k) est ins´er´e `a sa place dans le sous-tableau d´ej`a tri´e t. (0) , . . . , t. (k1)”.
Formaliser cet algorithme, le prouver, puis ´evaluer sa complexit´e (en nombre de comparaisons).
´
Ecrire une fonction recevant comme arguments tet renvoyant le tableau ttri´e grˆace `a l’algorithme ci-dessus.
Comment modifier cette fonction pour faire afficher le nombre de comparaisons effectu´ees ?
Correction : cf fichier Caml
4) ´
Ecrire et justifier une version r´ecursive du tri par insertion.
Correction : cf fichier Caml
Exercice 2 : Programmer une fonction de fusion de deux segments de tableau adjacents tri´es en un segment
de tableau tri´e (on pourra utiliser un tableau auxiliaire).
En d´eduire un programme mettant en œuvre l’algorithme de “tri fusion” d’un tableau.
Correction : cf fichier Caml
Exercice 3 : Tri par fusion d’une liste :
1. ´
Ecrire une proc´edure de partage d’une liste en deux listes de tailles ´egales (´eventuellement `a 1 pr`es !), puis
une fonction r´ealisant la fusion de deux listes tri´ees.
2. En d´eduire un programme de tri par fusion d’une liste. En ´evaluer la complexit´e.
Correction : cf fichier Caml
Exercice 4 : Soit un tableau T de n entiers distincts, d´ecrivez de mani`ere pr´ecise un algorithme retournant
l’indice du minimum des ´el´ements de T, bas´e sur la technique ”diviser pour r´egner”.
Correction : cf fichier Caml
1
Exercice 5 : Calcul des termes de la suite de Fibonacci.
La suite de Fibonacci est d´efinie par les relations : F0=F1= 1 et pour tout n0, Fn+2 =Fn+1 +Fn.
1) Ecrire un programme r´ecursif calculant Fnpour n0.
Correction : pas de nouveaut´es ! !
#let rec fibo n = match n with
| 0 >1
| 1 >1
|>fibo (n-1) + fibo (n-2);;
D´eterminer le nombre d’appels `a la fonction selon n. On posera T(n) le nombre d’appels `a la fonction pour
le calcul de Fn, puis on donnera une relation entre T0(n) = T(n) + 1, T0(n1) et T0(n2) pour n2.
Correction : on a imm´ediatement que T(n) = 1 + T(n1) + T(n2) avec T(0) = T(1) = 1.
On en d´eduit que T0erifie la r´ecurrence de la suite de Fibonacci : T0(n) = T0(n1) + T0(n2), avec
T0(0) = T0(1) = 2. On en d´eduit que T(n) = 5
5+ 11+5
2n+5
5+ 115
2n+ 1.
2) Ecrire un programme r´ecursif calculant le couple (Fn1, Fn).
D´eterminer le nombre d’appels `a la proedure selon n.
Correction :
#let fibo2 n =
let rec aux (a , b) n = match n with
dd| 1 -> (a,b)
dd| -> aux ( b , b + a ) (n-1);
in snd (aux (1,1) n);;
On a imm´ediatement nappels `a la fonction.
3) D´emontrer la relation : (n, p)IN2,Fn+p=FnFp+Fn1Fp1.
En d´eduire un programme de calcul de Fnselon la m´ethode ”diviser pour r´egner”.
D´eterminer le nombre d’appels `a la proedure selon n.
Correction : ce fait par r´ecurrence double sur p(ou sur n).
Pour la fonction il faudra distinguer le cas npair et nimpair.
On a en effet : F2n=F2
n+F2
n1,F2n1=Fn1(2FnFn1) et F2n+1 =Fn(Fn+ 2Fn1).
On va encore calculer les couples Tn= (Fn1, Fn).
On a T2n=Fn1(2FnFn1), F 2
n+F2
n1et T2n+1 =F2
n+F2
n1, Fn(Fn+ 2Fn1).
#let fibo3 n =
let rec aux n = match n with
dd| 0 >(0,1)
dd| 1 >(1,1)
dd|>let (a,b) = aux (n/2) in
ddddif n mod 2 = 0 then (a*(2*b-a),a*a+b*b)
ddddddddelse (a*a +b*b, b*(b+2*a))
ddddin snd (aux n);;
Le nombre d’appel `a la fonction v´erifie Cn= 1 + Cbn/2cet C1= 1, d’o`u Cn= 1 + blog2(n)c
Exercice 6 : Une m´ediane d’un ensemble Ede cardinal nest un ´el´ement mEtel que
Card {xE/x < m}=jn
2k
1) Montrer l’unicit´e de la m´ediane d’un ensemble.
Correction : Pour m<m0on a m∈ {xE/x < m0}, d’o`u
Card {xE/x < m}+ 1 6Card {xE/x < m0}
On en d´eduit que Card {xE/x < m}+ 1 6=Card {xE/x < m0}et donc met m0ne peuvent ˆetre
simultan´ement m´ediane, d’o`u l’unicit´e.
2) Donner un algorithme de complexit´e Θ(n2) (mesur´ee en comparaisons) pour trouver la m´ediane d’un tableau.
Correction : On parcourt le tableau et, pour chaque ´el´ement, on compte le nombre d’´el´ements qui lui sont
strictement inf´erieurs. On renvoie l’´el´ement pour le quel ce nombre est n
2.
#let mediane t =
ddddlet n = vect length t and i = ref 0 and res = ref 0 and compte = ref 0 in
ddddwhile (!i < n) do
2
ddddddfor k = 0 to (n-1) do
ddddddddif t.(k) < t.(i) then compte:=!compte+1
dddddddone;
ddddddif !compte = n/2 then res :=1
ddddddelse compte := 0;
ddddddincr(i)
dddddone;
ddddt.(!res);;
3) Donner un algorithme de complexit´e Θ(n) (mesur´ee en comparaisons) pour trouver la m´ediane de deux
tableaux ordonn´es de mˆeme longueur n.
Correction : on utilise la m´ethode diviser pour r´egner
#let rec mediane u v = match vect length u with
dddd| 1 -> max u.(0) v.(0)
dddd| n when n mod 2 = 1 -> if u.(n/2) v.(n/2) then
ddddddddmediane (sub vect u 0 (n/2+1)) (sub vect v (n/2) (n/2+1))
ddddddddddelse
ddddddddmediane (sub vect v 0 (n/2+1)) (sub vect u (n2) (n/2+1))
dddd| n -> if u.(n/2-1)>v.(n/2-1) then
ddddddddmediane (sub vect u 0 (n/2)) (sub vect v (n/2) (n/2))
ddddddddddelse
ddddddddmediane (sub vect v 0 (n/2)) (sub vect u (n/2) (n/2));;
Le nombre de comparaisons unpour des tableaux ordonn´es de longueurs nv´erifie un=ubn/2c+udn/2e+ 1,
donc un= Θ(n).
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 !