Introduction
Lors de l’apprentissage de la programmation, il est extrêmement important de comprendre l’efficacité des algorithmes. Le concept de ** complexité ** (Complexity) apparaît invariablement dans ce contexte. Cet article explique en détail les bases de la complexité temporelle et spatiale, avec une explication approfondie de la notation O (notation Big O) et des considérations approfondies avec des exemples concrets, dans un volume d’environ 20 000 caractères.
Qu’est-ce que la complexité ?
La complexité est un indicateur permettant d’évaluer les performances d’un algorithme. La complexité se divise principalement en deux catégories :
- ** Complexité temporelle ** (Time Complexity)
- ** Complexité spatiale ** (Space Complexity)
1. Complexité temporelle
La complexité temporelle est un indicateur représentant le « temps » ou le « nombre d’étapes » nécessaire pour qu’un algorithme termine son exécution.
2. Complexité spatiale
La complexité spatiale est un indicateur représentant « l’espace mémoire » nécessaire pour qu’un algorithme termine son exécution.
Qu’est-ce que la notation O (notation Big O) ?
La notation O (Big O Notation) est une notation mathématique indiquant la limite supérieure du taux d’augmentation de la complexité lorsque la taille de l’entrée $n$ devient suffisamment grande.
$$ O(f(n)) = \{ g(n) \mid ext{il existe une constante positive } c, n_0 ext{ telle que pour tout } n \ge n_0 ext{, on a } 0 \le g(n) \le c f(n) \} $$Règles de base de la notation O
- ** Ignorer les termes constants ** : $O(2n)$ devient $O(n)$.
- ** Ne conserver que le terme ayant le plus grand impact ** : $O(n^2 + n)$ devient $O(n^2)$.
graph TD
A["Taille d'entrée n"] -->|"Évaluation"| B["Notation O"]
B --> C["Complexité temporelle"]
B --> D["Complexité spatiale"]
Exemples de complexités temporelles représentatives en Python
À partir de là, examinons les explications détaillées et des exemples de code en Python pour les classes de notation O représentatives.
1. O(1) : Temps constant (Constant Time)
Il s’agit d’un algorithme dont le traitement se termine toujours en un nombre constant d’étapes, indépendamment de la taille de l’entrée $n$.
| |
2. O(log n) : Temps logarithmique (Logarithmic Time)
À mesure que la taille de l’entrée $n$ augmente, le temps d’exécution augmente, mais le rythme de cette augmentation est très lent. Un exemple typique est la recherche dichotomique.
| |
3. O(n) : Temps linéaire (Linear Time)
C’est un algorithme dont le temps d’exécution augmente proportionnellement à la taille de l’entrée $n$.
| |
4. O(n log n) : Temps quasi-linéaire (Linearithmic Time)
C’est le produit de O(n) et O(log n). De nombreux algorithmes de tri par comparaison efficaces (tri fusion, tri rapide, tri par tas, etc.) possèdent cette complexité.
| |
5. O(n^2) : Temps quadratique (Quadratic Time)
Le temps d’exécution augmente proportionnellement au carré de la taille de l’entrée $n$. Les algorithmes de tri simples, tels que le tri à bulles et le tri par insertion, entrent dans cette catégorie.
| |
6. O(2^n) : Temps exponentiel (Exponential Time)
Chaque fois que la taille de l’entrée $n$ augmente de 1, le temps d’exécution double. Une implémentation récursive simple de la suite de Fibonacci en est un exemple.
| |
7. O(n!) : Temps factoriel (Factorial Time)
Le temps d’exécution augmente proportionnellement à la factorielle de la taille de l’entrée. La recherche exhaustive (force brute) pour le problème du voyageur de commerce en est un exemple.
| |
Structures de données et complexités
| Structure de données | Accès | Recherche | Insertion | Suppression | Complexité spatiale |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algorithmes de tri et complexités
| Algorithme | Meilleur cas | Cas moyen | Pire cas | Complexité spatiale |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introduction
Lors de l’apprentissage de la programmation, il est extrêmement important de comprendre l’efficacité des algorithmes. Le concept de ** complexité ** (Complexity) apparaît invariablement dans ce contexte. Cet article explique en détail les bases de la complexité temporelle et spatiale, avec une explication approfondie de la notation O (notation Big O) et des considérations approfondies avec des exemples concrets, dans un volume d’environ 20 000 caractères.
Qu’est-ce que la complexité ?
La complexité est un indicateur permettant d’évaluer les performances d’un algorithme. La complexité se divise principalement en deux catégories :
- ** Complexité temporelle ** (Time Complexity)
- ** Complexité spatiale ** (Space Complexity)
1. Complexité temporelle
La complexité temporelle est un indicateur représentant le « temps » ou le « nombre d’étapes » nécessaire pour qu’un algorithme termine son exécution.
2. Complexité spatiale
La complexité spatiale est un indicateur représentant « l’espace mémoire » nécessaire pour qu’un algorithme termine son exécution.
Qu’est-ce que la notation O (notation Big O) ?
La notation O (Big O Notation) est une notation mathématique indiquant la limite supérieure du taux d’augmentation de la complexité lorsque la taille de l’entrée $n$ devient suffisamment grande.
$$ O(f(n)) = \{ g(n) \mid ext{il existe une constante positive } c, n_0 ext{ telle que pour tout } n \ge n_0 ext{, on a } 0 \le g(n) \le c f(n) \} $$Règles de base de la notation O
- ** Ignorer les termes constants ** : $O(2n)$ devient $O(n)$.
- ** Ne conserver que le terme ayant le plus grand impact ** : $O(n^2 + n)$ devient $O(n^2)$.
graph TD
A["Taille d'entrée n"] -->|"Évaluation"| B["Notation O"]
B --> C["Complexité temporelle"]
B --> D["Complexité spatiale"]
Exemples de complexités temporelles représentatives en Python
À partir de là, examinons les explications détaillées et des exemples de code en Python pour les classes de notation O représentatives.
1. O(1) : Temps constant (Constant Time)
Il s’agit d’un algorithme dont le traitement se termine toujours en un nombre constant d’étapes, indépendamment de la taille de l’entrée $n$.
| |
2. O(log n) : Temps logarithmique (Logarithmic Time)
À mesure que la taille de l’entrée $n$ augmente, le temps d’exécution augmente, mais le rythme de cette augmentation est très lent. Un exemple typique est la recherche dichotomique.
| |
3. O(n) : Temps linéaire (Linear Time)
C’est un algorithme dont le temps d’exécution augmente proportionnellement à la taille de l’entrée $n$.
| |
4. O(n log n) : Temps quasi-linéaire (Linearithmic Time)
C’est le produit de O(n) et O(log n). De nombreux algorithmes de tri par comparaison efficaces (tri fusion, tri rapide, tri par tas, etc.) possèdent cette complexité.
| |
5. O(n^2) : Temps quadratique (Quadratic Time)
Le temps d’exécution augmente proportionnellement au carré de la taille de l’entrée $n$. Les algorithmes de tri simples, tels que le tri à bulles et le tri par insertion, entrent dans cette catégorie.
| |
6. O(2^n) : Temps exponentiel (Exponential Time)
Chaque fois que la taille de l’entrée $n$ augmente de 1, le temps d’exécution double. Une implémentation récursive simple de la suite de Fibonacci en est un exemple.
| |
7. O(n!) : Temps factoriel (Factorial Time)
Le temps d’exécution augmente proportionnellement à la factorielle de la taille de l’entrée. La recherche exhaustive (force brute) pour le problème du voyageur de commerce en est un exemple.
| |
Structures de données et complexités
| Structure de données | Accès | Recherche | Insertion | Suppression | Complexité spatiale |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algorithmes de tri et complexités
| Algorithme | Meilleur cas | Cas moyen | Pire cas | Complexité spatiale |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introduction
Lors de l’apprentissage de la programmation, il est extrêmement important de comprendre l’efficacité des algorithmes. Le concept de ** complexité ** (Complexity) apparaît invariablement dans ce contexte. Cet article explique en détail les bases de la complexité temporelle et spatiale, avec une explication approfondie de la notation O (notation Big O) et des considérations approfondies avec des exemples concrets, dans un volume d’environ 20 000 caractères.
Qu’est-ce que la complexité ?
La complexité est un indicateur permettant d’évaluer les performances d’un algorithme. La complexité se divise principalement en deux catégories :
- ** Complexité temporelle ** (Time Complexity)
- ** Complexité spatiale ** (Space Complexity)
1. Complexité temporelle
La complexité temporelle est un indicateur représentant le « temps » ou le « nombre d’étapes » nécessaire pour qu’un algorithme termine son exécution.
2. Complexité spatiale
La complexité spatiale est un indicateur représentant « l’espace mémoire » nécessaire pour qu’un algorithme termine son exécution.
Qu’est-ce que la notation O (notation Big O) ?
La notation O (Big O Notation) est une notation mathématique indiquant la limite supérieure du taux d’augmentation de la complexité lorsque la taille de l’entrée $n$ devient suffisamment grande.
$$ O(f(n)) = \{ g(n) \mid ext{il existe une constante positive } c, n_0 ext{ telle que pour tout } n \ge n_0 ext{, on a } 0 \le g(n) \le c f(n) \} $$Règles de base de la notation O
- ** Ignorer les termes constants ** : $O(2n)$ devient $O(n)$.
- ** Ne conserver que le terme ayant le plus grand impact ** : $O(n^2 + n)$ devient $O(n^2)$.
graph TD
A["Taille d'entrée n"] -->|"Évaluation"| B["Notation O"]
B --> C["Complexité temporelle"]
B --> D["Complexité spatiale"]
Exemples de complexités temporelles représentatives en Python
À partir de là, examinons les explications détaillées et des exemples de code en Python pour les classes de notation O représentatives.
1. O(1) : Temps constant (Constant Time)
Il s’agit d’un algorithme dont le traitement se termine toujours en un nombre constant d’étapes, indépendamment de la taille de l’entrée $n$.
| |
2. O(log n) : Temps logarithmique (Logarithmic Time)
À mesure que la taille de l’entrée $n$ augmente, le temps d’exécution augmente, mais le rythme de cette augmentation est très lent. Un exemple typique est la recherche dichotomique.
| |
3. O(n) : Temps linéaire (Linear Time)
C’est un algorithme dont le temps d’exécution augmente proportionnellement à la taille de l’entrée $n$.
| |
4. O(n log n) : Temps quasi-linéaire (Linearithmic Time)
C’est le produit de O(n) et O(log n). De nombreux algorithmes de tri par comparaison efficaces (tri fusion, tri rapide, tri par tas, etc.) possèdent cette complexité.
| |
5. O(n^2) : Temps quadratique (Quadratic Time)
Le temps d’exécution augmente proportionnellement au carré de la taille de l’entrée $n$. Les algorithmes de tri simples, tels que le tri à bulles et le tri par insertion, entrent dans cette catégorie.
| |
6. O(2^n) : Temps exponentiel (Exponential Time)
Chaque fois que la taille de l’entrée $n$ augmente de 1, le temps d’exécution double. Une implémentation récursive simple de la suite de Fibonacci en est un exemple.
| |
7. O(n!) : Temps factoriel (Factorial Time)
Le temps d’exécution augmente proportionnellement à la factorielle de la taille de l’entrée. La recherche exhaustive (force brute) pour le problème du voyageur de commerce en est un exemple.
| |
Structures de données et complexités
| Structure de données | Accès | Recherche | Insertion | Suppression | Complexité spatiale |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algorithmes de tri et complexités
| Algorithme | Meilleur cas | Cas moyen | Pire cas | Complexité spatiale |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introduction
Lors de l’apprentissage de la programmation, il est extrêmement important de comprendre l’efficacité des algorithmes. Le concept de ** complexité ** (Complexity) apparaît invariablement dans ce contexte. Cet article explique en détail les bases de la complexité temporelle et spatiale, avec une explication approfondie de la notation O (notation Big O) et des considérations approfondies avec des exemples concrets, dans un volume d’environ 20 000 caractères.
Qu’est-ce que la complexité ?
La complexité est un indicateur permettant d’évaluer les performances d’un algorithme. La complexité se divise principalement en deux catégories :
- ** Complexité temporelle ** (Time Complexity)
- ** Complexité spatiale ** (Space Complexity)
1. Complexité temporelle
La complexité temporelle est un indicateur représentant le « temps » ou le « nombre d’étapes » nécessaire pour qu’un algorithme termine son exécution.
2. Complexité spatiale
La complexité spatiale est un indicateur représentant « l’espace mémoire » nécessaire pour qu’un algorithme termine son exécution.
Qu’est-ce que la notation O (notation Big O) ?
La notation O (Big O Notation) est une notation mathématique indiquant la limite supérieure du taux d’augmentation de la complexité lorsque la taille de l’entrée $n$ devient suffisamment grande.
$$ O(f(n)) = \{ g(n) \mid ext{il existe une constante positive } c, n_0 ext{ telle que pour tout } n \ge n_0 ext{, on a } 0 \le g(n) \le c f(n) \} $$Règles de base de la notation O
- ** Ignorer les termes constants ** : $O(2n)$ devient $O(n)$.
- ** Ne conserver que le terme ayant le plus grand impact ** : $O(n^2 + n)$ devient $O(n^2)$.
graph TD
A["Taille d'entrée n"] -->|"Évaluation"| B["Notation O"]
B --> C["Complexité temporelle"]
B --> D["Complexité spatiale"]
Exemples de complexités temporelles représentatives en Python
À partir de là, examinons les explications détaillées et des exemples de code en Python pour les classes de notation O représentatives.
1. O(1) : Temps constant (Constant Time)
Il s’agit d’un algorithme dont le traitement se termine toujours en un nombre constant d’étapes, indépendamment de la taille de l’entrée $n$.
| |
2. O(log n) : Temps logarithmique (Logarithmic Time)
À mesure que la taille de l’entrée $n$ augmente, le temps d’exécution augmente, mais le rythme de cette augmentation est très lent. Un exemple typique est la recherche dichotomique.
| |
3. O(n) : Temps linéaire (Linear Time)
C’est un algorithme dont le temps d’exécution augmente proportionnellement à la taille de l’entrée $n$.
| |
4. O(n log n) : Temps quasi-linéaire (Linearithmic Time)
C’est le produit de O(n) et O(log n). De nombreux algorithmes de tri par comparaison efficaces (tri fusion, tri rapide, tri par tas, etc.) possèdent cette complexité.
| |
5. O(n^2) : Temps quadratique (Quadratic Time)
Le temps d’exécution augmente proportionnellement au carré de la taille de l’entrée $n$. Les algorithmes de tri simples, tels que le tri à bulles et le tri par insertion, entrent dans cette catégorie.
| |
6. O(2^n) : Temps exponentiel (Exponential Time)
Chaque fois que la taille de l’entrée $n$ augmente de 1, le temps d’exécution double. Une implémentation récursive simple de la suite de Fibonacci en est un exemple.
| |
7. O(n!) : Temps factoriel (Factorial Time)
Le temps d’exécution augmente proportionnellement à la factorielle de la taille de l’entrée. La recherche exhaustive (force brute) pour le problème du voyageur de commerce en est un exemple.
| |
Structures de données et complexités
| Structure de données | Accès | Recherche | Insertion | Suppression | Complexité spatiale |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algorithmes de tri et complexités
| Algorithme | Meilleur cas | Cas moyen | Pire cas | Complexité spatiale |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introduction
Lors de l’apprentissage de la programmation, il est extrêmement important de comprendre l’efficacité des algorithmes. Le concept de ** complexité ** (Complexity) apparaît invariablement dans ce contexte. Cet article explique en détail les bases de la complexité temporelle et spatiale, avec une explication approfondie de la notation O (notation Big O) et des considérations approfondies avec des exemples concrets, dans un volume d’environ 20 000 caractères.
Qu’est-ce que la complexité ?
La complexité est un indicateur permettant d’évaluer les performances d’un algorithme. La complexité se divise principalement en deux catégories :
- ** Complexité temporelle ** (Time Complexity)
- ** Complexité spatiale ** (Space Complexity)
1. Complexité temporelle
La complexité temporelle est un indicateur représentant le « temps » ou le « nombre d’étapes » nécessaire pour qu’un algorithme termine son exécution.
2. Complexité spatiale
La complexité spatiale est un indicateur représentant « l’espace mémoire » nécessaire pour qu’un algorithme termine son exécution.
Qu’est-ce que la notation O (notation Big O) ?
La notation O (Big O Notation) est une notation mathématique indiquant la limite supérieure du taux d’augmentation de la complexité lorsque la taille de l’entrée $n$ devient suffisamment grande.
$$ O(f(n)) = \{ g(n) \mid ext{il existe une constante positive } c, n_0 ext{ telle que pour tout } n \ge n_0 ext{, on a } 0 \le g(n) \le c f(n) \} $$Règles de base de la notation O
- ** Ignorer les termes constants ** : $O(2n)$ devient $O(n)$.
- ** Ne conserver que le terme ayant le plus grand impact ** : $O(n^2 + n)$ devient $O(n^2)$.
graph TD
A["Taille d'entrée n"] -->|"Évaluation"| B["Notation O"]
B --> C["Complexité temporelle"]
B --> D["Complexité spatiale"]
Exemples de complexités temporelles représentatives en Python
À partir de là, examinons les explications détaillées et des exemples de code en Python pour les classes de notation O représentatives.
1. O(1) : Temps constant (Constant Time)
Il s’agit d’un algorithme dont le traitement se termine toujours en un nombre constant d’étapes, indépendamment de la taille de l’entrée $n$.
| |
2. O(log n) : Temps logarithmique (Logarithmic Time)
À mesure que la taille de l’entrée $n$ augmente, le temps d’exécution augmente, mais le rythme de cette augmentation est très lent. Un exemple typique est la recherche dichotomique.
| |
3. O(n) : Temps linéaire (Linear Time)
C’est un algorithme dont le temps d’exécution augmente proportionnellement à la taille de l’entrée $n$.
| |
4. O(n log n) : Temps quasi-linéaire (Linearithmic Time)
C’est le produit de O(n) et O(log n). De nombreux algorithmes de tri par comparaison efficaces (tri fusion, tri rapide, tri par tas, etc.) possèdent cette complexité.
| |
5. O(n^2) : Temps quadratique (Quadratic Time)
Le temps d’exécution augmente proportionnellement au carré de la taille de l’entrée $n$. Les algorithmes de tri simples, tels que le tri à bulles et le tri par insertion, entrent dans cette catégorie.
| |
6. O(2^n) : Temps exponentiel (Exponential Time)
Chaque fois que la taille de l’entrée $n$ augmente de 1, le temps d’exécution double. Une implémentation récursive simple de la suite de Fibonacci en est un exemple.
| |
7. O(n!) : Temps factoriel (Factorial Time)
Le temps d’exécution augmente proportionnellement à la factorielle de la taille de l’entrée. La recherche exhaustive (force brute) pour le problème du voyageur de commerce en est un exemple.
| |
Structures de données et complexités
| Structure de données | Accès | Recherche | Insertion | Suppression | Complexité spatiale |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algorithmes de tri et complexités
| Algorithme | Meilleur cas | Cas moyen | Pire cas | Complexité spatiale |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introduction
Lors de l’apprentissage de la programmation, il est extrêmement important de comprendre l’efficacité des algorithmes. Le concept de ** complexité ** (Complexity) apparaît invariablement dans ce contexte. Cet article explique en détail les bases de la complexité temporelle et spatiale, avec une explication approfondie de la notation O (notation Big O) et des considérations approfondies avec des exemples concrets, dans un volume d’environ 20 000 caractères.
Qu’est-ce que la complexité ?
La complexité est un indicateur permettant d’évaluer les performances d’un algorithme. La complexité se divise principalement en deux catégories :
- ** Complexité temporelle ** (Time Complexity)
- ** Complexité spatiale ** (Space Complexity)
1. Complexité temporelle
La complexité temporelle est un indicateur représentant le « temps » ou le « nombre d’étapes » nécessaire pour qu’un algorithme termine son exécution.
2. Complexité spatiale
La complexité spatiale est un indicateur représentant « l’espace mémoire » nécessaire pour qu’un algorithme termine son exécution.
Qu’est-ce que la notation O (notation Big O) ?
La notation O (Big O Notation) est une notation mathématique indiquant la limite supérieure du taux d’augmentation de la complexité lorsque la taille de l’entrée $n$ devient suffisamment grande.
$$ O(f(n)) = \{ g(n) \mid ext{il existe une constante positive } c, n_0 ext{ telle que pour tout } n \ge n_0 ext{, on a } 0 \le g(n) \le c f(n) \} $$Règles de base de la notation O
- ** Ignorer les termes constants ** : $O(2n)$ devient $O(n)$.
- ** Ne conserver que le terme ayant le plus grand impact ** : $O(n^2 + n)$ devient $O(n^2)$.
graph TD
A["Taille d'entrée n"] -->|"Évaluation"| B["Notation O"]
B --> C["Complexité temporelle"]
B --> D["Complexité spatiale"]
Exemples de complexités temporelles représentatives en Python
À partir de là, examinons les explications détaillées et des exemples de code en Python pour les classes de notation O représentatives.
1. O(1) : Temps constant (Constant Time)
Il s’agit d’un algorithme dont le traitement se termine toujours en un nombre constant d’étapes, indépendamment de la taille de l’entrée $n$.
| |
2. O(log n) : Temps logarithmique (Logarithmic Time)
À mesure que la taille de l’entrée $n$ augmente, le temps d’exécution augmente, mais le rythme de cette augmentation est très lent. Un exemple typique est la recherche dichotomique.
| |
3. O(n) : Temps linéaire (Linear Time)
C’est un algorithme dont le temps d’exécution augmente proportionnellement à la taille de l’entrée $n$.
| |
4. O(n log n) : Temps quasi-linéaire (Linearithmic Time)
C’est le produit de O(n) et O(log n). De nombreux algorithmes de tri par comparaison efficaces (tri fusion, tri rapide, tri par tas, etc.) possèdent cette complexité.
| |
5. O(n^2) : Temps quadratique (Quadratic Time)
Le temps d’exécution augmente proportionnellement au carré de la taille de l’entrée $n$. Les algorithmes de tri simples, tels que le tri à bulles et le tri par insertion, entrent dans cette catégorie.
| |
6. O(2^n) : Temps exponentiel (Exponential Time)
Chaque fois que la taille de l’entrée $n$ augmente de 1, le temps d’exécution double. Une implémentation récursive simple de la suite de Fibonacci en est un exemple.
| |
7. O(n!) : Temps factoriel (Factorial Time)
Le temps d’exécution augmente proportionnellement à la factorielle de la taille de l’entrée. La recherche exhaustive (force brute) pour le problème du voyageur de commerce en est un exemple.
| |
Structures de données et complexités
| Structure de données | Accès | Recherche | Insertion | Suppression | Complexité spatiale |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algorithmes de tri et complexités
| Algorithme | Meilleur cas | Cas moyen | Pire cas | Complexité spatiale |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introduction
Lors de l’apprentissage de la programmation, il est extrêmement important de comprendre l’efficacité des algorithmes. Le concept de ** complexité ** (Complexity) apparaît invariablement dans ce contexte. Cet article explique en détail les bases de la complexité temporelle et spatiale, avec une explication approfondie de la notation O (notation Big O) et des considérations approfondies avec des exemples concrets, dans un volume d’environ 20 000 caractères.
Qu’est-ce que la complexité ?
La complexité est un indicateur permettant d’évaluer les performances d’un algorithme. La complexité se divise principalement en deux catégories :
- ** Complexité temporelle ** (Time Complexity)
- ** Complexité spatiale ** (Space Complexity)
1. Complexité temporelle
La complexité temporelle est un indicateur représentant le « temps » ou le « nombre d’étapes » nécessaire pour qu’un algorithme termine son exécution.
2. Complexité spatiale
La complexité spatiale est un indicateur représentant « l’espace mémoire » nécessaire pour qu’un algorithme termine son exécution.
Qu’est-ce que la notation O (notation Big O) ?
La notation O (Big O Notation) est une notation mathématique indiquant la limite supérieure du taux d’augmentation de la complexité lorsque la taille de l’entrée $n$ devient suffisamment grande.
$$ O(f(n)) = \{ g(n) \mid ext{il existe une constante positive } c, n_0 ext{ telle que pour tout } n \ge n_0 ext{, on a } 0 \le g(n) \le c f(n) \} $$Règles de base de la notation O
- ** Ignorer les termes constants ** : $O(2n)$ devient $O(n)$.
- ** Ne conserver que le terme ayant le plus grand impact ** : $O(n^2 + n)$ devient $O(n^2)$.
graph TD
A["Taille d'entrée n"] -->|"Évaluation"| B["Notation O"]
B --> C["Complexité temporelle"]
B --> D["Complexité spatiale"]
Exemples de complexités temporelles représentatives en Python
À partir de là, examinons les explications détaillées et des exemples de code en Python pour les classes de notation O représentatives.
1. O(1) : Temps constant (Constant Time)
Il s’agit d’un algorithme dont le traitement se termine toujours en un nombre constant d’étapes, indépendamment de la taille de l’entrée $n$.
| |
2. O(log n) : Temps logarithmique (Logarithmic Time)
À mesure que la taille de l’entrée $n$ augmente, le temps d’exécution augmente, mais le rythme de cette augmentation est très lent. Un exemple typique est la recherche dichotomique.
| |
3. O(n) : Temps linéaire (Linear Time)
C’est un algorithme dont le temps d’exécution augmente proportionnellement à la taille de l’entrée $n$.
| |
4. O(n log n) : Temps quasi-linéaire (Linearithmic Time)
C’est le produit de O(n) et O(log n). De nombreux algorithmes de tri par comparaison efficaces (tri fusion, tri rapide, tri par tas, etc.) possèdent cette complexité.
| |
5. O(n^2) : Temps quadratique (Quadratic Time)
Le temps d’exécution augmente proportionnellement au carré de la taille de l’entrée $n$. Les algorithmes de tri simples, tels que le tri à bulles et le tri par insertion, entrent dans cette catégorie.
| |
6. O(2^n) : Temps exponentiel (Exponential Time)
Chaque fois que la taille de l’entrée $n$ augmente de 1, le temps d’exécution double. Une implémentation récursive simple de la suite de Fibonacci en est un exemple.
| |
7. O(n!) : Temps factoriel (Factorial Time)
Le temps d’exécution augmente proportionnellement à la factorielle de la taille de l’entrée. La recherche exhaustive (force brute) pour le problème du voyageur de commerce en est un exemple.
| |
Structures de données et complexités
| Structure de données | Accès | Recherche | Insertion | Suppression | Complexité spatiale |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algorithmes de tri et complexités
| Algorithme | Meilleur cas | Cas moyen | Pire cas | Complexité spatiale |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introduction
Lors de l’apprentissage de la programmation, il est extrêmement important de comprendre l’efficacité des algorithmes. Le concept de ** complexité ** (Complexity) apparaît invariablement dans ce contexte. Cet article explique en détail les bases de la complexité temporelle et spatiale, avec une explication approfondie de la notation O (notation Big O) et des considérations approfondies avec des exemples concrets, dans un volume d’environ 20 000 caractères.
Qu’est-ce que la complexité ?
La complexité est un indicateur permettant d’évaluer les performances d’un algorithme. La complexité se divise principalement en deux catégories :
- ** Complexité temporelle ** (Time Complexity)
- ** Complexité spatiale ** (Space Complexity)
1. Complexité temporelle
La complexité temporelle est un indicateur représentant le « temps » ou le « nombre d’étapes » nécessaire pour qu’un algorithme termine son exécution.
2. Complexité spatiale
La complexité spatiale est un indicateur représentant « l’espace mémoire » nécessaire pour qu’un algorithme termine son exécution.
Qu’est-ce que la notation O (notation Big O) ?
La notation O (Big O Notation) est une notation mathématique indiquant la limite supérieure du taux d’augmentation de la complexité lorsque la taille de l’entrée $n$ devient suffisamment grande.
$$ O(f(n)) = \{ g(n) \mid ext{il existe une constante positive } c, n_0 ext{ telle que pour tout } n \ge n_0 ext{, on a } 0 \le g(n) \le c f(n) \} $$Règles de base de la notation O
- ** Ignorer les termes constants ** : $O(2n)$ devient $O(n)$.
- ** Ne conserver que le terme ayant le plus grand impact ** : $O(n^2 + n)$ devient $O(n^2)$.
graph TD
A["Taille d'entrée n"] -->|"Évaluation"| B["Notation O"]
B --> C["Complexité temporelle"]
B --> D["Complexité spatiale"]
Exemples de complexités temporelles représentatives en Python
À partir de là, examinons les explications détaillées et des exemples de code en Python pour les classes de notation O représentatives.
1. O(1) : Temps constant (Constant Time)
Il s’agit d’un algorithme dont le traitement se termine toujours en un nombre constant d’étapes, indépendamment de la taille de l’entrée $n$.
| |
2. O(log n) : Temps logarithmique (Logarithmic Time)
À mesure que la taille de l’entrée $n$ augmente, le temps d’exécution augmente, mais le rythme de cette augmentation est très lent. Un exemple typique est la recherche dichotomique.
| |
3. O(n) : Temps linéaire (Linear Time)
C’est un algorithme dont le temps d’exécution augmente proportionnellement à la taille de l’entrée $n$.
| |
4. O(n log n) : Temps quasi-linéaire (Linearithmic Time)
C’est le produit de O(n) et O(log n). De nombreux algorithmes de tri par comparaison efficaces (tri fusion, tri rapide, tri par tas, etc.) possèdent cette complexité.
| |
5. O(n^2) : Temps quadratique (Quadratic Time)
Le temps d’exécution augmente proportionnellement au carré de la taille de l’entrée $n$. Les algorithmes de tri simples, tels que le tri à bulles et le tri par insertion, entrent dans cette catégorie.
| |
6. O(2^n) : Temps exponentiel (Exponential Time)
Chaque fois que la taille de l’entrée $n$ augmente de 1, le temps d’exécution double. Une implémentation récursive simple de la suite de Fibonacci en est un exemple.
| |
7. O(n!) : Temps factoriel (Factorial Time)
Le temps d’exécution augmente proportionnellement à la factorielle de la taille de l’entrée. La recherche exhaustive (force brute) pour le problème du voyageur de commerce en est un exemple.
| |
Structures de données et complexités
| Structure de données | Accès | Recherche | Insertion | Suppression | Complexité spatiale |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algorithmes de tri et complexités
| Algorithme | Meilleur cas | Cas moyen | Pire cas | Complexité spatiale |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
