📘 CodingMarble Learn

Complexité d'un algorithme : à quelle vitesse le travail grandit-il ?

Plusieurs algorithmes peuvent résoudre le même problème, mais certains demandent bien plus d'étapes. On mesure un algorithme en comptant ses étapes de base quand la taille de l'entrée n augmente, et non en secondes au chronomètre. La notation grand O donne un nom à cette croissance : O(1) constante, O(log n) logarithmique, O(n) linéaire, O(n log n) et O(n²) quadratique. La recherche linéaire est en O(n), la recherche dichotomique en O(log n) ; le tri à bulles est en O(n²), le tri fusion en O(n log n). La mémoire utilisée s'appelle la complexité en espace.

🎬 L'histoire pas à pas

  1. Trouve le nombre 13 dans 16 boîtes en les ouvrant une par une. Chaque boîte ouverte est une étape. C'est la recherche linéaire : jusqu'à n étapes.
  2. Si les boîtes sont rangées dans l'ordre, ouvre celle du milieu et écarte la mauvaise moitié. Recommence. La recherche dichotomique trouve 13 en seulement 4 étapes.
  3. Compare maintenant cinq types d'algorithmes pour n = 16. La hauteur de la barre montre le nombre d'étapes. Certaines restent minuscules, une est énorme.
  4. Double l'entrée, de 8 à 16. O(n) double, O(n²) devient quatre fois plus grand, et O(log n) augmente de 1 seulement.
  5. Trier 1000 éléments : le tri à bulles demande environ un million de comparaisons, le tri fusion seulement environ dix mille. La vitesse de croissance compte surtout pour les grandes entrées.
  6. À toi : déplace le curseur n de 2 à 1024. Regarde quelle barre monte le plus vite.

Astuce : fais glisser la scène 3D pour la tourner. Utilise deux doigts pour zoomer.

🤔 Les doutes courants, éclaircis

Pourquoi ne pas simplement chronométrer le programme ?

Le temps change d'un ordinateur à l'autre. Le nombre d'étapes, non. L'étape 1 compte les boîtes ouvertes, pas les secondes.

Pourquoi la recherche dichotomique peut-elle sauter la moitié des boîtes ?

Les boîtes sont dans l'ordre. Si le milieu est plus petit que la cible, tout ce qui est à sa gauche est aussi plus petit, donc aucune de ces boîtes ne peut être la réponse. Regarde les boîtes grises à l'étape 2.

Pourquoi enlève-t-on les constantes dans le grand O ?

Le grand O parle de la vitesse à laquelle le travail grandit. 2n et n doublent tous les deux quand n double, donc ils grandissent de la même façon. L'étape 4 montre ce doublement.

O(n²) est-il toujours plus lent que O(n log n) ?

Pour un très petit n, il peut même être plus rapide, mais quand n grandit, n² dépasse vite l'autre. À l'étape 5, avec n = 1000, l'écart est d'environ 100 fois.

Que veut dire log n ici, concrètement ?

log₂ n, c'est le nombre de fois où tu peux couper n en deux avant d'arriver à 1. Pour 1024, c'est 10. Déplace le curseur de la dernière étape et regarde la barre bleue grandir de 1 seulement à chaque fois que n double.

Plusieurs algorithmes pour un seul problème

Un algorithme est une suite d'étapes précises pour résoudre un problème. La plupart des problèmes peuvent être résolus par plus d'un algorithme. Par exemple, pour trouver un nom dans une liste, tu peux vérifier chaque nom, ou (si la liste est triée) tu peux la couper en deux encore et encore.

Les deux donnent la bonne réponse. La différence, c'est l'efficacité : la quantité de travail et de mémoire dont chacun a besoin. Un bon programmeur choisit l'algorithme qui reste rapide quand les données deviennent grandes.

Comparer les algorithmes selon le temps

Mesurer avec un chronomètre n'est pas juste : un ordinateur rapide fait paraître bon un algorithme lent. Alors on compte les étapes de base (comparaisons, échanges, additions) en fonction de la taille de l'entrée n.

Meilleur cas, cas moyen et pire cas

Le meilleur cas est l'entrée la plus chanceuse (13 est dans la première boîte : 1 étape). Le pire cas est la plus malchanceuse (13 n'y est pas : n étapes). On donne en général le pire cas, car c'est une promesse : l'algorithme ne sera jamais plus lent que cela.

Complexité en temps et complexité en espace

La complexité en temps dit comment le nombre d'étapes grandit avec n. La complexité en espace dit comment la mémoire supplémentaire grandit avec n. Le tri fusion est rapide mais demande de la mémoire en plus ; le tri à bulles n'en demande presque pas, mais il est lent.

La notation grand O

Le grand O décrit la vitesse de croissance en ignorant les petits détails. On garde seulement le terme le plus grand et on enlève les nombres constants : 3n² + 5n + 2 devient O(n²), car pour un grand n, la partie n² représente presque tout.

Grand ONomn = 16n = 1000Exemple
O(1)constante11lire l'élément 5 d'un tableau
O(log n)logarithmique4environ 10recherche dichotomique
O(n)linéaire161000recherche linéaire, trouver le plus grand
O(n log n)n log n64environ 10 000tri fusion
O(n²)quadratique2561 000 000tri à bulles, boucles imbriquées

Règle rapide pour le code : une boucle sur n éléments est en O(n) ; une boucle dans une boucle est en O(n²) ; couper le problème en deux à chaque fois est en O(log n).

Efficacité de la recherche linéaire et dichotomique

