Méthode binaire
double power (double x, int n) {
double y = 1.0;
for (int i = 0; i < n; i++)
y *= x;
return y; n = 0, xn = 1
}
n = 1, xn = x
n pair xn = (xn/2)2
n impair xn = (xn/2)2 × x
double power (double x, int n) {
if (n == 0) return 1;
if (n == 1) return x;
if ((n % 2) == 0)
reurtn power(x, n div 2))**2;
return x * power(x, n div 2))**2;
}
Taille n Opérations
élémentaires
On obtient :
Coût Nombre de fois
for j in 2..n loop c1 n
a := A(j) ; c2 n–1
i := j-1 ; c3 n–1
n
while i > 0 and A(i) > a loop c4 Σ j = 2 tj
n
A(i+1) := A(i) ; c5 Σ j = 2 (tj - 1)
n
i := i - 1 ; c6 Σ j = 2 (tj - 1)
end loop ;
A(i+1) := a ; c7 n–1
end loop ;
return A ;
n n n
T(n) = c1n + c2 (n – 1) + c3 (n – 1) + c4 Σ t + c Σ (t - 1) + c Σ (t – 1) + c
j=2
j 5
j=2
j 6
j=2
j 7 (n – 1)
Cas favorable : tj = 1
Cas défavorable : tj = j
n ( n + 1) n ( n + 1)
T(n) = c1n + c2 (n – 1) + c3 (n – 1) + c4 – 1 + c5 +
2 2
n ( n + 1)
c6 + c7 (n – 1)
2
c4 + c5 + c6 2 c –c –c
T(n) = n + c1 + c2 + c3 + 4 5 6 + c7 n – (c2 + c3 + c4 + c7)
2 2
T(n) = An2 + Bn + C
T(n) = Fonction quadratique de n
Ceci revient à dire que f (n) est égale à g (n) à un facteur constant près
pour n assez grand.
Illustration intuitive
c2 . g (n)
f (n)
c1 . g (n)
n0 f (n) = Θ (g (n)) n
Exemple
1 2
f (n) = n − 3n
2
f (n) = Θ (n2) ? ⇒ Il faut trouver c1, c2 et n0 > 0 telles que :
1 2
c1 . ≤ n − 3n ≤ c2 . n2 pour tout n ≥ n0
n2
2
1 3
c1 ≤ − ≤ c2
2 n
1 3 1 1 1 3
∀ n ≥ 1, − ≤ c2 ≤ et ∀ n ≥ 7, ≤ c1 ≤ −
2 n 2 14 2 n
1 1
On pose donc n0 = 7, c1 = et c2 =
14 2
© Ramzi GUETARI 10/18/2021
Définitions (2 / 5)
21
On dit que g (n) est une borne supérieure asymptotique pour f (n) et
l’on écrit f (n) ∈ O (g (n)) s’il existe un constante c > 0 telle que pour n
assez grand on ait :
0 ≤ f (n) ≤ c . g (n)
Ceci revient à dire que f (n)
( ) est inférieure à g (n)
( ) à une constante près
pour n assez grand.
Illustration intuitive
c . g (n)
f (n)
n0 f (n) = O (g (n)) n
On dit que g (n) est une borne inférieure asymptotique pour f (n) et l’on
écrit f (n) ∈ Ω (g (n)) s’il existe un constante c > 0 telle que pour n assez
grand on ait :
0 ≤ c . g (n) ≤ f (n)
Ceci revient à dire que f (n)
( ) est supérieure à g (n)
( ) à une constante près
pour n assez grand.
Illustration intuitive
f (n)
c . g (n)
n0 f (n) = Ω (g (n)) n
Ceci revient à dire qu’à l’infini, la fonction f (n) devient négligeable par
rapport à la fonction g (n) :
f ( n)
lim
n → +∞
=0
g ( n)
On dit que g (n) est une borne inférieure non asymptotique approchée
pour f (n) et l’on écrit f (n) ∈ ω (g (n)) si pour toute constante c > 0 il
existe une constante n0 > 0 telle que :
f ( n)
lim
n → +∞
=∞
g ( n)
Si la limite existait
© Ramzi GUETARI 10/18/2021
Propriétés (1 / 2)
27
Coût en Θ (log n)
Exemple : Recherche dichotomique dans un tableau trié A (1 .. n)
Coût en Θ (n)
Exemple : Calcul du produit scalaire de deux vecteurs de Rn
Coût en Θ (n log n)
Exemple : Tri par fusion
f (n) = n
f (n) = log n
n
© Ramzi GUETARI 10/18/2021
Comparaison
36
T (n) n = 10 n = 20 n = 30 n = 40 n = 50 n = 60
log n 1 µs 1.3 µs 1.5 µs 1.6 µs 1.7 µs 1.8 µs
n 10 µs 20 µs 30 µs 40 µs 50 µs 60 µs
n log n 10 µs 26 µs 44 µs 64 µs 85 µs 107 µs
n2 100 µs 400 µs 900 µs 1.6 ms 2.5 ms 3.6 ms
n3 1 ms 8 ms 27 ms 64 ms 125 ms 216 ms
n5 0.1 s 3s 24 s 1.7 mn 5 mn 13 mn
2n 1 ms 1s 18 mn 13 jours 36 ans 366 siècles
3n 60 mn 1 heure 6 ans 3900 siècles 2×108 siècles 1,3×1013 siècles
log2 (100) + N = N’
n N 100 N 1000 N
n2 N 10 N 32 N
n3 N 4.6 N 10 N
n5 N 2.5 N 4N
2n N N+7 N + 10
3n N N+4 N+6
i 0 1 2 3 4 5 6 7 8 9
A 31 -41 59 26 -53 58 97 -93 -23 84
Mais on peut encore mieux faire. L'idée cette fois est de parcourir une
seule fois le tableau et de maintenir simultanément deux maximums : la
plus grande somme « max1 » et un « max2 » qui est remis à zéro chaque
fois qu’il devient négatif. La plus grande somme recherchée est égale soit
à « max1 » soit à « max2 » d'où l'algorithme:
Return max1 ;
END
© Ramzi GUETARI 10/18/2021
Exemples
47
La réponse est non car tout algorithme résolvant ce problème est obligé
de parcourir l'intégralité des données, donc a une complexité au moins
linéaire.
Sur un PC à 400 MHz, pour un tableau de taille 107 Jon Bentley donne
l’estimation suivante (Programming Pearls, Addison-Wesley, 2000) ) des
temps d'exécution: