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