Aller au contenu principal

📈 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Ă©e
  • O(n) : temps linĂ©aire – si on double l’entrĂ©e, le temps double
  • O(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 :

StructureComplexité approximative
Instruction simpleO(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​

  1. Créez un nouveau projet Python avec uv.

  2. Configurez un script principal main. Ce script pourra ĂȘtre exĂ©cutĂ© avec la commande uv run main.

  3. É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 module inspect.

  4. Mesurez le temps d’exĂ©cution des deux fonctions pour des valeurs croissantes de n (ex. : 100, 200, 400, 800
)

  5. Sauvegardez les résultats dans un fichier CSV avec les colonnes n, fonction1, fonction2.

  6. 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)