Fiche Complexité Algorithmique en C
Fiche de Révision : Complexité Algorithmique en C
1. Introduction à la Complexité
La complexité algorithmique permet de mesurer l’efficacité d’un algorithme en termes de temps d’exécution et d’utilisation mémoire.
Pourquoi étudier la complexité ?
- Comparer plusieurs algorithmes pour un même problème.
- Optimiser les performances en choisissant l’algorithme le plus adapté.
- Prédire le temps d’exécution et la mémoire utilisée en fonction de la taille des données.
Complexité temporelle vs. spatiale
- Complexité temporelle : Nombre d’opérations exécutées en fonction de la taille de l’entrée.
- Complexité spatiale : Quantité de mémoire requise pour exécuter l’algorithme.
- Principe espace-temps : Pour accélérer un algorithme, il est souvent nécessaire d’utiliser plus de mémoire (ex : stockage de résultats intermédiaires).
2. Classes de Complexité Courantes
Complexité | Notation | Exemples d’algorithmes |
---|---|---|
Constante | O(1) | Accès à un élément d’un tableau |
Logarithmique | O(log n) | Recherche dichotomique |
Linéaire | O(n) | Parcours d’un tableau |
Quasi-linéaire | O(n log n) | QuickSort, MergeSort |
Quadratique | O(n²) | Tri par insertion, Tri à bulles |
Polynomiale | O(nᵃ) | Algorithme de Floyd-Warshall |
Exponentielle | O(2ⁿ) | Algorithmes de bruteforce |
Factorielle | O(n!) | Problèmes combinatoires |
3. Comparaison des Algorithmes
Exemple : Recherche d’un mot dans un dictionnaire de 1 million de mots :
- Recherche séquentielle (O(n)) :
- Meilleur cas : 1 milliseconde.
- Pire cas : 16 minutes.
- Recherche dichotomique (O(log n)) :
- Pire cas : 20 millisecondes.
➡️ Conclusion : Une amélioration de la complexité réduit drastiquement le temps d’exécution.
4. Calcul de la Complexité
Un algorithme est composé d’opérations élémentaires :
- Affectations : stockage de valeurs
- Opérations arithmétiques : +, -, *, /
- Comparaisons : ==, <, >, etc.
Exemple d’algorithme itératif
- Nombre d’affectations : O(1)
- Nombre de comparaisons : O(n)
- Nombre d’additions : O(n)
➡️ Complexité totale : O(n)
Exemple d’algorithme récursif
- Nombre d’appels récursifs : n
➡️ Complexité totale : O(n)
5. Algorithmes à Complexité Exponentielle
Un algorithme est dit exponentiel s’il double le nombre d’opérations à chaque nouvelle entrée.
Exemple : Fibonacci naïf — O(2ⁿ)
Problème : Pour n = 50, il effectue plus de 10¹² opérations !
✅ Solution : Optimiser avec la programmation dynamique ➡️ O(n)
6. Erreurs Courantes
- Sous-estimer l’importance du pire cas.
- Ignorer les constantes cachées : O(1000n) vs O(2n).
- Utiliser un algorithme inadapté (ex : tri O(n²) au lieu de O(n log n)).
- Négliger la complexité spatiale : Un gain de temps peut entraîner une forte consommation mémoire.
7. Bonnes Pratiques
- Éviter les boucles inutiles ➡️ Réduction possible de O(n²) à O(n log n).
- Privilégier les algorithmes optimisés (ex : QuickSort vs Tri à bulles).
- Utiliser la mémorisation et la programmation dynamique pour éviter les recalculs inutiles.
- Viser une complexité inférieure à O(n²) quand c’est possible.
❌ À éviter : Les algorithmes exponentiels sont impraticables pour de grandes entrées.
Le contenu de cet article est la propriété exclusive de son auteur.