Algorithmique DU1 MI2E Année 2012-2013 Corrigé TD 1 Exercice 1 Montrer que les assertions suivantes sont exactes : (a) n(n − 1) est en O(n2 ) : Définition : ∃c1 ∈ N∗ , n0 ∈ N∗ tels que ∀n ≥ n0 on a n(n − 1) ≤ c1 n2 . Posons c1 = 1 et remarquons que n(n − 1) ≤ n2 , ∀ n ≥ 1 = n0 . (b) max(n3 , 10n2 ) est en O(n3 ) : Définition : ∃c1 ∈ N∗ , n0 ∈ N∗ tels que ∀n ≥ n0 on a max(n3 , 10n2 ) ≤ c1 n3 . Posons c1 = 1 et remarquons que max(n3 , 10n2 ) = n3 , ∀n ≥ 10 = n0 . (c) Si p(x) est un polynôme quelconque de degré k, à coefficients entiers positifs, alors p(n) est en Θ(nk ) : Définition : ∃c1 , c2 ∈ N∗ , n0 ∈ N∗ tels que ∀n ≥ n0 on a c1 nk ≤ p(n) ≤ c2 nk . P P k Posons c1 = 1 et remarquons que nk ≤ i=0 ai ni , ∀n ≥ 1 ; de plus posons c2 = ki=0 ai P P et remarquons que ki=0 ai ni ≤ ki=0 ai nk , ∀n ≥ 1 = n0 . Exercice 2 Soient f (x) et g(x) des fonctions positives asymptotiquement. En s’aidant de la définition de base de la notion Θ, montrer que : f (n) + g(n) = Θ(max(f (n), g(n))). Définition : ∃c1 , c2 ∈ N∗ , n0 ∈ N∗ tels que ∀n ≥ n0 on a c1 max(f (n), g(n)) ≤ f (n) + g(n) ≤ c2 max(f (n), g(n)). Posons c1 = 1, c2 = 2 et remarquons que max(f (n), g(n)) ≤ f (n) + g(n) ≤ max(f (n), g(n)), ∀n ≥ n0 , où n0 est tel que f (n), g(n) ≥ 0 pour tout n ≥ n0 (par hypothèse n0 existe). Exercice 3 Soient f (x) et g(x) des fonctions positives asymptotiquement. On suppose que S(n) ∈ O(f (n)) et T (n) ∈ O(g(n)). Montrer que : (a) si f (n) ∈ O(g(n)) alors S(n) + T (n) ∈ O(g(n)) : On sait que ∃c1 ∈ N∗ , n0 ∈ N∗ tels que ∀n ≥ n0 on a f (n) ≤ c1 g(n). A montrer que ∃c2 ∈ N∗ , n1 ∈ N∗ tels que ∀n ≥ n1 on a S(n) + T (n) ≤ c2 g(n). Comme Corrigé TD 1 Algorithmique S(n) ∈ O(f (n)), ∃c3 ∈ N∗ , n2 ∈ N∗ tels que ∀n ≥ n2 on a S(n) ≤ c3 f (n). De même comme T (n) ∈ O(g(n)), ∃c4 ∈ N∗ , n3 ∈ N∗ tels que ∀n ≥ n3 on a T (n) ≤ c4 g(n). Donc S(n) + T (n) ≤ c3 f (n) + c4 g(n) ≤ c3 c1 g(n) + c4 g(n) = (c3 c1 + c4 )g(n), ∀n ≥ max(n0 , n2 , n3 ). En posant n1 = max(n0 , n2 , n3 ) et c2 = c3 c1 + c4 , on obtient le résulat voulu. (b) S(n)T (n) ∈ O(f (n)g(n)) : A montrer que ∃c2 ∈ N∗ , n1 ∈ N∗ tels que ∀n ≥ n1 on a S(n) + T (n) ≤ c2 g(n). Comme S(n) ∈ O(f (n)), ∃c3 ∈ N∗ , n2 ∈ N∗ tels que ∀n ≥ n2 on a S(n) ≤ c3 f (n). De même comme T (n) ∈ O(g(n)), ∃c4 ∈ N∗ , n3 ∈ N∗ tels que ∀n ≥ n3 on a T (n) ≤ c4 g(n). Donc S(n)T (n) ≤ c3 f (n)c4 g(n) ≤ c3 c4 f (n)g(n), ∀n ≥ max(n2 , n3 ). En posant n1 = max(n2 , n3 ) et c2 = c3 c4 , on obtient le résulat voulu. Exercice 4 Peut-on écrire : (a) 2n+1 ∈ O(2n ) ? Oui, car ∃c1 ∈ N∗ , n0 ∈ N∗ tels que ∀n ≥ n0 on a 2n+1 ≤ c1 2n . Il suffit de poser c1 = 2 et n0 = 1. (b) 22n ∈ O(2n ) ? Non, car pour n arbitrairement grand, 6 ∃c1 ∈ N∗ tel que 22n ≤ c2n . Autrement dit : si c’était vrai, alors ∃c1 ∈ N∗ , n0 ∈ N∗ tels que ∀n ≥ n0 on a 22n ≤ c1 2n . Divisons alors par 2n : ∀n ≥ n0 on a 2n ≤ c1 , ce qui est impossible car c1 est une constante ! Exercice 5 Soient f (x) et g(x) des fonctions asymptotiquement strictement positives, prouver ou démentir les affirmations suivantes : (a) f (n) = O(g(n)) implique que g(n) = O(f (n)) : Faux car n2 ∈ O(n3 ) mais n3 6∈ O(n2 ). (b) f (n) + g(n) = Θ(min(f (n), g(n))) : Faux car n2 + n3 6∈ O(n2 ). DU1 MI2E - Année 2012-2013 2 Corrigé TD 1 Algorithmique (c) f (n) = O(g(n)) implique que 2f (n) = O(2g(n) ) : Faux car 2n ∈ O(n), mais 22n 6∈ O(2n ). Exercice 6 En utilisant la notation O, donner, en fonction de n, la complexité dans le pire des cas des fonctions suivantes : (a) Fonction prodmat : pour i = 1 à n faire pour j = 1 à n faire C[i, j] ← 0 ; pour k = 1 à n faire C[i, j] ← C[i, j] + A[i, k] ∗ B[k, j] ; fin pour fin pour fin pour Complexité : O(n3 ) (b) Fonction mystere : pour i = 1 à n − 1 faire pour j = i + 1 à n faire pour k = 1 à j faire opération en O(1) ; fin pour fin pour fin pour Pour i = 1, on aura 2+3+4+. . .+n opérations en O(1) ; pour i = 2, on aura 3+4+. . .+n opérations en O(1) ; . . . ; pour i = n − 1, on aura n opérations en Ainsi on aura au PO(1). n−1 total : 1 × 2 + 2 × 3 + . . . + (n − 1) × n opérations en O(1), i.e., i=1 i(i + 1) opérations P Pn−1 2 Pn−1 n(n−1)(2n−1) en O(1). Or n−1 + n(n−1) . On obtient donc i=1 i(i + 1) = i=1 i + i=1 i = 6 2 une complexité en O(n3 ). (c) Fonction oddidonc : pour i = 1 à n faire si i impair pour j = 1 à n faire x ← x + 1; fin pour pour j = 1 à n faire y ← y + 1; fin pour DU1 MI2E - Année 2012-2013 3 Corrigé TD 1 Algorithmique fin si fin pour Complexité : O(n2 ) (d) Fonction recursive : si n = 0 alors retourner(2) fin si sinon retourner(recursive(n − 1) + recursive(n − 1)) La fonction recursive(n) est appelée 1 fois ; recursive(n−1) est appelée 2 fois ; recursive(n− 2) est appelée 4 fois ; . . . ; recursive(1) estPappelée 2n−1 fois et finalement recursive(0) est appelée 2n fois. On aura donc en tout ni=0 2i = 2n+1 − 1 appels. Comme chacun se fait en O(1), la complexité est en O(2n ). (e) Si on remplace l’instruction "(recursive(n − 1) + recursive(n − 1))" par "retourner(2 ∗ recursive(n − 1))", la complexité de la fonction recursive est-elle modifiée ? Oui, à ce moment chaque fonction recursive(i), pour i = n, . . . , 0 est appelée une seule fois. On aura donc une complexité en O(n). Exercice 7 (a) Ecrire un algorithme itératif qui prenne en entrée un entier n et retourne le factoriel de cet entier et prouver cet algorithme. Fonction f actoriel : f act ← 1 pour i = 2 à n faire f act ← f act ∗ i fin pour retourner f act fin Fonction Preuve : (i) Terminaison : Triviale car la boucle est exécutée n − 1 fois et le contenu de la boucle s’effectue en temps constant. (ii) Validité : Nous allons montrer qu’à la fin de l’itération i, la variable f act a pour valeur i!. Pour cela, on effectue un raisonnement par récurrence : pour i = 2, f act2 = f act1 ∗ 2 = 2!QX ; on suppose la propriété vraie pour i itérations, i.e., on suppose que f acti = ij=1 j X ; considérons l’itération i + 1 : f acti+1 = f acti ∗ (i + 1)= DU1 MI2E - Année 2012-2013 4 Corrigé TD 1 Qi j=1 j Algorithmique ∗ (i + 1)= Qi+1 j=1 j = (i + 1)! X. (b) Déterminer la complexité de cet algorithme. Complexité : O(n). (c) Ecrire un algorithme récursif qui calcule n! puis prouver cet algorithme. Fonction f actorielbis : si n ≤ 1 alors retourner 1 sinon retourner (f actorielbis(n − 1) ∗ n) fin Fonction Preuve : (i) Terminaison : Par récurrence sur n : pour f actorielbis(1) X (fin immédiate) ; supposons f actorielbis(n) se termine et considérons f actorielbis(n + 1) : cette fonction appelle f actorielbis(n) (qui par hypothèse se termine) et multiplie le résultat par n+1 puis renvoie le résultat final X. (ii) Validité : Par récurrence : f actorielbis(1) Q = 1! X ; on suppose la propriété vraie pour n, i.e., on suppose que f actorielbis(n) = nj=1 j X ; considérons n+1 : f actorielbisn + 1 = Q Q f actorielbis(n) ∗ (n + 1)= nj=1 j ∗ (n + 1)= n+1 j=1 j = (n + 1)! X. (d) Déterminer la complexité de cet algorithme récursif. Complexité : O(n). Exercice 8 Donner une fonction M in qui, étant donné un tableau T de n valeurs entières, retourne la plus petite de ces valeurs. Donner la complexité, en fonction de n, de cette fonction. Fonction M in min ← Tab[1] pour i = 2 à n faire si T ab[i] < min alors min ← T ab[i] fin si fin pour retourner min DU1 MI2E - Année 2012-2013 5 Corrigé TD 1 Algorithmique fin Fonction Complexité : O(n) DU1 MI2E - Année 2012-2013 6
© Copyright 2024 ExpyDoc