au format PDF

publicité
USTL - Licence ST-A 2ème année
2008-2009
Algorithmes et Programmation Impérative 2
TD 3 : Complexité
Exercice 1.
Classez les fonctions qui suivent par ordre de grandeur logarithmique, polynomial et exponentiel, et au sein de chaque classe, les classer par ordre de grandeur croissant.
√
f1 (n) = 2n2 , f2 (n) = en+1 , f3 (n) = n, f4 (n) = 2n , f5 (n) = nlog2 (3) , f6 (n) = 3log2 (n)
√
√
f7 (n) = n ln (n), f8 (n) = n n, f9 (n) = ln (n2 + 1), f10 (n) = ln ( n)
Exercice 2.
Question 1. Donner le temps de calcul de l'instruction B suivante :
for i:=1 to n do begin
for j:=1 to i do A ;
end {for} ;
L'algorithme suivant permet de vérier si un élément x appartient ou pas à un tableau A[1..n] où
n > 1.
Algo(A,x)
trouve := faux
i := low(A)
tant que (non trouve) et (i ≤ high(A)) faire
si A[i] = x alors
trouve := vrai
sinon
i := i + 1
fin si
fin tant que
retourner trouve
On évalue le coût de cet algorithme en comptant le nombre d'évaluations de la condition A[i] = x en
fonction de n = high(A)-low(A)+1 (la taille du tableau). On note T (n) cette complexité.
Question 2. Quelle est la complexité dans le meilleur cas ? (l'élément x se trouve dans la première case
du tableau A).
Question 3. Quelle est la complexité dans le pire cas ? (l'élément x se trouve au mieux dans la dernière
case du tableau A).
On va calculer la complexité moyenne dans le cas où les valeurs du tableau sont prises entre 1 et un
entier p > 1. On suppose que les éléments du tableau ainsi que x sont des entiers appartenant à l'intervalle
[1, p] de N. On va montrer que
T (n)
=
p−
(p − 1)n
pn−1
(1)
Le tableau est de taille n et les valeurs sont dans [1, p]. Il y a donc pn tableaux diérents.
Question 4. Combien de tableaux, parmi les pn , vont avoir leurs premières n − 1 cases diérentes de x
et la dernière égale ou diérente aussi de x ? Quelle est la complexité de l'algorithme pour ces tableaux.
Soit maintenant k ∈ [1, n − 1]. Le nombre de tableaux pour lesquels les k − 1 premiers éléments sont
diérents de x, le k−ième égal à x et les n − k derniers éléments quelconques dans [1, p] est
(2)
(p − 1)k−1 · pn−k
car il y a (p − 1)k−1 façons de choisir les éléments diérents de x des k − 1 premières cases et il y a pn−k
façons de choisir les éléments des n − k dernières cases parmi les valeurs de [1, p].
x 6∈ T [1..k − 1]
x
1
k−1
k
1
k+1
n
Question 5. Quelle est la complexité de l'algorithme pour ces tableaux ?
Question 6. Montrer par récurrence sur n que
p(p − 1)n−1 +
n−1
X
(p − 1)k−1 pn−k
(3)
= pn
k=1
La complexité moyenne est la somme des complexités dans les diérents cas divisée par le nombre de
cas. Le coût moyen est donc
!
n−1
X
1
n−1
k−1 n−k
n · p(p − 1)
+
k · (p − 1)
p
T (n) =
pn
k=1
On pose
S(n)
=
n−1
X
k · (p − 1)
k−1 n−k
p
n−1
= p
k=1
n−1
X
k·
k=1
p−1
p
k−1
Question 7. Montrer par récurrence sur n l'égalité :
n−1
X
kxk−1
=
k=1
(n − 1)xn − nxn−1 + 1
(x − 1)2
Question 8. Utiliser cette formule pour montrer que
S(n)
=
p (n − 1)(p − 1)n − np(p − 1)n−1 + pn
Question 9. En déduire que
T (n)
=
p−
(p − 1)n
pn−1
Application : On récupère un paquet de 1000 copies d'un partiel noté en points entiers entre 0 et
20. On se demande s'il y a un étudiant qui a obtenu 20.
Avec l'algorithme ci-dessus, en moyenne (avec p = 21 notes possibles, et n = 1000 taille du tableau)
l'examen des 21 premières copies permettra de conclure.
En posant la question au correcteur, on a la réponse immédiatement ;-)
Question 10. Quelle est la complexité spatiale de l'algorithme ci-dessus ?
Question 11. Déterminer les 3 complexités en temps de l'algorithme suivant :
trouve := faux
pour i variant de low(A) à high(A) faire
si A[i] = x alors
trouve := vrai
fin si
fin pour
retourner trouve
Exercice 3.
Récursivité
function f(n : CARDINAL) : CARDINAL;
var
i, res : CARDINAL;
begin
if n=0 then
res := 1
else begin
res := 0;
for i := 0 to n-1 do
res := res + (i+1)*f(i);
end {if};
f := res;
end {f};
2
Question 1.
Calculez les valeurs de f(1), f(2) et f(3). Dessinez l'arbre des appels à la fonction f dans le calcul
de f(3).
Question 2. En désignant par un l'entier égal à f(n), donnez l'équation de récurrence qui exprime un
en fonction de uk avec k < n lorsque n ≥ 1.
Question 3.
On désigne par c(n) le nombre de multiplications d'entiers eectuées dans le calcul de un =f(n).
Q 31. Montrez que ce nombre vérie l'équation
c(n)
= n+
n−1
X
c(k),
k=0
pour tout entier n ≥ 0.
Q 32. Écrivez une fonction récursive, paramétrée par un entier n qui calcule c(n).
Q 33. En calculant c(n + 1) − c(n), vériez que pour tout entier n ≥ 0, on a
c(n + 1) = 2c(n) + 1.
Q 34. En déduire l'ordre de grandeur de c(n) lorsque n → +∞.
Question 4.
Q 41. En calculant un+1 − un , montrez que
un+1 = (n + 2)un
pour tout entier n ≥ 2.
Q 42. Réalisez une fonction récursive linéaire qui calcule un .
Q 43. Exprimez le nombre de multiplications c0 (n) eectuées par cette fonction pour calculer un et
comparez-le au nombre c(n).
3
Téléchargement