TD Complexité Algorithmique
TD Complexité Algorithmique
TD : Complexité en Temps
Enoncé :
On te donne l'algorithme suivant :
Solution :
Enoncé :
On te donne l'algorithme suivant :
1. Quel est l'objectif de cet algorithme ?
2. Quelle est la complexité en temps de cet algorithme ?
Solution :
Enoncé :
On te donne l'algorithme suivant :
Solution :
L'algorithme parcourt tous les éléments du tableau arr pour trouver x. La boucle
for s'exécute une fois pour chaque élément du tableau. Si la taille du tableau est
n, alors la boucle s'exécute n fois dans le pire des cas.
Solution :
Enoncé :
On te donne l'algorithme suivant qui calcule le produit scalaire de deux vecteurs :
1. Quel est l'objectif de cet algorithme ?
2. Quelle est la complexité en temps de cet algorithme ?
Solution :
Conclusion
Dans tous ces exercices, la complexité en temps des algorithmes a été déterminée en
fonction du nombre d'itérations des boucles et de la manière dont l'algorithme divise ou
traite les données. Voici un récapitulatif des complexes de chaque exercice :
1. O(n)
2. O(n²)
3. O(n)
4. O(n)
5. O(n²)
Chaque analyse est basée sur la façon dont les boucles et récursions interagissent avec la
taille des entrées. Pour bien comprendre la complexité, il faut se concentrer sur le
nombre d'opérations effectuées en fonction de l'entrée.
Exercice 6 : Recherche d'un élément dans une liste triée (Binary Search)
Enoncé :
On te donne l'algorithme suivant qui effectue une recherche binaire dans un tableau trié
arr pour trouver un élément x.
Solution :
Enoncé :
On te donne l'algorithme suivant qui calcule la factorielle de n de manière récursive.
1. Quel est l'objectif de cet algorithme ?
2. Quelle est la complexité en temps de cet algorithme ?
Solution :
Enoncé :
On te donne l'algorithme suivant pour trier un tableau arr en utilisant le tri par insertion.
Solution :
Enoncé :
On te donne l'algorithme suivant pour trier un tableau arr en utilisant le tri à bulles.
Solution :
La complexité en temps du tri à bulles dans le pire des cas est donc O(n²).
Enoncé :
On te donne l'algorithme suivant qui recherche un élément x dans une liste arr. Si x est
trouvé, il retourne l'indice de x, sinon il retourne -1.
1. Quel est l'objectif de cet algorithme ?
2. Quelle est la complexité en temps de cet algorithme dans le pire des cas ?
Solution :
Conclusion
Enoncé :
On te donne l'algorithme suivant qui effectue une recherche binaire dans un tableau trié
arr pour trouver un élément x :
Solution :
1. Objectif de l'algorithme :
Cet algorithme effectue une recherche binaire dans un tableau trié arr. La
recherche binaire consiste à diviser l'espace de recherche en deux moitiés à
chaque itération, ce qui réduit de moitié le nombre d'éléments à examiner.
2. Analyse de la complexité en temps :
o À chaque itération de la boucle while, le tableau est divisé en deux parties
égales.
o Le nombre d'itérations nécessaires pour réduire l'espace de recherche à
une seule valeur est proportionnel à log₂(n), où n est la taille du tableau.
o La complexité en temps de cet algorithme est donc O(log n), car à chaque
itération la taille de l'espace de recherche est réduite de moitié.
Enoncé :
On te donne un algorithme pour multiplier deux grands nombres en utilisant une
méthode de type "diviser pour régner", qui divise les nombres en deux parties égales et
les multiplie récursivement.
1. Quel est l'objectif de cet algorithme ?
2. Quelle est la complexité en temps de cet algorithme ?
Solution :
1. Objectif de l'algorithme :
Cet algorithme est une variante de la multiplication de Karatsuba, qui utilise la
méthode "diviser pour régner" pour multiplier deux nombres grands. Au lieu de
multiplier directement les grands nombres, l'algorithme divise les nombres en
deux parties égales et effectue des multiplications sur ces parties, puis combine
les résultats.
2. Analyse de la complexité en temps :
o L'algorithme divise chaque nombre en deux à chaque étape récursive.
o À chaque niveau de récursion, il y a trois multiplications à effectuer
(deux petites et une combinée).
o La taille des nombres est réduite de moitié à chaque niveau, et le nombre
d'étapes nécessaires pour diviser le nombre jusqu'à atteindre des cas de
base (où les nombres sont inférieurs à 10) est logarithmique par rapport à
la taille du nombre.
o La complexité en temps est donc O(log n) à chaque niveau de récursion,
mais il y a également une multiplication supplémentaire par une
constante dans chaque niveau, ce qui donne une complexité O(log n)
pour la multiplication de grands nombres, en termes de la taille des
nombres.
Enoncé :
On te donne l'algorithme suivant qui recherche un élément x dans un arbre binaire de
recherche :
1. Quel est l'objectif de cet algorithme ?
2. Quelle est la complexité en temps de cet algorithme ?
Solution :
1. Objectif de l'algorithme :
Cet algorithme recherche un élément x dans un arbre binaire de recherche
(ABR). Dans un ABR, les valeurs à gauche d'un nœud sont plus petites que la
valeur du nœud, et les valeurs à droite sont plus grandes. L'algorithme compare
la valeur recherchée avec la valeur du nœud courant et décide d'explorer soit le
sous-arbre gauche, soit le sous-arbre droit en fonction de la comparaison.
2. Analyse de la complexité en temps :
o L'algorithme suit un chemin dans l'arbre à chaque étape, en fonction de la
comparaison entre la valeur du nœud et la valeur recherchée.
o Dans un arbre binaire équilibré, le nombre de niveaux de l'arbre est
logarithmique par rapport au nombre d'éléments, soit log₂(n).
o Ainsi, dans le pire des cas, l'algorithme devra traverser un chemin qui est
proportionnel à la hauteur de l'arbre, et donc la complexité en temps est
O(log n).
Enoncé :
On te donne l'algorithme suivant pour calculer le PGCD de deux entiers a et b en
utilisant l'algorithme d'Euclide :
1. Objectif de l'algorithme :
L'algorithme calcule le PGCD (plus grand commun diviseur) de deux entiers a et
b. L'algorithme d'Euclide repose sur le principe que le PGCD de deux nombres a
et b est le même que celui de b et a % b.
2. Analyse de la complexité en temps :
o À chaque itération de la boucle, la taille de b diminue (car a % b est
toujours plus petit que b).
o La taille de b est divisée approximativement par 2 à chaque étape (dans le
cas de la division).
o Le nombre d'itérations nécessaires est proportionnel au logarithme de la
plus petite des deux valeurs a et b.
o La complexité en temps de cet algorithme est donc O(log n), où n est le
plus petit des deux nombres.
Enoncé :
On te donne l'algorithme suivant qui effectue une recherche dans un tableau trié arr pour
trouver un élément x. L'algorithme utilise une approche similaire à la recherche binaire,
mais avec un retour anticipé.
Solution :
1. Objectif de l'algorithme :
Cet algorithme effectue une recherche dans un tableau trié arr en utilisant une
méthode de recherche binaire pour trouver un élément x. Si l'élément est trouvé,
il renvoie son indice, sinon il renvoie -1.
2. Analyse de la complexité en temps :
o L'algorithme divise le tableau en deux à chaque itération (comme dans la
recherche binaire).
o À chaque itération, il élimine la moitié de l'espace de recherche, ce qui
signifie qu'il réduit de moitié le nombre d'éléments à vérifier.
o Le nombre d'itérations nécessaires pour réduire l'espace de recherche à un
seul élément est proportionnel à log₂(n), où n est la taille du tableau.
o La complexité en temps est donc O(log n).
Conclusion
Enoncé :
On te donne l'algorithme suivant qui implémente le tri fusion pour trier un tableau arr :
Solution :
1. Objectif de l'algorithme :
Cet algorithme effectue un tri fusion pour trier un tableau arr. Le tri fusion
repose sur le principe du diviser pour régner : le tableau est divisé en deux
sous-tableaux, chaque sous-tableau est trié récursivement, puis les sous-tableaux
triés sont fusionnés pour obtenir le tableau final trié.
2. Analyse de la complexité en temps :
o Division : À chaque étape, le tableau est divisé en deux, ce qui prend un
temps constant (la division de l'array ne prend pas beaucoup de temps,
car c'est une simple opération d'indexation).
o Fusion : À chaque niveau de récursion, deux sous-tableaux sont
fusionnés. L'algorithme de fusion parcourt chaque élément de ces sous-
tableaux une seule fois, ce qui prend O(n), où n est la taille du tableau.
o Récursion : L'algorithme divise le tableau jusqu'à ce qu'il atteigne des
sous-tableaux de taille 1. Le nombre de niveaux de récursion est log₂(n),
où n est la taille du tableau.
Ainsi, la complexité totale en temps est O(n log n), où n est la taille du tableau.
Enoncé :
On te donne l'algorithme suivant pour le tri fusion. Quelle est la complexité en temps
dans le pire des cas ?
Solution :
1. Objectif de l'algorithme :
L'objectif de cet algorithme est de trier un tableau arr en utilisant le tri fusion. Le
tableau est divisé en sous-tableaux de plus en plus petits jusqu'à ce que chaque
sous-tableau ait une taille de 1. Ensuite, les sous-tableaux sont fusionnés de
manière ordonnée pour obtenir le tableau trié.
2. Analyse de la complexité en temps dans le pire des cas :
o À chaque niveau de récursion, le tableau est divisé en deux. Cela
continue jusqu'à ce que les sous-tableaux aient une taille de 1, ce qui
nécessite log₂(n) niveaux de récursion.
o À chaque niveau de récursion, l'algorithme effectue une fusion de deux
sous-tableaux. L'opération de fusion est linéaire en fonction du nombre
d'éléments à fusionner, ce qui prend O(n) à chaque niveau de récursion.
o Comme il y a log₂(n) niveaux de récursion et que chaque fusion prend
O(n), la complexité totale en temps est O(n log n), même dans le pire des
cas.
Enoncé :
On te donne un tableau à trier arr = [38, 27, 43, 3, 9, 82, 10]. Trace les appels récursifs
effectués par le tri fusion, puis analyse la complexité de ces appels.
Solution :
Enoncé :
Compare les performances du tri fusion et du tri à bulles sur un tableau de taille n.
Solution :
1. Complexité en temps :
o Le tri fusion a une complexité en temps de O(n log n) dans tous les cas
(meilleur, moyen et pire).
o Le tri à bulles a une complexité en temps de O(n²) dans le pire des cas,
et O(n) dans le meilleur cas (quand le tableau est déjà trié).
2. Explication :
o Le tri fusion est plus efficace que le tri à bulles pour de grands tableaux
car il divise le problème en sous-problèmes plus petits et utilise une
fusion efficace de ces sous-tableaux triés. Cela permet d'éviter les
comparaisons inutiles comme dans le tri à bulles, où chaque élément est
comparé plusieurs fois dans un grand nombre d'itérations.
o Le tri fusion fonctionne en O(n log n), ce qui est bien plus rapide que le
O(n²) du tri à bulles lorsque n devient grand.
Enoncé :
Le tri fusion que nous avons vu utilise O(n) d'espace mémoire pour stocker les sous-
tableaux lors de la fusion. Existe-t-il une version optimisée en termes de mémoire du tri
fusion ? Si oui, explique comment.
Solution :
• Oui, il est possible d'optimiser la mémoire du tri fusion en utilisant le tri fusion
en place. Cependant, cela est plus complexe à implémenter. Une autre approche
consiste à éviter de créer de nouveaux tableaux pour chaque fusion en modifiant
les tableaux existants (en utilisant des indices pour garder trace des éléments).
• Cependant, dans la version classique, l'utilisation de O(n) d'espace mémoire est
nécessaire pour stocker les sous-tableaux lors de chaque fusion, ce qui est la
principale limitation de l'algorithme en termes de mémoire.
Conclusion
Le tri fusion est un algorithme de tri très performant pour des tableaux de taille
importante en raison de sa complexité logarithmique combinée à une efficacité linéaire
pour les étapes de fusion.
Enoncé :
On te donne l'algorithme suivant pour trier un tableau arr avec le tri à bulles :
Solution :
1. Objectif de l'algorithme :
L'objectif de cet algorithme est de trier un tableau arr en utilisant le tri à bulles.
Le principe du tri à bulles est de comparer chaque paire d'éléments adjacents et
de les échanger si l'élément de gauche est plus grand que celui de droite. Ce
processus est répété jusqu'à ce que le tableau soit entièrement trié.
2. Analyse de la complexité en temps :
o Boucles imbriquées :
L'algorithme utilise deux boucles imbriquées : la boucle externe s'exécute
n fois (où n est la taille du tableau), et la boucle interne compare les
éléments adjacents pour chaque itération de la boucle externe. Le nombre
de comparaisons effectuées à chaque itération diminue progressivement,
car après chaque passage, l'élément le plus grand "bulle" à sa position
finale.
o Pire des cas :
Dans le pire des cas, le tableau est inversé et chaque élément doit être
comparé avec chaque autre élément, ce qui donne une complexité O(n²).
o Meilleur des cas :
Si le tableau est déjà trié, une optimisation pourrait permettre de réduire
le nombre de passages nécessaires, mais dans la version de base, la
complexité reste O(n²) dans tous les cas.
En résumé, la complexité en temps du tri à bulles est O(n²) dans le pire des cas, et O(n)
dans le meilleur cas (si une optimisation est ajoutée).
Enoncé :
On te donne l'algorithme du tri à bulles. Quelle est la complexité en temps dans le pire
des cas ? Justifie ta réponse.
Solution :
1. Objectif de l'algorithme :
L'objectif de cet algorithme est de trier un tableau arr en utilisant le tri à bulles.
À chaque passage de la boucle externe, le plus grand élément "bulle" à sa
position correcte à la fin du tableau. Cela se fait par comparaison et échange des
éléments adjacents.
2. Analyse de la complexité en temps dans le pire des cas :
o Pire des cas :
Le pire des cas survient lorsque le tableau est trié dans l'ordre inverse.
Dans ce cas, l'algorithme devra effectuer un échange à chaque
comparaison dans chaque itération de la boucle interne.
o Nombre de comparaisons :
Pour chaque élément, la boucle interne effectue n-i-1 comparaisons, où i
est l'indice de la boucle externe. Le total des comparaisons sera donc de :
o
o Ce qui donne une complexité de O(n²) dans le pire des cas.
En résumé, la complexité en temps du tri à bulles dans le pire des cas est O(n²).
Exercice 3 : Meilleur Cas du Tri à Bulles avec Optimisation
Enoncé :
On te donne une version optimisée de l'algorithme du tri à bulles. Cette version ajoute
une condition pour arrêter le tri dès que le tableau est déjà trié après un passage :
Solution :
1. Optimisation :
L'optimisation consiste à ajouter un indicateur echange pour savoir si des
échanges ont eu lieu pendant une itération. Si aucun échange n'a été effectué,
cela signifie que le tableau est déjà trié, et l'algorithme peut s'arrêter
prématurément, économisant ainsi des itérations inutiles.
2. Complexité en temps dans le meilleur cas :
o Meilleur des cas :
Le meilleur des cas se produit lorsque le tableau est déjà trié. Dans ce cas,
l'algorithme effectue une première itération et constate qu'aucun échange
n'a eu lieu. Dès lors, il quitte la boucle grâce à la condition if not
echange: break.
o Cette optimisation permet de réduire la complexité dans le meilleur cas à
O(n), car l'algorithme s'arrête après une seule passe à travers le tableau.
Enoncé :
Compare les performances du tri à bulles et du tri fusion sur un tableau de taille n.
1. Quelle est la complexité en temps du tri à bulles et du tri fusion ?
2. Explique pourquoi le tri fusion est plus efficace que le tri à bulles pour de grands
tableaux.
Solution :
1. Complexité en temps :
o Le tri à bulles a une complexité en temps de O(n²) dans le pire des cas.
o Le tri fusion a une complexité en temps de O(n log n) dans tous les cas
(meilleur, moyen et pire).
2. Explication :
o Le tri fusion est plus efficace que le tri à bulles pour de grands tableaux
car il divise le tableau en sous-tableaux plus petits et les fusionne de
manière ordonnée. À chaque niveau de récursion, il fusionne les sous-
tableaux en O(n), et il y a O(log n) niveaux de récursion, ce qui donne
une complexité de O(n log n).
o En revanche, le tri à bulles parcourt à plusieurs reprises tout le tableau
pour effectuer des échanges, ce qui peut entraîner un grand nombre de
comparaisons et d'échanges dans des tableaux de grande taille, donnant
une complexité de O(n²).
Conclusion : Le tri fusion est beaucoup plus efficace pour des tableaux de grande taille
que le tri à bulles en raison de sa complexité O(n log n) contre O(n²) pour le tri à bulles.
Enoncé :
Soit un tableau arr = [1, 2, 3, 5, 4], légèrement désordonné. Quelle sera la performance
du tri à bulles sur ce tableau ? Explique pourquoi.
Solution :
Conclusion
1. Complexité en temps :
o Dans le pire des cas (tableau inversé) : O(n²)
o Dans le meilleur des cas (tableau déjà trié avec optimisation) : O(n)
o Dans la moyenne des cas : O(n²)
2. Avantages :
o Simple à implémenter et à comprendre.
o Efficace pour des petits tableaux ou des tableaux presque triés.
3. Inconvénients :
o Moins efficace pour des grands tableaux à cause de sa complexité
quadratique O(n²).
Le tri à bulles est souvent utilisé pour son aspect pédagogique, mais pour des
applications réelles avec des grandes quantités de données, des algorithmes plus
efficaces comme le tri fusion ou le tri rapide (quick sort) sont préférables.
Enoncé :
On te donne l'algorithme suivant pour trier un tableau arr avec le tri rapide :
Solution :
1. Objectif de l'algorithme :
L'objectif de cet algorithme est de trier un tableau arr en utilisant le tri rapide.
Le principe du tri rapide est de choisir un pivot, puis de partitionner le tableau en
trois sous-tableaux :
Un sous-tableau contenant les éléments inférieurs au pivot.
o
Un sous-tableau contenant les éléments égaux au pivot.
o
Un sous-tableau contenant les éléments supérieurs au pivot. Ensuite, on
o
applique récursivement le tri rapide sur les sous-tableaux gauche et droit,
puis on les concatène avec les éléments égaux au pivot pour obtenir le
tableau trié.
2. Analyse de la complexité en temps :
o Cas moyen :
Dans le cas moyen, le pivot divise le tableau presque en deux parties
égales. À chaque appel récursif, le tableau est divisé en deux sous-
tableaux de tailles environ égales. La partition des éléments prend O(n)
pour chaque niveau de récursion, et il y a log n niveaux de récursion en
moyenne. La complexité du tri rapide dans ce cas est donc O(n log n).
o Pire des cas :
Dans le pire des cas, si le pivot choisi est toujours le plus petit ou le plus
grand élément du tableau, le tableau ne sera pas du tout divisé en deux
parties égales. Dans ce cas, chaque appel récursif traite un sous-tableau
de taille n-1, ce qui donne une complexité de O(n²).
o Meilleur des cas :
Le meilleur des cas se produit lorsque le pivot divise toujours le tableau
en deux parties égales, ce qui donne également une complexité de O(n
log n).
En résumé, la complexité en temps du tri rapide est O(n log n) en moyenne, mais peut
atteindre O(n²) dans le pire des cas.
Enoncé :
On te donne l'algorithme du tri rapide. Quelle est la complexité en temps dans le pire des
cas ? Justifie ta réponse.
Solution :
1. Objectif de l'algorithme :
L'objectif de cet algorithme est de trier un tableau arr en utilisant le tri rapide.
Le tableau est partitionné en trois sous-tableaux : ceux qui sont inférieurs au
pivot, égaux au pivot, et supérieurs au pivot. Ensuite, l'algorithme s'applique
récursivement sur les sous-tableaux gauche et droit.
2. Analyse de la complexité en temps dans le pire des cas :
o Pire des cas :
Dans le pire des cas, si le pivot choisi est toujours l'élément le plus petit
ou le plus grand du tableau (par exemple, lorsqu'on choisit toujours le
premier ou le dernier élément comme pivot), le tableau ne sera pas bien
partitionné. Cela signifie qu'un sous-tableau de taille n-1 et un autre de
taille 0 seront créés à chaque niveau récursif.
o Cela donne une complexité de O(n) pour la partition à chaque niveau de
récursion, mais il y aura n niveaux récursifs, ce qui donne une complexité
totale de O(n²) dans le pire des cas.
En résumé, la complexité en temps dans le pire des cas du tri rapide est O(n²).
Enoncé :
Soit le tableau arr = [3, 2, 1, 5, 4]. Si tu utilises un pivot choisi au hasard, quel sera le
comportement du tri rapide ? Expliquer pourquoi.
Solution :
1. Choix du pivot :
L'algorithme choisit le pivot comme étant l'élément du milieu du tableau. Dans
ce cas, le pivot choisi serait 1, car c'est l'élément du milieu de [3, 2, 1, 5, 4].
2. Comportement du tri rapide :
o Le tableau est partitionné en trois sous-tableaux :
▪ Gauche : les éléments inférieurs au pivot (aucun dans ce cas).
▪ Milieu : l'élément égal au pivot ([1]).
▪ Droite : les éléments supérieurs au pivot ([3, 2, 5, 4]).
o Ensuite, le tri rapide sera appliqué de manière récursive sur le sous-
tableau droit ([3, 2, 5, 4]).
Ce comportement est typique d'un bon choix de pivot qui divise efficacement le tableau
en deux parties équilibrées, ce qui conduit à une performance optimale.
En résumé, la complexité en temps du tri rapide dans le meilleur des cas est O(n log n).
Enoncé :
Compare les performances du tri rapide et du tri à bulles sur un tableau de taille n.
Solution :
1. Complexité en temps :
o Le tri rapide a une complexité en temps de O(n log n) dans le cas
moyen et le meilleur cas, mais O(n²) dans le pire des cas.
o Le tri à bulles a une complexité en temps de O(n²) dans le pire des cas
(et dans la moyenne des cas), bien qu'il puisse atteindre O(n) si le tableau
est déjà trié et avec optimisation.
2. Explication :
o Le tri rapide divise le problème en sous-problèmes plus petits à chaque
étape, ce qui lui permet de traiter des tableaux plus grands plus
efficacement, en réduisant le nombre de comparaisons nécessaires. De
plus, le choix du pivot peut améliorer la partition et rendre l'algorithme
plus rapide que d'autres algorithmes comme le tri à bulles.
o Le tri à bulles, en revanche, compare chaque élément avec son voisin et
échange les éléments lorsque nécessaire. Cela implique un grand nombre
de comparaisons et d'échanges, surtout pour des tableaux non triés, ce qui
donne une complexité quadratique O(n²), même dans les meilleurs cas
(sauf optimisation).
Conclusion : Le tri rapide est beaucoup plus efficace que le tri à bulles pour des
tableaux de grande taille, en raison de sa complexité O(n log n) contre O(n²) pour le tri
à bulles.
Enoncé :
On te donne la méthode de partition suivante qui choisit un pivot et réorganise les
éléments autour de ce pivot :
1. Quelle est l'idée de la méthode de partition ?
2. Comment la méthode de partition améliore-t-elle la complexité du tri rapide ?
Solution :
Conclusion
1. Complexité en temps :
o Dans le meilleur des cas : O(n log n)
o Dans le cas moyen : O(n log n)
o Dans le pire des cas : O(n²)
2. Avantages :
o Très rapide pour de grands tableaux dans la plupart des cas.
o Utilise la technique de division et conquête pour diviser efficacement le
problème.
3. Inconvénients :
o Complexité O(n²) dans le pire des cas, surtout si le pivot est mal choisi.
o Ne convient pas aux petits tableaux si on le compare à des algorithmes
plus simples comme le tri à bulles ou le tri par insertion.
Le tri rapide est l'un des algorithmes de tri les plus populaires en raison de ses bonnes
performances dans la plupart des cas, mais il faut prêter attention à son pire cas.
Enoncé :
Tu dois analyser la complexité en espace de la fonction suivante qui crée un tableau
statique et y insère des éléments :
Solution :
Par conséquent, la complexité en espace de cette fonction est O(n), où n est le nombre
d'éléments dans le tableau (i.e., num_elements).
Enoncé :
On te donne l'algorithme suivant pour trier un tableau arr en utilisant le tri par fusion
(Merge Sort) :
1. Quelle est la complexité en espace de cet algorithme ?
2. Expliquer pourquoi le tri par fusion nécessite un espace supplémentaire.
Solution :
Enoncé :
On te donne l'algorithme suivant pour trier un tableau arr en utilisant le tri rapide
(Quick Sort) :
Solution :
Enoncé :
Soit la fonction récursive suivante :
Solution :
Solution :
Par conséquent, la complexité en espace est O(h), où h est la hauteur de l'arbre, ce qui
peut être O(log n) pour un arbre équilibré ou O(n) pour un arbre dégénéré.
Conclusion
La complexité en espace est un concept clé pour analyser la mémoire utilisée par un
algorithme. Elle dépend de divers facteurs, tels que la taille des structures de données
manipulées, la profondeur de la récursion et la manière dont les données sont
partitionnées et traitées.