def recherche(liste, x):
for element in liste:
if element == x:
return True
return False
Si la taille de la liste est de 10 éléments, on aura au maximum 10 comparaisons.
Si la taille de la liste est de 1 000 000 éléments, on aura au maximum 1 000 000 comparaisons.
def f(x):
y = 0
for i in range(x):
for j in range(x):
y += 1
y += 1
for i in range(x):
y += 1
for i in range(99):
y += 1
return y
On a
Fonction | Approximation |
---|---|
Fonction | Approximation |
Grand |
---|---|---|
Approximation Tilde | Grand |
Grand Oméga | Grand Théta | |
---|---|---|---|---|
Notation algo | ||||
Notation maths | o | |||
Définition | Asymptotiquement égal | Borne supérieure | Borne inférieure | Borne serrée |
Utilité pratique | Très rare | Très élevée | Très rare | Elevée |
On utilise si souvent la notation Grand
Description | Description | Notation | Explications |
---|---|---|---|
Plancher | Floor | Plus grand entier plus petit que x | |
Plafond | Ceil | Plus petit entier plus grand que x | |
Logarithme binaire | Binary logarithm | Nombre de bits |
def f(N):
return N + 3
def serialise(N):
"""Sérialise l'entier N positif en chaîne de caractères."""
if N == 0:
return "0"
chiffres = "0123456789"
resultat = ""
while N > 0:
resultat = chiffres[N % 10] + resultat
N //= 10
return resultat
Exemple :
def f(N):
resultat = 0
for i in range(N):
resultat += i ** 2
return resultat
for
.def factorielle(N):
return 1 if N == 1 else N * factorielle(N - 1)
def verifie_paires(liste):
"""Retourne le nombre de paires égales dans la liste."""
N = len(liste)
compteur = 0
for i in range(N):
for j in range(i + 1, N):
if liste[i] == liste[j]:
compteur += 1
return compteur
for
imbriquées.def verifie_triplets(liste):
"""Retourne le nombre de triplets dont la somme est nulle."""
N = len(liste)
compteur = 0
for i in range(N):
for j in range(i + 1, N):
for k in range(j + 1, N):
if liste[i] + liste[j] + liste[k] == 0:
compteur += 1
return compteur
for
imbriquées.def fibonacci(N):
return 1 if N <= 1 else fibonacci(N - 2) + fibonacci(N - 1)
Description | Fonction | Facteur 2x | Facteur 10x | Temps pour |
Temps pour |
---|---|---|---|---|---|
linéaire | 2 | 10 | un jour | quelques heures | |
linéarithmique | 2 | 10 | un jour | quelques heures | |
quadratique | 4 | 100 | quelques semaines | un jour | |
cubique | 8 | 1000 | plusieurs mois | quelques semaines | |
exponentielle | jamais | jamais |
compteur = 0
for i in range(N):
for j in range(N):
#
# Potentiellement de nombreuses instructions ici
#
for k in range(N):
# On dit juste que l'on est en O(N^3)
compteur += 1
time
import time
def fonction_a_mesurer(N):
pass
debut = time.process_time()
N = 10000
fonction_a_mesurer(N)
fin = time.process_time()
temps_ecoule = fin - debut
print(f"Temps d'exécution : {temps_ecoule}s")
datetime
from datetime import datetime
def fonction_a_mesurer(N):
pass
debut = datetime.now()
N = 10000
fonction_a_mesurer(N)
fin = datetime.now()
temps_ecoule = fin - debut
print(f"Temps d'exécution : {temps_ecoule.total_seconds()}s")
time
et datetime
ne sont pas indépendantes.timeit
timeit
from timeit import timeit
def fonction_a_mesurer(N):
pass
N = 10000
test = lambda: fonction_a_mesurer(N)
timeit(test, number=1)
timeit
sont indépendantes donc beaucoup plus fiables.Pour tout