1. Pourquoi mesurer la complexité formelle ?

Mesurer l’efficacité d’un algorithme par son temps d’exécution en secondes est trompeur : ce temps varie selon la puissance du processeur, le système d’exploitation et la charge de la machine. L’informatique théorique recourt donc à la notation grand O (Big-O), qui exprime l’asymptotique du nombre d’opérations requises en fonction de la taille n des données d’entrée dans le pire des scénarios.

2. La hiérarchie des complexités courantes

Notation Appellation Comportement avec n = 1000 Exemple typique
O(1) Constante 1 opération Accès index de liste ou dictionnaire
O(log n) Logarithmique ~10 opérations Recherche dichotomique dans liste triée
O(n) Linéaire 1 000 opérations Parcours simple d’une liste
O(n log n) Quasi-linéaire ~10 000 opérations Tri fusion (Merge Sort), Timsort
O(n²) Quadratique 1 000 000 opérations Double boucle imbriquée, tri à bulles
O(2^n) Exponentielle Incalculable (univers) Fibonacci récursif naïf

3. Analyse spatiale (consommation mémoire)

L’optimisation algorithmique exige un arbitrage constant entre temps d’exécution (CPU) et occupation mémoire (RAM). Créer une copie intégrale d’un ensemble de données pour accélérer un calcul requiert O(n) d’espace supplémentaire, tandis qu’un algorithme “en place” (in-place) opère avec O(1) d’espace mémoire annexe.

Synthèse pédagogique : Un ingénieur logiciel compétent ne se demande pas simplement si son code fonctionne, mais comment son code se comportera lorsque le volume de données sera multiplié par dix mille.