La recherche linéaire vérifie les éléments un par un. Pire cas : n comparaisons, donc O(n). Elle marche sur n'importe quelle liste, triée ou non.

La recherche dichotomique demande une liste triée. On regarde l'élément du milieu ; s'il est trop grand, on jette la moitié de droite, sinon celle de gauche. Chaque étape coupe la liste en deux, donc le pire cas est d'environ log₂ n + 1 comparaisons : O(log n). Pour 1 000 000 d'éléments, cela fait environ 20 étapes au lieu de 1 000 000.

Efficacité des algorithmes de tri

Les tris à bulles, par insertion et par sélection utilisent une boucle dans une boucle, donc ils font environ n²/2 comparaisons : O(n²). Le tri par insertion est en O(n) dans le meilleur cas (une liste déjà triée).

Le tri fusion coupe la liste en deux environ log₂ n fois et fait environ n de travail à chaque niveau : O(n log n). Il demande O(n) de mémoire supplémentaire.

La recherche dichotomique demande une liste triée. Si tu ne cherches qu'une seule fois, trier d'abord (n log n) coûte plus cher qu'une seule recherche linéaire (n). Si tu cherches très souvent, trier une seule fois est rentable.

Préconditions, postconditions et pièges de la récursivité

Une précondition est ce qui doit être vrai avant le début de l'algorithme (recherche dichotomique : la liste est triée). Une postcondition est ce qui est garanti à la fin (tri : chaque élément est inférieur ou égal au suivant). Les écrire aide à tester et à prouver un algorithme.

La récursivité veut dire qu'une fonction s'appelle elle-même sur un problème plus petit. Erreurs fréquentes :

Essaie : une course entre deux recherches

Écris les nombres de 1 à 32 sur des bouts de papier et pose-les dans l'ordre, face cachée. Demande à un ami de choisir un nombre secret. Cherche d'abord un par un et compte les papiers retournés. Puis cherche en retournant toujours le papier du milieu. Recommence 5 fois. Quelle méthode n'a jamais eu besoin de plus de 6 retournements ? Vérifie avec le curseur de la dernière étape 3D (n = 32 : log₂ 32 = 5).

Formules et définitions clés

Exemples résolus

1. Une liste contient 50 noms. Combien de comparaisons la recherche linéaire demande-t-elle dans le meilleur et le pire cas ?

Meilleur cas : le nom est en premier → 1 comparaison. Pire cas : le nom est en dernier ou absent → 50 comparaisons. La recherche linéaire est en O(n).

2. Quel est le plus grand nombre de comparaisons de la recherche dichotomique pour une liste triée de 1024 éléments ?

Chaque étape coupe la liste en deux : 1024 → 512 → 256 → 128 → 64 → 32 → 16 → 8 → 4 → 2 → 1. Cela fait 10 divisions par deux, plus la dernière vérification : au plus 11 comparaisons (log₂ 1024 = 10).

3. Donne le grand O de f(n) = 4n² + 10n + 7.

Garde le plus grand terme (4n²) et enlève la constante 4 : O(n²).

4. Une boucle fait varier i de 1 à n, et à l'intérieur une autre boucle fait varier j de 1 à n. Combien de fois la ligne intérieure s'exécute-t-elle ?

n fois pour chacune des n valeurs de i : n × n = n². Complexité en temps O(n²).

5. Un programme en O(n²) trie 1000 éléments en 2 secondes. Environ combien de temps pour 3000 éléments ?

n devient 3 fois plus grand, donc n² devient 3² = 9 fois plus grand : environ 2 × 9 = 18 secondes.

6. Compare le tri à bulles et le tri fusion pour n = 1000 éléments.

Tri à bulles : environ n²/2 = 500 000 comparaisons. Tri fusion : environ n log₂ n = 1000 × 10 = 10 000. Le tri fusion fait environ 50 fois moins de travail, mais il demande de la mémoire en plus.

Erreurs fréquentes

Quiz d'entraînement

1. Quelle est la complexité en temps dans le pire cas de la recherche linéaire ?
2. La recherche dichotomique ne marche que si la liste est :
3. Si n double, un algorithme en O(n²) prend environ :
4. Quel tri est en O(n log n) ?
5. Le grand O de 7n + 300 est :

Entraînement : réponds toi-même

Écris ou choisis ta réponse, puis appuie sur Vérifier. Prends un indice si tu bloques ; la solution complète s'affiche après ta réponse.

Questions fréquentes

Qu'est-ce que la complexité en temps, en mots simples ?

Elle dit comment le nombre d'étapes d'un algorithme grandit quand l'entrée devient plus grande. Par exemple, O(n) veut dire : entrée doublée, étapes doublées.

Quelle est la différence entre complexité en temps et en espace ?

La complexité en temps mesure les étapes ; la complexité en espace mesure la mémoire supplémentaire. Un algorithme peut être rapide mais utiliser beaucoup de mémoire, comme le tri fusion.

Quel est le grand O le plus rapide ?

O(1) (constante) est le meilleur, puis O(log n), O(n), O(n log n), O(n²), et l'exponentielle O(2ⁿ) est la pire parmi les complexités courantes.

Où c'est enseigné

Canada (Ontario)Grade 12C. Designing Modular Programs
Ukraine11 класAlgorithms
England (GCSE, A level)Year 103.1 Fundamentals of algorithms
USA (Common Core, NGSS, AP)Grade 11Selection and Iteration
USA (Common Core, NGSS, AP)Grade 11Algorithms and Programming
South Korea고등학교 2학년Algorithms and programming
South Korea고등학교 3학년Abstraction and algorithms

À voir d'abord

À voir ensuite