Vous êtes sur la page 1sur 7

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 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).

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 : ℵ→ℜ.

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 c1, c2 et un n0


telles que : 0 ≤ c1f(n) ≤ t(n) ≤ c2f(n) , ∀n ≥ n0 }.

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 n0 telles


que : 0 ≤ t(n) ≤ cf(n) , ∀n ≥ n0 }.
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 n0 telles


que : 0 ≤ cf(n) ≤ t(n) , ∀n ≥ n0 }.

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 ≥ n0, 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 ≥ n0.
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 .
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)

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
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=2m).

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 :ℵ ∃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.

Soit une fonction t : ℵ→ℜ*, alors

1) t est finalement non décroissante ⇔ (∃n0∈ℵ) (∀n≥n0) [ 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 : ℵ→ℜ* une fonction b-harmonieuse, t : ℵ→ℜ* 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, n2, anxn +an-1xn-1+…+a0 (pour an>0) sont harmonieuses


2- nlog n, 2n, 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=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.

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 :ℵ ∃f∈
∈X) (∃
∃g∈ ∃n0∈ℵ)(∀
∈Y) (∃ ∀n≥
≥n0) [ t(n) = f(n) * g(n) ] }.

Exemple

Soient f, g : ℵ→ℜ*. Alors

ℵ→ℜ* | (∃
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))

Vous aimerez peut-être aussi