2.3 Notations asymptotiques L ordre de grandeur du temps d exécution d un algorithme donne une caractérisation simple de l efficacité de l algorithme et nous permet également de comparer les performances relatives de plusieurs algorithmes. Bien qu il soit parfois possible de déterminer le temps d exécution exact d un algorithme, cette précision supplémentaire ne vaut en général pas la peine d être calculée. Pour les entrées assez grandes, l effet d un temps d exécution exact est négligeable par rapport à ceux de la taille d entrée ellemême. Lorsqu on s intéresse à des tailles d entrée assez importantes pour que seul l ordre de grandeur soit pertinent, on étudie l efficacité asymptotique des algorithmes (on regarde comment s accroît à la limite le temps d exécution en fonction de la taille de l entrée). En général, un algorithme plus efficace asymptotiquement qu un autre constituera le meilleur choix quelle que soit l entrée, hormis les plus réduites. Les notations que nous utiliserons afin de décrire t(n) (le temps d exécution asymptotique d un algorithme) sont définies en terme de fonctions t : ℵ R. Notation θ Pour une fonction donnée f(n), on note θ(f(n)) l ensemble de fonctions : θ(f(n))={ t(n) : il existe des constantes strictement positives c 1, c 2 et un n 0 telles que : 0 c 1 f(n) t(n) c 2 f(n), n n 0 }. On dit alors que f(n) est une borne approchée asymptotiquement pour t(n) (on dira aussi que θ(f(n)) est l ordre exact de f(n)). Nous noterons t(n) = θ(f(n)) voulant en fait dire que t(n) θ(f(n)). On voit immédiatement de la définition qu on doit supposer que chaque fonction utilisée à l intérieur de la notation θ est positive asymptotiquement. Cette supposition est aussi valable pour les autres notations asymptotiques que nous allons définir. Notation O O(f(n))={ t(n) : il existe des constantes strictement positives c et n 0 telles que : 0 t(n) cf(n), n n 0 }. On dit que f(n) est une borne supérieure asymptotique pour t(n).
Notation Ω Ω (f(n))={ t(n) : il existe des constantes strictement positives c et n 0 telles que : 0 cf(n) t(n), n n 0 }. On dit que f(n) est une borne inférieure asymptotique pour t(n). On en déduit immédiatement le théorème suivant : Théorème : f(n) = θ(g(n)) f(n) = O(g(n)) et f(n) = Ω(g(n)). Notations asymptotiques dans les équations Il est important de bien comprendre comment ces notations asymptotiques sont utilisées dans les formules mathématiques. 1- Lorsque la notation asymptotique se trouve isolée dans le membre de droite d une équation, le signe = signifie l appartenance. En général, lorsqu une notation asymptotique apparaît dans une formule, on l interprète comme représentant une certaine fonction anonyme qu il est inutile de nommer. 2- Le nombre de fonctions anonymes dans une expression doit être considéré comme étant égal au nombre de fois qu une notation asymptotique apparaît. 3- Lorsqu une notation asymptotique apparaît dans le membre de gauche d une équation, on interprète ce type d équation à l aide de la règle suivante : «Quelle que soit la manière dont on choisit les fonctions anonymes à gauche du signe =, il existe une manière de choisir les fonctions anonymes à droite du signe = qui rendra l équation valide. Interprétation en analyse d algorithmes - Dans le cadre du cours, t(n) s interprétera comme le temps mis par un algorithme pour traiter un exemplaire de taille n n 0, et f(n) comme une fonction exprimant que, à un facteur constant c près, ce temps ne peut pas être supérieur à la valeur de f(n) pour cette taille n. - En partant de f(n), O(f(n)) représente l ensemble de tous les temps d exécution (d algorithmes potentiels!) plafonnés par f(n), toujours à un facteur constant c près pour n n 0.
Considérations algorithmiques - Si un algorithme s exécute en t(n) secondes sur un exemplaire de taille n, alors toute autre implantation s exécutera en un temps dans l ordre de t(n). - Plus généralement, pour dire qu un algorithme donné prend un temps dans l ordre de f(n), on peut choisir n importe quelle fonction f telle que t(n)=o(f(n)). D un point de vu pratique, nous cherchons à trouver la forme la plus simple pour f(n) telle que t(n)=o(f(n)). - Réflexivité de O : t(n)=o(t(n)). Dualité entre O et Ω. f(n) = O(g(n)) g(n) = Ω(f(n)) (Preuve en classe) Différence entre O et Ω pour l analyse en pire cas a) Un algorithme prend un temps dans O(f(n)) en pire cas implique que cf(n) est une borne supérieure pour chaque exemplaire de taille n (suffisamment grand!). b) Un algorithme prend un temps dans Ω(f(n)) en pire cas implique que c(f(n)) est une borne inférieure sur le pire cas de taille n (suffisamment grand!). Règle du maximum Soient f et g : N R des fonctions (positives asymptotiquement!), alors : O( f(n) + g(n) ) = O( max(f(n), g(n)) (Preuve en classe) Bien que ces notations semblent simples, il est parfois difficile de bien les manipuler. Regardons quelques exemples afin de vérifier notre compréhension (exemples en classe).
Quelques propriétés des notations (En supposant que f(n) et g(n) sont strictement positives asymptotiquement) (* signifie O ou Ω ou θ) - Transitivité i. f(n) = *(g(n)) ^ g(n) = *(h(n)) f(n) = *(h(n)) - Réflexivité i. f(n) = *(f(n)) - Symétrie i. f(n) = θ(g(n)) g(n) = θ(f(n)) - Égalité et inclusion d ordres i. O(f(n)) = O(g(n)) f(n) O(g(n)) ^ g(n) O(f(n)) ii. O(f(n)) O(g(n)) f(n) O(g(n)) ^ g(n) O(f(n)) (Preuves en exercices) Calculs aux limites Afin d établir la relation entre deux fonctions f et g, il nous sera souvent utile d examiner : f ( n) lim. g ( n ) Comme l évaluation de cette limite sera importante non seulement pour établir la relation entre les fonctions mais aussi pour la mise en ordre d ordres de fonctions, nous nous permettons de rappeler la règle suivante (pour nos fonctions f,g : ℵ R): Règle de l Hospital Supposons que : lim f ( n) = lim g( n) = 0 (ou ). Supposons que les domaines de f et g puissent être étendus à [n 0,+ ) de façon que a) les nouvelles fonctions f* et g* soient dérivables sur cet intervalle; b) g *( x)' 0, x [n 0,+ ), alors f ( n) f * ( x)' lim = lim (à condition que cette dernière existe!). g( n) x g * ( x)'
Afin d établir la relation entre deux fonctions f et g, nous avons les résultats suivants : Soit f ( n) lim = L, n g( n) alors 1) L = 0 f = O(g) (et f θ(g)); 2) L = f = Ω(g) (et f θ(g)); 3) L = r R+ f = θ(g) (ou g=θ(f)) ; 4) La limite n existe pas on ne peut utiliser cette méthode. (Démonstrations en exercices!) (Exemples en classe) Mise en ordre d ordres de fonctions Les calculs aux limites sont très utiles afin de mettre en ordre les ordres de fonctions f(n) tendant vers l infini avec n, comme le sont les temps d exécution d algorithmes. En analyse d algorithmes, cette notion est cruciale car elle nous permet de comparer le comportement asymptotique de différents algorithmes. Nous avons vu précédemment que cela revient à calculer la limite, lorsque n tend vers l infini, du rapport des deux fonctions à comparer. Souvent, l utilisation directe de la limite suffit ; parfois, il faut combiner avec l application de la règle de l Hospital, la règle du logarithme, etc. Enfin, lorsque les fonctions à classer comportent des factorielles, la formule suivante donne une approximation de la factorielle (pour de grands entiers) : Formule de Sterling : n n! 2πn. e (Exemples en classe) Notations asymptotiques conditionnelles L idée est que l analyse d algorithmes peut etre grandement facilitée si la taille de l exemplaire respecte une certaine condition (ex. n=2 m ). Notation (ordre de f(n) lorsque P(n)) Soit P(n) un prédicat défini sur les entiers naturels, alors O( f(n) P(n) ) = {t :ℵ R* ( c R+) ( n 0 ℵ) ( n n 0 ) [ P(n) t(n) cf(n) ] }. n
Avant d énoncer la Règle de l harmonie, qui nous sera utile dans le cours, il nous faut quelques définitions. Soit une fonction t : ℵ R*, alors 1) t est finalement non décroissante ( n 0 ℵ) ( n n 0 ) [ t(n) t(n+1) ] 2) t est b-harmonieuse a. elle est finalement non décroissante b. t(bn) = O(t(n)), b 2, (b ℵ) 3) t est harmonieuse elle est b-harmonieuse b 2 entier. Règle de l harmonie Soit b 2 un entier, f : ℵ R* une fonction b-harmonieuse, t : ℵ R* une fonction finalement non décroissante telles que t(n) = θ(f(n) n est une puissance de b) alors t(n) = θ(f(n)). (Preuve : voir le livre p.90) (Important : La règle de l harmonie est la même pour O et Ω) Notre intérêt pour cette règle est que premièrement elle facilite souvent l analyse et que deuxièmement, nombre de fonctions rencontrées en analyse d algorithmes sont harmonieuses. Dans le cours, nous admettrons les résultats suivants sans démonstration : 1- log n, nlog n, n 2, a n x n +a n-1 x n-1 + +a 0 (pour a n >0) sont harmonieuses 2- n log n, 2 n, n! ne sont pas harmonieuses. Exemple d application : Nous avons vu au chapitre précédent, lors de l analyse du tri-fusion, que sous l hypothèse n=2 k : t(n)=θ( nlog n n = 2 k ). Pouvons nous conclure que t(n) = θ( nlog n ) (comme nous l avons fait intuitivement!)? Oui! 1- nlog n est harmonieuse (résultat connu) ; 2- n est une puissance de b (b = 2) ; 3- règle de l harmonie.
Opérations sur les notations asymptotiques Afin de simplifier certains calculs, nous pouvons manipuler les notations asymptotiques à l aide d opérateurs arithmétiques. Il faut cependant bien définir ces opérations. Soit * un opérateur binaire entre deux fonctions et soient X et Y des ensembles de fonctions. (ex. X et Y décrits par des notations asymptotiques) Alors X * Y = { t :ℵ R* ( f X) ( g Y) ( n 0 ℵ)( n n 0 ) [ t(n) = f(n) * g(n) ] }. Exemple Soient f, g : ℵ R*. Alors O(f(n)) + O(g(n)) = { t :ℵ R* ( u O(f(n))) ( v O(g(n))) [ t(n) = u(n) + v(n) ] }. (Ce qui est équivalent à: c,d > 0 tels que t(n) cf(n) + dg(n))