Qu'est-ce que Complexité temporelle (notation grand O) ?

Description de la façon dont le travail (complexité temporelle) ou la mémoire (complexité spatiale) nécessaires à un algorithme croissent avec le nombre de données n. Elle s'écrit en notation grand O, par exemple O(n), O(n log n) ou O(n²), en omettant les facteurs constants et les termes de degré inférieur.

Nom japonais: 計算量

« Complexité temporelle (notation grand O) » apparaît dans 7 questions d'entraînement réparties sur 1 thèmes, dont Structures de données et algorithmes.

Domaine: Structures de données et algorithmes

Lire la notation grand O

O(f(n)) signifie que, pour n suffisamment grand, le travail reste inférieur à un multiple constant de f(n). Un algorithme qui effectue 3n² + 5n + 2 comparaisons s'écrit O(n²), car le terme en n² domine quand n croît. Les classes courantes sont, par ordre croissant, O(1) (constante), O(log n) (recherche dichotomique), O(n) (recherche linéaire), O(n log n) (tri fusion, tri par tas), O(n²) (tri à bulles, tri par sélection) et O(2ⁿ) (recherche exhaustive naïve). Pour n = 1000, log₂ n vaut environ 10, n log₂ n environ 10 000, et n² vaut 1 million : pour de grandes quantités de données, la différence de complexité est décisive.

Meilleur cas, cas moyen et pire cas

Un même algorithme peut faire plus ou moins de travail selon l'entrée. Le tri par insertion effectue n−1 comparaisons, O(n), sur des données triées, mais n(n−1)/2, O(n²), sur des données en ordre inverse. Le tri rapide est en O(n log n) en moyenne mais en O(n²) dans le pire cas, selon le choix du pivot et les données. Les systèmes qui ont besoin d'une borne sur le temps de réponse s'intéressent au pire cas, tandis que les estimations du débit global utilisent le cas moyen. Quand une étape coûteuse occasionnelle se ramène en moyenne à une constante sur de nombreuses opérations, comme l'ajout dans un tableau dynamique, on parle de coût O(1) amorti.

La vitesse réelle ne dépend pas que de la complexité

Comme la notation grand O ignore les facteurs constants, deux algorithmes en O(n) peuvent avoir des vitesses réelles très différentes. Sur les ordinateurs modernes, la mémoire principale est près de 100 fois plus lente que le cache L1 : lire un tableau dans l'ordre est donc bien plus rapide que parcourir une liste chaînée. Pour un petit n, un algorithme simple de complexité moins bonne peut aussi être plus rapide, ce qui explique que les implémentations pratiques des tris utilisent le tri par insertion pour les courtes plages. Pour améliorer les performances, on vérifie d'abord qu'aucun algorithme de complexité inutilement élevée n'est utilisé, puis on mesure et on affine les détails comme les schémas d'accès à la mémoire.

S'entraîner : questions sur Complexité temporelle (notation grand O)

Pour un tableau de n éléments, quelle est la complexité temporelle d'un traitement qui compare une seule fois chaque paire d'éléments distincts (une double boucle qui compare l'élément i à tous les éléments situés après lui, en faisant avancer i d'un cran à chaque fois) ?

  1. AO(n)
  2. BO(n log n)
  3. CO(n²)
Afficher la réponse et l'explication

Réponse : C. O(n²)

Le nombre de paires comparées vaut (n−1) + (n−2) + … + 1 = n(n−1)/2, soit 45 comparaisons pour n = 10 et 499 500 pour n = 1000. La complexité temporelle, en notation O, ne décrit que la façon dont ce nombre croît quand n devient grand : on omet donc le facteur 1/2 et les termes de degré inférieur, ce qui donne O(n²). Quand n double, le nombre de comparaisons est multiplié par 4 environ. O(n) est la complexité d'un traitement qui examine chaque élément une seule fois, et O(n log n) celle d'un traitement qui coupe les données en deux de façon répétée, comme le tri fusion.

Un programme de complexité temporelle O(n²) met 0,5 seconde pour 1000 données. Combien de temps mettra-t-il environ pour 4000 données ?

  1. A2 secondes
  2. B8 secondes
  3. C32 secondes
Afficher la réponse et l'explication

Réponse : B. 8 secondes

En O(n²), le temps de traitement est proportionnel au carré du nombre de données : quatre fois plus de données donnent un temps 4² = 16 fois plus long, soit 0,5 s × 16 = 8 s. 2 secondes correspondrait à O(n), proportionnel au nombre de données, et 32 secondes à O(n³), proportionnel au cube (4³ = 64 fois). En pratique, le traitement peut être encore plus lent, par exemple quand les données ne tiennent plus dans le cache.

Questions fréquentes

Quelle est la base du logarithme dans O(log n) ?

Changer de base ne modifie la valeur que d'un facteur constant (log₂ n = log₁₀ n ÷ log₁₀ 2) : la notation grand O l'omet donc généralement. Pour les algorithmes qui divisent les données par deux à chaque étape, comme la recherche dichotomique, le nombre réel d'étapes est proche de log₂ n.

Quelle est la différence entre complexité temporelle et complexité spatiale ?

La complexité temporelle décrit la croissance du travail (du temps d'exécution), et la complexité spatiale celle de la mémoire nécessaire. On compare les deux ensemble : le tri fusion est en O(n log n) en temps avec un espace de travail en O(n), alors que le tri par tas est en O(n log n) en temps avec un espace en O(1).

« Complexité temporelle (notation grand O) » dans les explications

Questions mentionnant « Complexité temporelle (notation grand O) » (7)

  1. Pour un tableau de n éléments, quelle est la complexité temporelle d'un traitement qui compare une seule fois chaque paire d'éléments distincts (une double boucle qui compare l'élément i à tous les éléments situés après lui, en faisant avancer i d'un cran à chaque fois) ?
  2. Un programme de complexité temporelle O(n²) met 0,5 seconde pour 1000 données. Combien de temps mettra-t-il environ pour 4000 données ?
  3. Quel algorithme de tri a une complexité temporelle en O(n log n) même dans le pire cas et trie presque sans mémoire supplémentaire, comme un tableau de travail ?
  4. Quel est le cas typique dans lequel la complexité temporelle du tri rapide devient O(n²) ?
  5. Une recherche linéaire compare un à un, depuis le début, les éléments d'un tableau de 100 valeurs distinctes pour trouver une valeur cible. Si la cible se trouve toujours dans le tableau et a la même probabilité d'être à n'importe quelle position, quel est le nombre moyen de comparaisons ?
  6. On effectue une recherche dichotomique parmi 1000 valeurs distinctes triées par ordre croissant. Si une comparaison indique si les valeurs sont égales, plus petites ou plus grandes, quel est le nombre maximal de comparaisons, en comptant les recherches réussies comme infructueuses ?
  7. Pour une table de hachage contenant de nombreux éléments et maintenue à un facteur de charge d'environ 0,5, quelle est la raison la plus appropriée pour laquelle l'adressage ouvert avec sondage linéaire tend à être plus rapide que le chaînage (relier les éléments par des listes chaînées) ?

Termes associés

Tableau Recherche dichotomique (recherche binaire) Tas binaire (binary heap) Médiane Table de hachage (hash table) Liste chaînée (linked list) Ligne de cache Préchargement (prefetch) Pointeur Algorithme de Dijkstra

Retour au glossaire