TUTORIEL ALGO/METHODES 
Complexité d'un algorithme
Présentation de la notation "grand O", permettant de noter la complexité d'un algorithme et la comparer à celle des autres. (08/09/2005)
Qu'un algorithme parvienne au bon résultat est une chose, encore faut-il qu'il le fasse dans un temps raisonnable. Un algorithme peut ainsi demander beaucoup de ressources (mémoires, temps, espace disque...) pour parvenir à un résultat, tandis qu'un autre mieux conçu le ferait de manière plus efficace.
Il faut dès lors choisir l'algorithme le plus approprié face à une situation : un code pour une calculatrice à énergie solaire disposera certainement de moins de ressources qu'un autre pour vérifier le bon déroulement du décollage de la fusée Ariane.

Il s'agit donc d'évaluer les besoins en ressources d'un ou plusieurs algorithmes, afin de les rattacher à une courbe connue ou à les comparer entre eux. Étant donnés les prix en chute de la mémoire et de l'espace disque, la complexité la plus pertinente reste celle en temps. Par ailleurs, il est fréquent de devoir sacrifier l'efficacité en stockage pour privilégier le temps d'exécution.

On recense trois types de complexité :

 - Complexité "dans le pire des cas" : situations où les données obligent l'algorithme à un maximum d'itérations

 - Complexite "dans le meilleur des cas" : situation où les données autorisent l'algorithme à les traiter en un minimum d'itérations

 - Complexité moyenne : moyenne de toutes les situations possibles

Chaque cas d'utilisation devra être étudié selon les données à traiter. Si l'on entre dans un cadre plus général, c'est la complexité moyenne qui sera à prendre en compte. L'objectif est bien évidemment que ce calcul de complexité se fasse indépendamment du processeur, du type de mémoire, etc.

La comparaison de l'efficacité des algorithmes se fait grâce à la notation "grand O" ("O" signifiant "de l'ordre de") ou notation de Landon, qui décrit le comportement asymptotique des fonctions mathématiques, et par extension permet d'indiquer la rapidité avec laquelle elle (ou sa courbe descriptive) augmente ou diminue. Il existe également une notation "petit o".

En effet, les algorithmes ne peuvent décemment être testés sur 10 ou 100 possibilités, mais parfois dans des quantités astronomiques (si l'algorithme est crucial). Les algorithmes connus sont donc tous rattachés à l'une des notations grand O, qui permet de savoir de quelle manière évolue une courbe temps/possibilités. Cela permet de repérer d'un seul coup d'oeil les algorithmes efficaces pour un très petit échantillon, ceux qui prennent constamment le même temps...

Cette évolution des courbes peut suivre divers cadres connus :
 - x = y, quand l'augmentation est constante et quasiment rectiligne
 - x = log(y), quand elle correspond à celle du logarithme.

Ainsi, on dénombre un certain nombre de types de notations grand O :
 - O(1) : le traitement prend toujours le même temps, quel que soit le nombre de données.

 - O(n) : le temps de traitement est constamment proportionnel au nombre de données, quasiment linéaire.

 - O(n!) : le temps de traitement correspond à une factorielle du nombre de données.

 - O(log(n)) : évolution logarithmique

 - O(n*log(n)) : évolution linéarithmique

 - O(c^n) : évolution exponentielle

  Forum

Réagissez dans les forums de JDN Développeurs

Ainsi, en rapprochant son algorithme d'une des notations grand O, on est mesure de comparer directement son amplitude avec celle d'un autre algorithme, et donc de voir lequel est le plus approprié pour le travail à accomplir, ou le cadre dans lequel il se réalise.
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages