La complexité mesure les ressources (temps, mémoire) nécessaires à l'exécution d'un algorithme en fonction de la taille $n$ des données.
def premier_element(L):
return L[0]
def somme(L):
total = 0
for x in L: # n itérations
total += x # O(1) par itération
return total
# Total : n × O(1) = O(n)
def doublons(L):
"""Vérifie s'il y a des doublons (version naïve)."""
n = len(L)
for i in range(n): # n itérations
for j in range(i + 1, n): # jusqu'à n-1 itérations
if L[i] == L[j]:
return True
return False
# Total : n(n-1)/2 comparaisons = O(n²)
def puissance_rapide(x, n):
"""Calcule x^n par exponentiation rapide."""
resultat = 1
while n > 0:
if n % 2 == 1:
resultat *= x
x *= x
n //= 2 # on divise n par 2 à chaque tour
return resultat
# Nombre d'itérations : log₂(n)
def contient_doublon_naif(L): # O(n²)
for i in range(len(L)):
for j in range(i+1, len(L)):
if L[i] == L[j]:
return True
return False
def contient_doublon_tri(L): # O(n log n)
L_triee = sorted(L) # O(n log n)
for i in range(len(L) - 1): # O(n)
if L_triee[i] == L_triee[i+1]:
return True
return False
Pour chaque fonction, déterminer la complexité en $O(\cdot)$ en justifiant :
def f1(n): def f2(n): def f3(L):
s = 0 s = 0 s = 0
for i in range(n): while n > 1: for x in L:
s += i n = n // 2 for y in L:
return s s += 1 if x == y:
return s s += 1
return s
f1 : une seule boucle de 0 à $n-1$, soit $n$ itérations. Complexité : $O(n)$.f2 : on divise $n$ par 2 à chaque itération. Le nombre d'itérations est $\lfloor \log_2(n) \rfloor$. Complexité : $O(\log n)$.f3 : deux boucles imbriquées parcourant chacune la liste de taille $n$. Complexité : $O(n^2)$.On dispose de deux algorithmes $A$ et $B$ pour résoudre un même problème de taille $n$.
La fonction suivante calcule le nombre d'éléments communs à deux listes.
def communs(L1, L2):
compteur = 0
for x in L1:
for y in L2:
if x == y:
compteur += 1
return compteur
len(L1) = n et len(L2) = m ?set).def communs_v2(L1, L2):
ensemble = set(L2) # O(m)
compteur = 0
for x in L1: # O(n)
if x in ensemble: # O(1) en moyenne (table de hachage)
compteur += 1
return compteur
Complexité : $O(n + m)$ au lieu de $O(n × m)$. Le test d'appartenance à un set est en $O(1)$ en moyenne grâce au hachage.