Algorithmique et complexité⚓︎
Fiche méthode & révision — Première NSI · Chapitre 6
Fiche compacte pour refaire seul les exercices : pseudo-code, trace
d'exécution, correction et terminaison, calcul du coût T(n) et
ordres de complexité (O(1), O(log n), O(n), O(n log n), O(n²)).
1. Objectifs⚓︎
À la fin du chapitre, vous devez savoir :
- connaître : pseudo-code, correction (partielle / totale), terminaison, complexité ;
- expliquer le rôle d'une variable, d'une boucle, d'une condition d'arrêt ;
- suivre une trace d'exécution ;
- calculer le coût
T(n)d'un algorithme (avec le modèle du cours) ; - comparer deux complexités et l'effet du doublement de
n.
2. Définitions essentielles⚓︎
| Terme | Définition |
|---|---|
| Algorithme | Suite finie d'étapes résolvant un problème. |
| Pseudo-code | Description d'un algorithme indépendante d'un langage. |
| Entrée | Données fournies. |
| Sortie | Résultat produit. |
| Processus itératif | Répétition d'étapes (boucle). |
| Trace d'exécution | Suivi des valeurs des variables, pas à pas. |
| Correction partielle | Si l'algorithme s'arrête, il donne le bon résultat. |
| Terminaison | L'algorithme s'arrête toujours. |
| Correction totale | Correction partielle + terminaison. |
Taille n |
Mesure de la quantité de données. |
| Opération élémentaire | Action de base (affectation, comparaison…). |
Coût T(n) |
Nombre d'opérations selon n. |
| Complexité temporelle | Évolution du temps selon n. |
| Complexité spatiale | Évolution de la mémoire selon n. |
| Ordre de complexité | Comportement dominant : O(n), O(n²)… |
3. Fiches méthodes⚓︎
Décrire un algorithme en pseudo-code
- Repérer : entrées, traitement, sortie.
- Modèle :
Fonction nom(entrées) : initialisation → boucle → résultat.
Identifier entrées, sortie, initialisation, boucle, condition d'arrêt
- Entrées : paramètres ; sortie :
return; - initialisation : avant la boucle ; condition d'arrêt : test du
while/ borne dufor.
Construire une trace d'exécution
- Étapes : noter, ligne par ligne, les valeurs des variables et la condition.
- Modèle : colonnes ligne · variables · condition · action.
Vérifier la terminaison
- Idée : montrer qu'une quantité diminue strictement vers une valeur d'arrêt.
- Erreur : affirmer qu'un algorithme termine sans justification.
Compter les opérations d'une instruction
- Appliquer le modèle de coût (voir §4).
- Exemple :
s = s + i→ lectures(1) + lecturei(1) + addition (1) + affectation (1) = 4.
Coût d'un algorithme sans boucle
- Additionner les coûts des instructions (chacune exécutée une fois).
- Exemple (aire) :
aire = L * l→ quelques opérations →O(1).
Coût d'une condition
- Coût du test + coût du bloc exécuté (penser au pire cas).
Coût d'une boucle
- Coût total = coût du corps × nombre d'itérations.
Coût de boucles imbriquées
- Multiplier les nombres d'itérations : deux boucles de
n→n²exécutions du corps.
Écrire et simplifier T(n)
- Écrire
T(n)exactement, puis garder le terme dominant et supprimer constantes et termes faibles. - Exemple :
T(n) = 4n + 2→O(n).
Reconnaître les ordres de complexité
| Ordre | Description |
|---|---|
O(1) |
constant |
O(log n) |
divise le problème (ex. par 2) |
O(n) |
une boucle linéaire |
O(n log n) |
tri efficace |
O(n²) |
deux boucles imbriquées |
Comparer l'évolution de deux complexités
- Comparer les termes dominants : pour
ngrand,O(n²)dépasseO(n), qui dépasseO(log n).
Expliquer l'effet du doublement de n
| Complexité | n → 2n |
|---|---|
O(1) |
inchangé |
O(log n) |
+ une étape |
O(n) |
× 2 |
O(n²) |
× 4 |
4. Modèle de coût du cours⚓︎
Coûts unitaires
- affectation : 1 ;
- comparaison : 1 ;
- lecture mémoire (valeur d'une variable) : 1 ;
- opération arithmétique : 1 ;
- affichage : 2.
Règle importante
On compte les opérations à l'exécution, pas à la définition d'une fonction (une fonction non appelée ne coûte rien).
5. Exemples étudiés⚓︎
Note
Les programmes exacts de tes notebooks ne sont pas joints : les versions ci-dessous suivent la logique du chapitre. Les complexités sont stables ; le détail des coûts peut varier selon la rédaction exacte.
sommeEntiers(n) — somme de 1 à n
def sommeEntiers(n):
s = 0
for i in range(1, n + 1):
s = s + i
return s
s = 0 | 1 | 1 | 1 |
| s = s + i | 4 | n | 4n |
| return s | 1 | 1 | 1 |
T(n) = 4n + 2 → O(n).
conversion(n) — décimal → binaire
def conversion(n):
b = ""
while n > 0:
b = str(n % 2) + b
n = n // 2
return b
b = "" | 1 | 1 | 1 |
| corps de boucle | c | ≈ log₂(n) | c · log₂(n) |
| return b | 1 | 1 | 1 |
Le nombre d'itérations est ≈ log₂(n) → O(log n).
puissanceMoinsUn(n) — calcule (−1)^n par une boucle
def puissanceMoinsUn(n):
r = 1
for i in range(n):
r = -r
return r
r = 1 | 1 | 1 | 1 |
| r = -r | 3 | n | 3n |
| return r | 1 | 1 | 1 |
T(n) = 3n + 2 → O(n).
trouvemot(mot, liste) — recherche
def trouvemot(mot, liste):
for m in liste:
if m == mot:
return True
return False
m == mot | 1 | n | n |
| return | 1 | 1 | 1 |
Pire cas : mot absent → n comparaisons → O(n).
6. Lecture et compréhension de code⚓︎
Méthode
- identifier les instructions répétées (corps de boucle) ;
- déterminer le nombre d'itérations (borne du
for, condition duwhile) ; - repérer le pire cas (la situation la plus coûteuse) ;
- distinguer coût fixe et coût dépendant de
n; - détecter une boucle infinie (la condition n'évolue pas) ;
- expliquer le rôle d'une variable (compteur, accumulateur…).
7. Tableaux de suivi⚓︎
Modèles de tableaux
Trace d'exécution | Ligne | Variables | Condition | Action | |---|---|---|---|
Calcul de coût | Instruction | Coût unitaire | Fréquence | Coût total | |---|---|---|---|
Comparaison de complexités
| Taille n | O(1) | O(log n) | O(n) | O(n²) |
|---|---|---|---|---|
| 10 | 1 | ≈ 3 | 10 | 100 |
| 100 | 1 | ≈ 7 | 100 | 10 000 |
8. Erreurs fréquentes⚓︎
| Erreur | Cause / correction |
|---|---|
| Compter la définition au lieu de l'exécution | une fonction non appelée ne coûte rien |
| Oublier les accès mémoire | lire une variable coûte 1 |
| Oublier une affectation | chaque = compte |
| Compter une condition une seule fois | elle est testée à chaque tour |
| Confondre nombre de boucles et complexité | le nombre d'itérations compte |
| Oublier que les boucles sont imbriquées | multiplier les itérations (n²) |
| Conserver constantes / termes faibles | garder le terme dominant |
| Confondre temps réel et complexité | la complexité décrit la croissance |
| Oublier le pire cas | analyser la situation la plus coûteuse |
| Affirmer qu'un algo termine sans justification | montrer qu'une quantité décroît |
9. Questions-réponses corrigées⚓︎
Vocabulaire⚓︎
1. (N1) Qu'est-ce que la terminaison d'un algorithme ?
La garantie qu'il s'arrête toujours.
2. (N1) Que signifie T(n) ?
Le coût (nombre d'opérations) en fonction de la taille n.
3. (N2) Différence entre correction partielle et totale ?
Partielle : juste s'il s'arrête ; totale : partielle + terminaison.
4. (N1) Qu'est-ce qu'une trace d'exécution ?
Le suivi pas à pas des valeurs des variables.
5. (N2) Différence entre complexité temporelle et spatiale ?
L'une concerne le temps, l'autre la mémoire.
Compréhension⚓︎
6. (N1) Combien d'exécutions du corps pour deux boucles de n imbriquées ?
n × n = n².
7. (N2) Pourquoi supprimer les constantes dans O() ?
On ne garde que le terme dominant, qui décrit la croissance pour n grand.
8. (N2) Pourquoi analyser le pire cas ?
Pour garantir une borne maximale du coût.
9. (N3) Si n double, comment évolue un algo en O(n²) ?
Le coût est multiplié par 4.
10. (N2) Une boucle qui divise n par 2 à chaque tour : quelle complexité ?
O(log n).
Calcul de coût⚓︎
11. (N1) Coût d'aire = L * l (modèle du cours) ?
Constant → O(1).
12. (N2) Coût d'une boucle for i in range(n): print(i) ?
print coûte 2 → 2n → O(n).
13. (N2) T(n) = 5n + 7 : quelle complexité ?
O(n).
14. (N3) T(n) = 3n² + 2n + 1 : quelle complexité ?
O(n²) (terme dominant).
15. (N3) Deux boucles imbriquées affichant (i, j) : complexité ?
O(n²) (corps exécuté n² fois).
Lecture de code⚓︎
16. (N1) Dans sommeEntiers, combien de fois s'exécute s = s + i ?
n fois.
17. (N2) Dans trouvemot, quel est le pire cas ?
Le mot est absent : n comparaisons.
18. (N2) conversion(n) : combien d'itérations environ ?
≈ log₂(n).
19. (N3) puissanceMoinsUn(n) : quelle complexité ?
O(n).
20. (N2) Une boucle while dont la variable n'évolue jamais : que se passe-t-il ?
Boucle infinie (pas de terminaison).
Méthode⚓︎
21. (N1) Comment calculer le coût d'une boucle ?
coût du corps × nombre d'itérations.
22. (N2) Comment simplifier T(n) = 4n + 10 en notation de Landau ?
O(n).
23. (N2) Comment justifier la terminaison d'une boucle while n > 0?
Montrer que n diminue strictement et atteint 0.
24. (N3) Comment trouver la complexité de boucles imbriquées ?
Multiplier les nombres d'itérations.
25. (N3) Comment comparer O(n) et O(n²) pour n grand ?
O(n²) croît beaucoup plus vite : il finit par dépasser O(n).
Correction d'erreurs⚓︎
26. (N1) Compter le coût d'une fonction jamais appelée : erreur ?
On compte l'exécution, pas la définition.
27. (N2) Donner O(2n) comme complexité : erreur ?
On supprime la constante : c'est O(n).
28. (N2) Dire « 2 boucles donc O(2) » : erreur ?
C'est le nombre d'itérations qui compte, pas le nombre de boucles.
29. (N3) Oublier que deux boucles sont imbriquées : conséquence ?
On annonce O(n) au lieu de O(n²).
30. (N2) Dire « l'algorithme est rapide donc O(1) » : erreur ?
Le temps réel ≠ la complexité (qui décrit la croissance).
10. Exercices flash corrigés⚓︎
Reconnaître entrée/sortie d'aire(L, l)
Entrées : L, l ; sortie : l'aire L * l.
Compléter un pseudo-code : initialiser une somme
s ← 0 avant la boucle.
Suivre une boucle : for i in range(3) affiche quoi ?
0, 1, 2.
Compter une ligne : coût de x = a + b
lecture a (1) + lecture b (1) + addition (1) + affectation (1) = 4.
Coût constant : prix de 5 livres à prix fixe p
5 * p → O(1).
Coût linéaire : somme d'une liste de n éléments
O(n).
Coût quadratique : afficher toutes les paires (i, j)
Deux boucles imbriquées → O(n²).
Choisir la notation : T(n) = 7n + 3
O(n).
Effet du doublement de n en O(n)
Le coût double.
Effet du doublement de n en O(n²)
Le coût est multiplié par 4.
À retenir absolument⚓︎
Correction & terminaison
- correction totale = correction partielle + terminaison ;
- terminaison : une quantité décroît strictement vers la valeur d'arrêt.
Modèle de coût
affectation · comparaison · lecture mémoire · opération arithmétique = 1 ; affichage = 2 ; on compte l'exécution, pas la définition.
Calcul de T(n)
coût de chaque instruction × sa fréquence, puis somme, puis on garde le terme dominant (sans constantes ni termes faibles).
Échelle des complexités
O(1) < O(log n) < O(n) < O(n log n) < O(n²).
Doubler n : O(n) × 2, O(n²) × 4.