Analyse d’une fonction ! Analyse détaillée d’un algorithme: " Avantage : Très précise " Désavantage : Long à calculer Analyse asymptotique et Calcul de coût Solution Algorithmique avancée Hervé Blanchon ! Analyse asymptotique du comportement de l’algorithme lorsque le(s) paramètre(s) de l’algorithme tendent vers l’infini : " Avantage : Facile à calculer " Désavantage : Moins précis, mais donne une idée précise de la classe de l’algorithme IUT 2 – Département Informatique Université Pierre Mendès France Sources : Mario Marchand, Alexandre Meyer, Maxime Crochemore, 1 Éric Fimbel, Chrisitine Froidevaux & Al., Thomas Cormen & Al. 2 Rappel mathématique : limite d’une fonction à +∞" Rappel mathématique : limite d’une fonction à +∞ ! On se contente ici d’une définition « intuitive » (on ne présente pas ici la notion mathématique de limite) ! Limite finie " Dire que la fonction f admet la limite finie l en +∞ revient à dire que f(n) se rapproche de l à mesure que n grandit (ou « tend vers plus l'infini ») ! Dit simplement, on s’intéresse à la valeur l de de la fonction f(n) lorsque n devient arbitrairement grand – soit lorsque n tend vers l’infini ; ce que l’on note n→+∞. ! Exemples ! Cela se note : $1' lim & ) = 0 %n( $ 3 + 6 n + 4 n2 ' $ 3 + 0 + 0' $ 3n 2 + 6n + 4 ' lim & = lim )=3 & )=& ) n →+∞% n 2 + 3 ( n →+∞% 1+ 3 n 2 ( % 1+ 0 ( $ 3 n + 6 n2 + 4 n3 ' $0 + 0 + 0' $ 3n 2 + 6n + 4 ' lim & = lim )=0 & )=& ) n →+∞% n 3 + 3 ( n →+∞% 1+ 3 n 3 ( % 1+ 0 ( lim f (n) = l n →+∞ n →+∞ qui se lit : l est la limite de f(n) lorsque n tend vers +∞ € 3 4 € Rappel mathématique : limite d’une fonction à +∞ Notation-Ο (grand oh) ! Limite infinie " L'idée intuitive d'une limite infinie est que pour n suffisamment grand, f(n) peut devenir aussi grand que l'on veut ! Détermine une borne supérieure ! Définition formelle : f(n) = Ο(g(n)) s’il existe deux constantes positives n0 et c telles que " f(n) ≤ cg(n) pour tout n>n0 ! En d’autres termes " cg(n) majore f(n) ! Exemples lim ( n ) = +∞ n →+∞ $ 3n + 6 + 4 n ' $ 3n 2 + 6n + 4 ' $ 3n + 6 + 0 ' lim & = lim & = lim & ) = +∞ ) ) n →+∞% n+3 ( n →+∞% 1+ 3 n ( n →+∞% 1+ 0 ( $ 3n + 6 n + 4 n 2 ' $ 3n 3 + 6n + 4 ' $ 3n + 0 + 0 ' lim & = lim & ) = +∞ & ) = nlim ) 2 2 n →+∞% n →+∞ →+∞ % 1+ 0 ( n +3 ( 1+ 3 n % ( 5 € 6 Notation-Ο (Calcul analytique) Notation-Ο (Analyse d’un algorithme) ! Étant données deux fonctions f(n) et g(n), f(n) = Ο(g(n)) ssi: ! On utilise la notation Ο pour décrire le pire des cas et on cherche une fonction simple qui décrit le comportement de l’algorithme dans le pire cas. " Exemples : Ο(n), Ο(n2), Ο(log n) " ∃ c≥0, ∀∞ n, f(n) / g(n) ≤ c $ f (n) ' + lim & )∈ℜ n →+∞% g(n) ( ! L’analyse est simplifiée selon les règles suivantes : " Seul le monôme avec le degré le plus élevé est conservé " Les constantes multiplicatives sont éliminées {ℜ + = [0,+∞[} ! Exemple : " si dans le pire des cas f(n) = 3n2+5n+4 f(n) = Ο(n2) " en effet ! Exemple " f(n) = 3n2+6n+4 et g(n) = n3+3 € ∴ donc 3n2+6n+4 limn→+∞ f(n) / g(n) = 0 est Ο(n3+3) $ 3n 2 + 5n + 4 ' $ 5 4' lim & &3 + + 2 ) = 3 + 0 + 0 = 3 ) = nlim 2 n →+∞ →+∞ % n n n ( % ( ! On dit « f(g) est en grand oh de g(n) » (cg(n) majore f(n)) 7 € 8 Notation-Ο (Analyse d’un algorithme) Rappel mathématique : sommes ! Exemples " 3n2 − 100n + 6 = Ο(n2) ! Sommes arithmétiques n n(n + 1) ∑i = 2 i=1 ! car 3n2 > 3n2 − 100n + 6 " 3n2 − 100n + 6 = Ο(n3) ! 0,01n3 > 3n2 − 100n + 6 sup ∑i = i= inf (sup − inf + 1)(sup + inf ) 2 " 3n2 − 100n + 6 ≠ Ο(n) ! c × n < 3n2 lorsque n > c € À vérifier vous-même en calculant la limite de la division de f(n) par g(n) ! € 9 10 Rappel mathématique : sommes Rappel mathématique : sommes ! Sommes arithmétiques avec changement de variable ! Sommes géométriques n n n n ∑ (i −1) =∑ i − ∑1 i= 2 i= 2 i= 2 ou avec changement de variable (i −1) → k n n r n +1 −1 ∑ r = r −1 i= 0 ∑2 i i = 2 n +1 −1 i= 0 Démonstration : n n−1 (n −1−1+ 1)(n −1+ 1) (n −1)n = ∑ (i −1) =∑ k = 2 2 i= 2 k=1 Eq1: Sn = ∑ r i =1+ r + r 2 + … + r n i= 0 € € On multiplie les deux côtés de Eq1 par r : 2 n +1 Eq2 : rSn = r + r + … + r On soustrait Eq1 de Eq2 : Eq3 : (r −1)Sn = (r + r 2 + … + r n +1 ) − (1+ r + r 2 + … + r n ) Eq3': (r −1)Sn = r n +1 −1 € Donc : Sn = 11 r n +1 −1 r −1 12 € Notation-Ο (Analyse d’un algorithme) Notation-Ω (grand oméga)" Nombre exact d’exécutions (pire des cas) ! Détermine une borne inférieure Analyse asymptotique ! Définition formelle : f(n) = Ω(g(n)) s’il existe deux constantes positives n0 et c telles que " cg(n) < f(n) pour tout n>n0 InsertionSort( T[ 1.. N ] ) pour i 2àN key j T[i] € i!1! N Ο(N) N −1 Ο(N) N −1 ! En d’autres termes " cg(n) minore f(n) Ο(N) N tant que j > 0 et T[j]>key! (N −1)(N + 2) ∑i = 2 i= 2 N T[j+1] T[j]! ∑ (i −1) = € i= 2 N j ∑ (i −1) = j!1! € T[j+1] key ! i= 2 Ο(N2) (N −1)N 2 Ο(N2) (N −1)N 2 Ο(N2) N −1 Ο(N) € T(N) = Ο(3N2+4N) = Ο(N2) 13 14 Notation-Ω (Calcul analytique) Notation-Ω (Analyse d’un algorithme) ! Étant données deux fonctions f(n) et g(n), f(n) = Ω(g(n)) ssi: ! On utilise la notation Ω pour décrire le meilleur des cas et on cherche une fonction simple qui décrit le comportement de l’algorithme dans le meilleur des cas. " Exemples : Ω(n), Ω(n2), Ω(log n) " ∃ b≥0, ∀∞ n, f(n) / g(n) ≥ b $ f (n) ' + lim & ) ∈ ℜ ∪ {+∞} n →+∞% g(n) ( ! L’analyse est simplifiée selon les règles suivantes: " Seul le monôme avec le degré le plus élevé est conservé " Les constantes multiplicatives sont éliminées ! Exemple : " si dans le meilleur des cas f(n) = 3n2+5n+4 f(n) = Ω(n) " en effet ! Exemple " f(n) = 3n2+6n+4 et g(n) = n+3 € limn→+∞ f(n) / g(n) = +∞ ∴ donc 3n2+6n+4 est Ω(n+3) $ 3n 2 + 5n + 4 ' $ 4' lim & & 3n + 5 + ) = lim (3n + 5 + 0) = +∞ ) = nlim n →+∞ →+∞ % n n ( n →+∞ % ( ! On dit « f(g) est en grand oméga de g(n) » (bg(n) minore f(n)) 15 € 16 Notation-Ω (Analyse d’un algorithme) Notation-Ω (Analyse d’un algorithme) ! Exemples " 3n2 − 100n + 6 = Ω(n2) Nombre exact d’exécutions (meilleur des cas) ! car 2,99n2 < 3n2 − 100n + 6 Analyse asymptotique InsertionSort( T[ 1.. N ] ) " 3n2 − 100n + 6 ≠ Ω(n3) pour i ! n3 > 3n2 − 100n + 6 2àN N Ω(N) T[i] N −1 Ω(N) N −1 Ω(N) key " 3n2 − 100n + 6 = Ω(n) 10 ! 1010 n < 3n2 − 100n + 6 j i!1! N tant que j > 0 et T[j]>key! À vérifier vous-même en calculant la limite de la division de f(n) par g(n) ! T[j+1] j T[j+1] T[j]! ∑1 = N −1 Ω(N) i= 2 0 Ω(1) 0 Ω(1) N −1 Ω(N) € j!1! key ! T(N) = Ω(5N+2) = Ω(N) 17 18 Notation-Θ (grand théta)" Notation-Θ (Calcul analytique) ! Relation d’équivalence ! Étant données deux fonctions f(n) et g(n), f(n) = Θ(g(n)) ssi: " ∃ a,b≥0, ∀∞ n, a ≤ f(n) / g(n) ≤ b ! Définition formelle : f(n) = Θ(g(n)) s’il existe trois constantes positives n0,c1 et c2 telles que " c1g(n) ≤ f(n) ≤ c2g(n) pour tout n>n0 $ f (n) ' ∗+ lim & )∈ℜ n →+∞% g(n) ( ! En d’autres termes " c1g(n) majore f(n) et " c2g(n) minore f(n) {ℜ∗+ = ]0,+∞[} ! Exemple " f(n) = 3n2+6n+4 et g(n) = n2+3 € ∴ donc 3n2+6n+4 limn→+∞ f(n) / g(n) = 3 est Θ(n3+3) ! On dit « f(g) est en grand thêta de g(n) » (g(n) majore et minore f(n)) ! f(n) = Θ(g(n)) ssi f(n) = Ο(g(n)) et f(n) = Ω(g(n)) 19 20 Notation-Θ (Analyse d’un algorithme) Notation-Θ (Analyse d’un algorithme) ! Exemples " 3n2 − 100n + 6 = Θ(n2) ! Encadrement de 106x2−1000x+122396 " 106x2 (majorant – Ο) et 100x2 (minorant – Ω) ! car Ο et Ω " 3n2 − 100n + 6 ≠ Θ(n3) ! car Ο seulement " 3n2 − 100n + 6 ≠ Θ(n) ! car Ω seulement À vérifier vous-même en calculant la limite de la division de f(n) par g(n) ! 21 Notation-Θ (Analyse d’un algorithme)" Analyse pire des cas SelectionSort( T[ 1.. N ] ) pour i 1 à N-1! min T[i] indexMin pour j i! Exacte Ο(N) N −1 Ο(N) (N + 1)(N − 2) ∑ (N − i + 1) = 2 i= 2 i+1 à N! N −1 si T[j] < min! ∑N − i = i= 2 € min ∑N − i = T[j]! i= 2 € indexMin T[indexMin] T[i] min! N −1 j! € T[i]! € (N −1)(N − 2) 2 (N −1)(N − 2) 2 N −1 N −1 Exacte Ο(N2) € Ω(N) N −1 Ω(N) N −1 Ω(N) N −1 (N + 1)(N − 2) ∑ (N − i + 1) = 2 i= 2 N −1 Ο(N2) Ο(N2) Asympt. N € € ∑N − i = i= 2 (N −1)(N − 2) 2 ! Le temps total d’exécution C(n) sera alors donné par: " C(n) = C1(n)+C2(n) = Ο(max{g1(n), g2(n)}) Ω(N2) Ω(N2) € 0 Ω(1) Ο(N2) € 0 Ω(1) Ο(N) N −1 Ω(N) N −1 Ω(N) ! C(n) est donc déterminé par la partie de l’algorithme ayant l’ordre de croissance le plus élevé € N −1 (N −1)(N − 2) ∑N − i = 2 i= 2 ! Supposons qu’un algorithme possède deux parties exécutées consécutivement (l’une après l’autre) " La première partie prend un temps C1(n) = Ο(g1(n)) " La deuxième partie prend un temps C2(n) = Ο(g2(n)) Analyse meilleur des cas Ο(N) N −1 N −1 Règle du maximum Asympt. N Ο(N) T(N) = O(N2) et T(N) = Ω(Ν2) ⇒ 22 € Τ(N) = Θ(N2)" 23 24 Règle du maximum – valeurs identiques dans un tableau Règle du maximum – insertion dans un vecteur trié ! On veut déterminer si un tableau V de n éléments possède des éléments identiques ! InsertTrié(V[0..n-1], val)! "posit:=Position(V[0..n-1], val);! "InsertPlace(V[0..n-1], val, posit);! " ValsIdentiques(V[0..n-1])! " "Tri(V[0..n-1]);! " "RechSuccId(V[0..n-1]); ! Coût de Position en nombre de comparaisons dans le pire des cas " recherche séquentielle Ο(n) " recherche dichotomique Ο(log2n) ! Coût de Tri dans le pire des cas " C1(n) = Ο(n2) ! Coût de InsertPlace en nombre d’affectation dans le pire des cas " insertion à la première place, il faut décaler tous les éléments ! Coût de RechSuccId (recherche séquentielle pour déterminer s’il existe i tel que V[i]=V[i+1]) dans le pire des cas " C2(n) = Ο(n) "pour i n à 1! "V[i] V[i-1];! " Ο(n) ! Coût de ValsIdentiques ! Coût de InsertTrié! " ValsIdentiques(n) = Tri(n) + Recherche(n) = Ο(max{n2,n}) " " InsertTrié(n) = Position(n) + InsertPlace(n) = Ο(max{log2n,n})" Ο(n2) " Ο(n) 25 26 Bilan Exercices ! Pour comparer la croissance de deux fonctions f(n) et g(n), il est généralement plus pratique d’utiliser le théorème suivant (que d’utiliser les définitions de Ω, Ο ou Θ): ! Exercices de calcul asymptotique $= c (fini) alors f (n) = Θ(g(n)) f (n) & si lim alors f (n) = Ο(g(n)) et f (n) ≠ Θ(g(n)) %= 0 n →+∞ g(n) & = +∞ alors f (n) = Ω(g(n)) et f (n) ≠ Θ(g(n)) ' € ! Lorsque f(n) = Θ(g(n)) nous disons que f(n) et g(n) ont le même ordre de croissance. ! Lorsque f(n) = Ο(g(n)) et f(n) ≠ Θ(g(n)) nous disons que l’ordre de croissance de f(n) est strictement plus petit que celui de g(n) ! Lorsque f(n) = Ω(g(n)) et f(n) ≠ Θ(g(n)) nous disons que l’ordre de croissance de f(n) est strictement plus grand que celui de g(n) 27 28 Baromètres (ou instructions utiles) Baromètres — Sélection des instructions ! Qu’est-ce qu’un baromètre ? " C’est une instruction qui s’exécute au moins autant de fois que chacune des autres. ! Mettre dans B les instructions suivantes : " itérations : tant que, pour " conditionnelles : si " une instruction au moins dans chaque bloc. ! Comment ça fonctionne ? " On sélectionne un ensemble d’instructions significatives B={b1…bk} " On détermine le nombre d’exécution de chacun des baromètres de B " Temps total est la somme du nombre d’exécutions de chaque baromètre ! bloc = ensemble d’instructions de même indentation qui s’exécutent le même nombre de fois. ! Comment choisir l’ensemble B ? " Mettre systématiquement certains types d’instructions (boucles, conditions, etc.) " Estimer leur nombre d’exécution maximal et minimal selon que l’on calcule le meilleur ou le pire cas " Simplifier B en gardant seulement l’instruction qui s’exécute le plus souvent 29 Baromètres — Estimer le nombre d’exécutions 30 Baromètres — Exemple a) Itération : chaque fois qu’on passe dessus, le test est évalué le nombre de fois que la condition est vraie + 1 fois (quand la condition est fausse). b) Bloc interne d’une itération : on passe sur ses instructions autant de fois que la condition est vraie. Analyse asymptotique (Ω meilleur des cas) Analyse asymptotique (Ο pire des cas) Ω(N) Ο(N) Ω(N) Ο(N2) Ω(1) Ο(N2) InsertionSort( T[ 1.. N ] ) pour i c) Bloc interne d’un si : chaque fois qu’on passe sur le si et que la condition est vraie, on passe sur ses instructions 2àN key j d) Autres instructions: chaque fois qu’on passe dessus, elles s’exécutent une fois. T[i] i!1! tant que j > 0 et T[j]>key! T[j+1] j T[j+1] T[j]! j!1! key ! T(N) = Ω(N) et T(N) = Ο(N2) 31 32 Baromètres — Exemple" Analyse algorithmique Analyse asymptotique (Ω meilleur des cas) Analyse asymptotique (Ο pire des cas) Trois algorithmes de tri SelectionSort( T[ 1.. N ] ) pour i 1 à N-1! min Ω(N) T[i] indexMin pour j i! i+1 à N! si T[j] < min! min T[j]! indexMin T[indexMin] T[i] Ο(N) Ω(N2) Ο(N2) Ω(N2) Ο(N2) Ω(1) Ο(N2) Meilleur cas Pire cas Tri à bulle Ω(N2) Ο(N2) Tri par sélection Ω(N2) Ο(N2) Tri par insertion Ω(N) Ο(N2) ! Dans le pire cas et avec le même nombre de données à trier, est-ce que le temps d’exécution sera identique ? j! T[i]! min! T(N) = Ο(N2) et T(N) = Ω(N2) ⇒ T(N) = Θ(N2) 33 Exercices ! Analyse asymptotique des algorithmes suite !" 35 34