Aller au contenu

Complexité algorithmique

3 min de lecture

En pratique, on s’intéresse surtout à la complexité temporelle dans le pire des cas : il vaut mieux toujours envisager le scénario le plus défavorable.


CasDescriptionExemple
Meilleur casSituation la plus favorableRecherche d’un élément en première position
Pire casSituation la plus défavorable (la plus utilisée)Élément absent d’un tableau → on parcourt tout
Cas moyenMoyenne sur toutes les entrées possiblesÉlément à une position aléatoire dans un tableau

En résumé : à partir d’une certaine taille d’entrée, l’algorithme ne dépassera jamais la courbe définie par f(n) multipliée par une constante.


NotationTypeExemple typique
O(1)ConstanteAccès à un élément de tableau, calcul simple
O(log n)LogarithmiqueRecherche dichotomique
O(√n)RacinaireRecherche de diviseurs, Jump Search
O(n)LinéaireParcours simple d’un tableau
O(n log n)Quasi-linéaireTri fusion (Merge Sort), QuickSort (cas moyen)
O(n²)QuadratiqueBoucles imbriquées, tri à bulles, tri par sélection
O(n³)CubiqueMultiplication de matrices naïve, algorithme de Floyd-Warshall
O(aⁿ)ExponentielleFibonacci naïf, sous-ensembles d’un ensemble
O(n!)FactorielleProblème du voyageur de commerce (brute force), permutations

Quel que soit le volume de données, l’algorithme effectue toujours le même nombre d’opérations.

FONCTION volumeSphère(rayon : réel) : réel
CONSTANTE PI ← 3.14159
VARIABLES volume : réel
DÉBUT
volume ← 4.0 / 3.0 * PI * rayon * rayon * rayon {1 opération}
RETOURNER volume
FIN

Qu’on lui donne un rayon de 1 ou de 1 000 000, le nombre d’opérations reste identique → O(1).


Le nombre d’opérations croît proportionnellement à la taille de l’entrée.

FONCTION somme(T : tableau, n : entier) : entier
VARIABLES somme, i : entiers
DÉBUT
somme ← 0
POUR i ← 0 À n - 1 FAIRE
somme ← somme + T[i] {exécuté n fois}
FIN_POUR
RETOURNER somme
FIN

Si le tableau double de taille, le temps double → O(n).


À chaque itération, on divise par 2 la portion à traiter. C’est le principe de la recherche dichotomique (dans un tableau trié).

FONCTION rechercheDichotomique(T : tableau, n : entier, cible : entier) : entier
VARIABLES gauche, droite, milieu : entiers
DÉBUT
gauche ← 0
droite ← n - 1
TANT_QUE gauche <= droite FAIRE
milieu ← (gauche + droite) / 2
SI T[milieu] == cible ALORS
RETOURNER milieu
SINON SI T[milieu] < cible ALORS
gauche ← milieu + 1
SINON
droite ← milieu - 1
FIN_SI
FIN_TANT_QUE
RETOURNER -1 {non trouvé}
FIN

Sur un tableau de 1 000 000 éléments, on effectue au maximum 20 comparaisonsO(log n).


Deux boucles imbriquées : pour chaque élément, on parcourt tous les autres.

POUR i ← 0 À n - 1 FAIRE
POUR j ← 0 À n - 1 FAIRE
{traitement} {exécuté n × n fois}
FIN_POUR
FIN_POUR

Si n double, le temps est multiplié par 4O(n²). C’est la complexité des tris naïfs (bulles, sélection, insertion dans le pire cas).


n = 10 n = 100 n = 1 000 n = 1 000 000
O(1) → 1 1 1 1
O(log n) → 3 7 10 20
O(n) → 10 100 1 000 1 000 000
O(n log n)→ 33 664 10 000 20 000 000
O(n²) → 100 10 000 1 000 000 10¹²
O(2ⁿ) → 1 024 1.27 × 10³⁰ ... ...