Complexité
1. Définition de la complexité
Les algorithmes se caractérisent par la taille des données qu'ils manipulent et l'ensemble
des traitements qu'ils opèrent sur ces données.
ex de taille :
nombres : le nombre lui même ou le nombre de bits (nb de chiffre en base 2)
liste, tableau, matrice, . . . : La nombre d'éléments
arbres : Nb de noeuds
graphes : Nb de noeud et/ou nb d'arêtes
ex de traitement :
affectations
allocation mémoire (pour l'espace)
comparaisons
arithmétique ,. . .
Pour un même problème, les algorithmes qui le résolve se classent selon leur complexité.
Définition (complexité) : La complexité d'un algorithme est la mesure du nombre d'opérations
fondamentales qu'il effectue sur un jeu de données. La complexité est exprimée comme une fonction
de la taille du jeu de données.
Soit Dn l'ensemble des données de taille n et T(d) le coût de l'algorithme sur la donnée d.
Complexité au meilleur : Tmin(n) =
mindDnTd
: plus petit nombre d'opérations
qu'aura à exécuter l'algorithme sur un jeu de données de taille n. C'est la borne inférieure
de la complexité de l'algorithme sur un jeu de données de taille n.
Complexité au pire : Tmax(n) =
maxdDnTd
: plus grand nombre d'opérations qu'aura à
exécuter l'algorithme sur un jeu de données de taille n.
Complexité en moyenne : Tmoy(n) =
dDn
pdTd
: moyenne des complexités pour les
données de taille n avec p(d) la probabilité de voir apparaître la donnée d.
Attention : les complexités au meilleur et au pire ne sont que des indications, elles
montrent les limites au dessus et en deça desquelles l'algorithme n'ira pas. La complexité
en moyenne montre le comportement général de l'algorithme et ne donne une bonne
mesure que si le coût varie peu avec les données et si les cas extrêmes sont rares.
Dans la pratique on s'intéresse à la complexité au meilleur et au pire.
Définition (optimalité) : Un algorithme est dit optimal si sa complexité est la complexité minimale
parmi les algorithmes de sa classe.
2. Exemple : le tri insertion
principe : n éléments, dans un tableau T, indicés de 1 à n. On considère que les
éléments de 1 à j-1 sont triés (donc au départ j = 2). On insère le jième élément à la
bonne place par décalage.
Algorithme :
Tri Insertion coût fois
pour j=2 à longueur(T) c1n *
v = T[j] c2n-1
i = j-1 c3n-1
tant que i>0 et T[i] > v c4
j=2
n
tj
**
T[i+1] = T[i] c5
j=2
n
tj1
i=i-1 c6
j=2
n
tj1
T[i+1] = v c7n-1
* une affectation de plus pour le test de sortie de boucle (lorsque j = longueur(T)+1)
** tj correspond au nombre de fois que le test de la boucle tant que s'exécute (compris entre
1 et j).
Le coût total
Tn
est donc :
Tn=c1nc2c3c7n1c4
j=2
n
tjc5c6
j=2
n
tj1
au meilleur (si le tableau est trié) :
tj
vaut toujours 1
Tn=c1nc2c3c7c4n1=c1c2c3c4c7nc2c3c4c7
au pire, lorsque le tableau est trié dans l'ordre décroissant,
, on sait que :
j=2
n
j=nn1
21
et
j=2
n
j1= nn1
2
donc :
Tn=c1nc2c3c7n1c4
nn1
21
c5c6
nn1
2
d'où :
Tn= 1
2c4c5c6n2c1c2c3c4
2c5
2c6
2c7n−c2c3c4c7
T(n) est de la forme
an2bnc
, c'est donc une fonction quadratique de n.
en moyenne : en moyenne, lors de l'insertion de l'élément v, il y a , dans la partie triée,
autant d'éléments supérieurs à v que d'éléments inférieurs à v et donc que
tj=j/2
. Cela
conduit à une complexité quadratique similaire à celle du pire cas avec des facteurs ¼ au
lieu de ½.
La complexité en moyenne est parfois difficile à établir. Le cas « au pire » ou « au mieux »
est souvent représenté par une seule configuration qu'il convient alors d'examiner. Pour le
cas moyen, toutes les configurations doivent être considérées. Pour éviter une démarche
exhaustive, un étude probabiliste ardue doit parfois être menée.
3. Notations
Pour
n
gn={ fn ∣ c1, c20et n0tel que 0c1gn fnc2gn nn0}
Une fonction f(n) appartient à
gn
si elle peut être, à partir d'un certain n0,
encadrée par deux fonctions qui sont des multiples de g(n).
On dit que g(n) borne asymptotiquement f(n). On note abusivement
fn=gn
pour dire
fngn
.
exemple 1 : montrons que
2
3n21
2n=n2
on doit déterminer trois constantes
n1, n2, c0
avec
c1n22
3n21
2nc2n2
pour
nn0
divisons par n2 :
c12
31
2nc2
On peut par exemple choisir c1 = 2/3, n0 = 3, d'où l'on déduit que l'inégalité fonctionne
pour c2 = 5/6.
exemple 2 : montrons que n3
n2
.
c1n2n3c2n2
en divisant par n2 il vient
c1nc2
on peut choisir c1 = 1 mais aucune constante n2 ne peut convenir car n est
arbitrairement grand.
Pour donner une borne supérieure ou inférieure asymptotique, on utiliser les notations
:
Ogn={ fn ∣ c0et n0tel que 0fnc g n nn0}
(borne supérieure)
Ωgn={ fn ∣ c0et n0tel que 0c g n fn nn0}
(borne inférieure)
4. Usages
Nous nous intéressons quasi exclusivement à la complexité en temps des algorithmes.
Il est parfois intéressant d'observer la complexité en espace mémoire, en bande
passante requise, etc.
Pour que les résultats de l'analyse d'algorithme soit comparable, il faut avoir un
modèle de la machine sur laquelle l'algorithme sera implémenté. On prendra comme
référence un modèle de machine à accès aléatoire et à processeur unique les
opérations sont exécutées l'une après l'autre sans opérations simultanées.
Une complexité est généralement donnée en ordre de grandeur, lorsque n devient
grand, les termes les moins significatifs sont négligés. Ainsi pour le tri par insertion, on
notera :
- meilleur cas :
n
- pire cas :
n2
- en moyenne :
n2
Les algorithmes sont en général comparés sur leur complexité au pire, aussi celle-ci est
donné en O(f(n)).
Classes de complexité :
constant :
O1
On rencontre cette complexité quand toutes les instructions sont exécutées une
seule fois qu'elle que soit la taille n du problème.
sub-linéaire :
Olog n
Ce cas de figure se rencontre quand la taille du problème est divisée
par une entité constante à chaque itération (ex : recherche dichotomique)
linéaire :
On
boucle de 1 à n et le corps de la boucle effectue un travail de durée constante et
indépendante de n.
Onlog n
algorithmes quasi-linéaires où à chaque itération la taille du problème est
divisée par une constante avec à chaque fois un parcours linéaire des données.
polynomiale :
Onk
concerne des algorithmes considérés comme lents lorsque k
> 3. boucles imbriquées chacune allant de 1 à n
exponentielle :
Okn
pour k >= 2 donné, concerne des algorithmes considérés
comme impraticables (exemple : 2n pour les tours de Hanoï)
factorielle :
On !
n
log2n
nlog2n
n2
n3
2n
10 0 1 1 2
10 3,32 33,2 100 1 000 1 024
100 6,64 664 10 000
106
1,26×1030
1 000 9,965 9965 1 000 000
109
(
101000log102
=
10300
)
1 000 000 19;931 19 931 568
1012
1018
10929,89 29897352854 1018 1027
2n
(x 2)
~+1
(=> si 2x plus
de données,
on ajoute une
opération)
x2 + 2n
≈ x2
x 4 x 8 carré
Si 109 opérations par secondes
n
log2n
nlog2n
n2
n3
2n
100
10-6 s 10-5 s
103
s
400×109
siècles
1 000 10-8 s 10-5 s 10-3 s 1 s
1 000 000 2 x 10-8 s 2 x 10-2 s 103 s = 16,6
min
31 ans
1093 x 10-8 s 30 s 109 sec = 31
ans
31 x 109
années
5. Dernier exemple : tri rapide
écrire algorithme
complexité partition : O(n)
au pire : n appels à partition => O(n2)
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !