Vous êtes sur la page 1sur 3

Complexité asymptotique

Dans cette section, nous allons examiner un aspect extrêmement important


d'un algorithme, à savoir sa performance. Même si la vitesse des ordinateurs
augmente régulièrement, en fait, elle ne sera jamais assez grande. Les
utilisateurs veulent résoudre des problèmes de plus en plus complexes, et
pour un grand nombre d'algorithmes, doubler la vitesse de l'ordinateur
n'implique pas qu'on puisse résoudre un problème deux fois plus grand.

Il est donc important pour un informaticien de choisir l'algorithme le plus


rapide. Il y a là un problème difficile : la vitesse d'exécution d'un algorithme
dépend de l'ordinateur (du processeur, du type et de la quantité de mémoire,
de l'organisation et la taille du cache et éventuellement de la rapidité du
disque). Comment peut-on comparer des algorithmes du point de vue de la
performance si l'on ne connaît pas l'ordinateur sur lequel va tourner
l'algorithme ?

De plus, le temps d'exécution d'un algorithme dépend bien sûr de la taille du


problème à résoudre. Pour comparer deux algorithmes du point de vue de la
performance, il faudrait alors donner la taille du problème à résoudre. Le
résultat de cette comparaison peut varier selon la taille du problème.

Ces questions sont étudiées par une branche de l'informatique que nous
appelons la théorie de la complexité. Nous allons en particulier nous
intéresser au concept de complexité asymptotique.

L'idée de base est de ne pas mesurer directement le temps d'exécution d'un


algorithme, mais de compter le nombre d'opérations élémentaires (additions,
soustractions, comparaisons, etc.) requises par son exécution en fonction de
la taille du problème. Nous allons appeler cette fonction la fonction du
temps de l'algorithme. Pour un problème de taille , nous allons noter cette

fonction . Malheureusement, la fonction du temps ne permet pas


forcément de comparer la vitesse d'exécution de deux algorithmes. La raison
est qu'une opération élémentaire peut s'exécuter plus ou moins rapidement
selon l'ordinateur en question.

Pour contourner ces problèmes, les informaticiens ont inventé la notion


de complexité asymptotique. Avec la complexité asymptotique, on ne donne
pas la fonction du temps exacte, mais uniquement une approximation de
celle-ci. Cette approximation est donnée sous la forme d'une fonction bien
connue qui donne la forme générale de la fonction du temps.

Exemple : Prenons un algorithme dont la fonction du temps est .


La complexité asymptotique va donner l'approximation , i.e., on ne
s'occupe pas du facteur constant , mais on regarde uniquement la forme
générale de la fonction. Cette approximation permet de ne pas tenir compte
de la différence de vitesse entre différents ordinateurs.

La notation utilisée pour indiquer qu'il s'agit d'une approximation de la fonction


du temps est appelée la notation grand O , car elle utilise la lettre 'O'

majuscule. Donc, on dit qu'un algorithme avec a une complexité

asymptotique (ou simplement une complexité) (prononcer ``grand O


de cube).

La complexité asymptotique ne nous permet donc pas de comparer deux


algorithmes différents dont la forme de la fonction est la même. Une telle
comparaison ne serait d'ailleurs pas forcément utile, à cause des différences
entre les ordinateurs. Par contre, la complexité asymptotique permet de
comparer deux algorithmes dont la forme de la fonction du temps est
différente.

Exemple : pour trier un tableau de nombres par ordre croissant, il existe un

algorithme dont le nom est tri par insertion et dont la complexité est . Il
en existe un autre dont le nom est tri par tas et dont la complexité

est . Lequel est le plus rapide ? En général , ce qui


indique que le tri par tas est plus rapide que le tri par insertion (en général,
c'est le cas). Mais on ne peut pas être sûr. Il est tout à fait possible que pour

le tri par insertion et que pour le tri par tas .


Heureusement, cette situation n'arrive pratiquement jamais. Il est donc
raisonnable de conclure que le tri par tas est plus rapide que le tri par
insertion. Ceci est d'autant plus vrai que la taille du problème (la valeur de )

est grande. Dans le cas ci-dessus est supérieur à à partir


de environ. Autrement dit, si le tableau à trier a une taille supérieure

à (ce qui est souvent le cas), l'algorithme de complexité est


plus rapide, même si la constante est fois plus élevée.

Une grande partie de l'algorithmique est consacrée à trouver des algorithmes


efficaces du point de vue de la complexité asymptotique. De plus, on est
parfois capable de prouver que l'algorithme trouvé est le plus efficace
possible. Dans le cas du tri, par exemple, on peut prouver que si l'on n'utilise
que des comparaisons pour déterminer le plus grand de deux nombres, alors,
un algorithme ne peut pas avoir une complexité asymptotique inférieure

à . Un tel résultat est très important; en effet on ne perdra pas son


temps à rechercher un algorithme plus rapide qui n'existe pas.