Vous êtes sur la page 1sur 4

Leçon I : Complexité des algorithmes : temps et espace

1- Généralité
La complexité d’un algorithme est la classe asymptotique du temps d’exécution et celle de
l’espace mémoire occupe par cet algorithme en fonction de la taille de l’argument donné en
entrée. L’argument et la valeur renvoyée en sortie ne sont pas comptés dans la mémoire.
Deux paramètres essentiels servent à mesurer le coût d’un algorithme à savoir : le temps
d’exécution et l’espace mémoire requis.
En termes techniques, on parle respectivement de complexité temporelle et de complexité
spatiale.
D’autres critères peuvent avoir de l’importance : le nombre d’échanges entre l’unité centrale et
les disques magnétiques dans le cas de requêtes de Base de données, le trafic sur le réseau local
auquel est connecté l’ordinateur, etc. Plus généralement, toute ressource mise à disposition de
l’algorithme a un coût.
• La complexité spatiale est une mesure de l'espace utilisé par un algorithme, en fonction
de propriétés de ses entrées. L'espace compte le nombre maximum de cases mémoire
utilisées simultanément pendant un calcul. Par exemple le nombre de symboles qu'il
faut conserver pour pouvoir continuer le calcul.
• La complexité temporelle est une mesure du temps utilisé par un algorithme, exprimé
comme fonction de la taille de l'entrée. Le temps compte le nombre d'étapes de calcul
avant d'arriver à un résultat.
L’efficacité d’un algorithme se mesure par le temps d’exécution en fonction de la taille des
données d’entrée et la place mémoire nécessaire à son exécution en fonction de la taille des
données d’entrée. Ces deux fonctions sont appelées complexité de l’algorithme. La
détermination de ces fonctions s’appelle l’analyse de complexité
2- Complexité asymptotique
Soient deux algorithmes A et B résolvant le même problème de complexité respectives 100n et
n2. Quel est le plus efficace ?
• Le rapport des complexités de B à A est égal à n/100. On aura :
o Pour n < 100, B est plus efficace.
o Pour n = 100, A et B ont la même efficacité.
o Pour n > 100, A est plus efficace.
• Notons que plus n devient grand, plus A est efficace devant B. Si les tailles sont « petites
», la plupart des algorithmes résolvant le même problème se valent. C’est le
comportement de la complexité d’un algorithme quand la taille des données devient
grande qui est important.
On appelle ce comportement la complexité asymptotique
3- Complexités en temps d’un algorithme
Soient :
• Dn : l’ensemble des données de taille n.
• C(d) : le coût d’exécution de l’algorithme sur la donnée d de taille n. On définit plusieurs
mesures pour caractériser le comportement d’un algorithme

a- Complexité au meilleur ou complexité dans le meilleur cas


C’est le plus petit nombre d’opérations qu’aura à exécuter l’algorithme sur un jeu de données
de taille fixée, ici à n :

C’est une borne inferieure de la complexité de l’algorithme sur un jeu de données de taille n
b- Complexité au pire ou complexité dans le pire cas ou complexité dans le cas le plus
défavorable
C’est le plus grand nombre d’opérations qu’aura à exécuter l’algorithme sur un jeu de données
de taille fixée, ici à n :

• Il s’agit d’un maximum : l’algorithme finira donc toujours avant d’avoir effectué Tmax(n)
opérations.
• Cette complexité peut ne pas refléter le comportement « usuel » de l’algorithme, le pire
cas pouvant ne se produire que très rarement, mais il n’est pas rare que le cas moyen
soit aussi mauvais que le pire cas.
c- Complexité en moyenne
C’est la moyenne des complexités de l’algorithme sur des jeux de données de taille n :

où Pr(d) est la probabilité d’avoir la donnée d’ entrée de l’algorithme.


• Elle reflète le comportement « général » de l’algorithme si les cas extrêmes sont rares
ou si la complexité varie peu en fonction des données.
• La complexité en pratique sur un jeu de données particulier peut être nettement plus
importante que la complexité en moyenne, dans ce cas la complexité en moyenne ne
donnera pas une bonne indication du comportement de l’algorithme.
• La complexité en moyenne est beaucoup plus difficile à déterminer que la complexité
dans le pire cas, d’une part parce que l’analyse devient mathématiquement difficile, et
d’autre part parce qu’il n’est pas toujours facile de déterminer un modèle de probabilités
adéquat au problème.
4- Comparaison de deux algorithmes
Si le nombre d’entrées utilisées pour un algorithme est très faible, généralement le temps
d’exécution de l’algorithme l’est aussi. Ce qui nous intéresse, c’est comment va réagir
l’algorithme pour un nombre important de données. Donc pour comparer deux algorithmes,
nous allons comparer leur taux de croissance ou ordre de grandeur.
On considère généralement qu’un algorithme est plus efficace qu’un autre si son temps
d’exécution du cas le plus défavorable à un ordre de grandeur inférieur.
Les algorithmes habituellement rencontrés peuvent être classés dans les catégories suivantes :
Complexité Description
Complexité O (1) L’exécution ne dépend pas du nombre d’éléments en entrée
Complexité constante ou mais s’effectue toujours en un nombre constant d’opérations
temps constant
Complexité O(log (n)) La durée d’exécution croît légèrement avec n . Ce cas de figure se
Complexité logarithmique. rencontre quand la taille du problème est divisée par une entité
constante à chaque itération.
Complexité O(n) Complexité C’est typiquement le cas d’un programme avec une boucle de 1 à n
linéaire et le corps de la boucle effectue un travail de durée constante et
indépendante de n.
Complexité O (n log (n)) Se rencontre dans les algorithmes où à chaque itération la taille du
Complexité n logarithmique problème est divisée par une constante avec à chaque fois un parcours
linéaire des données. Un exemple typique de ce genre de complexité
est l’algorithme de tri "quick sort" qui, de manière récursive, divise
le tableau à trier en deux morceaux par rapport à une valeur
particulière appelée pivot, trie ensuite la moitié du tableau puis
l’autre moitié … S’il n’y avait pas cette opération de "division"
l’algorithme serait logarithmique puisqu’on divise par 2 la taille du
problème à chaque étape. Mais, le fait de reconstituer à chaque fois
le tableau en parcourant séquentiellement les données ajoute ce
facteur n au log(n). Noter que la complexité n-logarithmique est
tributaire du bon choix du pivot
Complexité O (n 2 ) Typiquement c’est le cas d’algorithmes avec deux boucles
Complexité quadratique imbriquées chacune allant de 1 à n et avec le corps de la boucle
interne qui est constant
Complexité O(n 3 ) Idem quadratique mais avec ici par exemple trois boucles
Complexité cubique imbriquées.
Complexité O(n p Algorithme dont la complexité est de la forme O(n p ) pour un certain
)Complexité polynomiale p . Toutes les complexités précédentes sont incluses dans celle-ci
Complexité O(2 n ) Les algorithmes de ce genre sont dits "naïfs" car ils sont inefficaces
Complexité exponentielle et inutilisables dès que n dépasse 50

Remarque : Un algorithme est efficace si sa complexité en temps est polynomiale, c’est-à-dire


en O(n k ) pour un entier k.

Vous aimerez peut-être aussi