Académique Documents
Professionnel Documents
Culture Documents
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 elle-
mê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).
Notation θ
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
On dit que f(n) est une borne inférieure asymptotique pour t(n).
Théorème :
Il est important de bien comprendre comment ces notations asymptotiques sont utilisées
dans les formules mathématiques.
Dualité entre O et Ω.
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
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
- 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)
Afin d’établir la relation entre deux fonctions f et g, il nous sera souvent utile
d’examiner :
f ( n)
lim .
n →∞ 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ègle de l’Hospital
Supposons que :
lim f (n) = lim g (n) = 0 (ou ∞).
n →∞ n →∞
Supposons que les domaines de f et g puissent être étendus à [n0,+∞) de façon que
a) les nouvelles fonctions f* et g* soient dérivables sur cet intervalle;
b) g * ( x)' ≠ 0, ∀x ∈ [n0,+∞),
alors
f ( n) f * ( x)'
lim = lim (à condition que cette dernière existe !).
n →∞ 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 ∈ℜ+ ⇒ 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)
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
n!≈ 2πn .
e
(Exemples en classe)
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=2m).
ℵ→ℜ* | (∃
O( f(n) | P(n) ) = {t :ℵ ∃c∈
∈ℜ+) (∃
∃n0∈ℵ) (∀
∀n≥
≥n0) [ P(n) ⇒ t(n) ≤ cf(n) ] }.
Avant d’énoncer la Règle de l’harmonie, qui nous sera utile dans le cours, il nous faut
quelques définitions.
Règle de l’harmonie
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 :
Exemple d’application :
Nous avons vu au chapitre précédent, lors de l’analyse du tri-fusion, que sous l’hypothèse
n=2k :
t(n)=θ( nlog n | n = 2k).
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.
Alors
ℵ→ℜ* | (∃
X * Y = { t :ℵ ∃f∈
∈X) (∃
∃g∈ ∃n0∈ℵ)(∀
∈Y) (∃ ∀n≥
≥n0) [ t(n) = f(n) * g(n) ] }.
Exemple
ℵ→ℜ* | (∃
O(f(n)) + O(g(n)) = { t :ℵ ∃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))