đ ComplexitĂ© et structures de contrĂŽle
đŻ Objectif pĂ©dagogiqueâ
- Créer un projet Python à l'aide de uv
- Comprendre le concept de complexité algorithmique (notation grand O)
- Savoir estimer la complexitĂ© temporelle dâun algorithme simple
- Relier la complexité à la structure du code (boucles, conditions, appels de fonction)
- Comparer lâefficacitĂ© de diffĂ©rents algorithmes
đ Partie 1 â Introduction guidĂ©eâ
đ Lecture et explorationâ
Lisez les deux sections suivantes :
đ§ 1. Quâest-ce que la notation grand O ?â
La notation O(...) sert Ă estimer comment le temps dâexĂ©cution dâun algorithme croĂźt en fonction de la taille de lâentrĂ©e. On cherche Ă rĂ©pondre Ă cette question :
« Si je double la taille de mes donnĂ©es, combien de fois plus longtemps mon programme prendra-t-il Ă sâexĂ©cuter ? »
Exemples :
O(1)
: temps constant â ne dĂ©pend pas de la taille de lâentrĂ©eO(n)
: temps linĂ©aire â si on double lâentrĂ©e, le temps doubleO(nÂČ)
: temps quadratique â si on double lâentrĂ©e, le temps est multipliĂ© par 4
đ§ 2. RĂšgles gĂ©nĂ©rales pour estimer la complexitĂ©â
Voici quelques rĂšgles utiles :
Structure | Complexité approximative |
---|---|
Instruction simple | O(1) |
Boucle for i in range(n) | O(n) |
Boucle imbriquée for i in range(n): for j in range(m) | O(n * m) |
Appel récursif sur moitié (n // 2 ) | O(log n) |
Double récursion (ex. : Fibonacci) | O(2^n) |
Note : on ne compte que les parties les plus coûteuses (on garde le terme dominant).
đš Partie 2 â Analyse de codeâ
âïž Instructionsâ
Pour chaque extrait de code suivant, indiquez la complexité temporelle en notation grand O, en justifiant votre réponse.
đ Extraitsâ
# Extrait A
def somme(liste):
total = 0
for x in liste:
total += x
return total
# Extrait B
def produit_matrices(A, B):
n = len(A)
m = len(B[0])
p = len(B)
resultat = [[0] * m for _ in range(n)]
for i in range(n):
for j in range(m):
for k in range(p):
resultat[i][j] += A[i][k] * B[k][j]
return resultat
# Extrait C
def cherche(x, liste):
for i in range(len(liste)):
if liste[i] == x:
return True
return False
# Extrait D
def mystere(n):
i = 1
while i < n:
i *= 2
return i
đ§Ș Partie 3 â ExpĂ©rimentationâ
đ§âđ» TĂącheâ
-
Créez un nouveau projet Python avec
uv
. -
Configurez un script principal
main
. Ce script pourra ĂȘtre exĂ©cutĂ© avec la commandeuv run main
. -
Ăcrivez un programme Python qui compare le temps dâexĂ©cution de deux fonctions que vous recevrez en paramĂštre. Pour les plus aventuriers, vous pouvez mĂȘme vous faire un fichier
fonctions.py
qui contient des fonctions et votre programme principal les découvre grùce au moduleinspect
. -
Mesurez le temps dâexĂ©cution des deux fonctions pour des valeurs croissantes de
n
(ex. : 100, 200, 400, 800âŠ) -
Sauvegardez les résultats dans un fichier CSV avec les colonnes
n
,fonction1
,fonction2
. -
Sauvegardez un graphique comparatif avec
matplotlib
.
đĄ Aideâ
Vous pouvez utiliser :
import time
debut = time.time()
# votre code ici
fin = time.time()
print("Durée :", fin - debut)