ComplexitéCours
ComplexitéCours
COMPLEXITE ALGORITHMIQUE
INTRODUCTION
Exercice
Ecrire en python une fonction qui prend en argument une chaîne de caractères et détermine si le caractère 'a' est
présent dans la chaîne (on retourne soit True soit False).
Quelques questions:
Problème:
Comment évaluer le coût d'exécution d'un algorithme donné?
Exemple 3 :
i=1
s=0 Le corps de la boucle sera exécuté 𝑛 𝑓𝑜𝑖𝑠 (i varie de 1 à n) et la condition (i<=n) va
while i <= n : être exécutée une fois de plus (quand i=n+1)
s = s+i Coût = 𝟐 + ∑𝒏+𝟏 𝒏
𝒊=𝟏 𝑪𝒐𝒖𝒕(𝒊 ≤ 𝒏) + ∑𝒊=𝟏(𝑪𝒐𝒖𝒕(𝒔 = 𝒔 + 𝒊) + 𝑪𝒐𝒖𝒕(𝒊 = 𝒊 + 𝟏))
i = i+1
= 2 + (n+1) + n(2+2)
= 5n+3
o Boucle for
for i in range(n):
Coût= ∑(𝐂𝐨û𝐭(𝒙𝒊 ))
𝒙𝒊 #bloc d'instructions
Exemple 4 :
s=0
Coût= 𝑪𝒐𝒖𝒕(𝒔 = 𝟎) + 𝑪𝒐𝒖𝒕(𝒏 + 𝟏)+ ∑𝒏𝒊=𝟏(𝑪𝒐𝒖𝒕(𝒔 = 𝒔 + 𝒊))
for i in range(1,n+1):
s = s+i Coût= 1 + 1 + 2n = 2n+2
L'appel d'une fonction : Lorsqu'une fonction ou une procédure est appelée, le coût de cette fonction
ou procédure est le nombre total d'opérations élémentaires engendrées par l'appel de cette fonction.
c. La notation O :
Les calculs à effectuer pour évaluer le temps d'exécution d'un algorithme peuvent parfois être longs et
pénibles;
De plus, le degré de précision qu'ils requièrent est souvent inutile;
On aura donc recours à une approximation de ce temps de calcul, représenté par la notation O(.), notation
asymptotique/Landau (Grand O)).
Rappel : notation O
𝑠𝑜𝑖𝑒𝑛𝑡 𝒇 𝑒𝑡 𝒈 𝑑𝑒𝑢𝑥 𝑓𝑜𝑛𝑐𝑡𝑖𝑜𝑛𝑠 𝑑𝑒 ℕ ⟼ ℝ+
𝒇(𝒏) = 𝑶(𝒈(𝒏)) 𝐿𝑜𝑟𝑠𝑞𝑢𝑒 ∶ ∃ 𝑘 > 0 , ∃ 𝑛0 > 0 𝑡𝑒𝑙 𝑞𝑢𝑒 ∀ 𝑛 > 𝑛0 𝑓(𝑛) ≤ 𝑘 × 𝑔(𝑛)
Autrement dit : 𝒇(𝒏) 𝒆𝒔𝒕 𝒆𝒏 𝑶(𝒈(𝒏)) s'il existe un seuil à partir duquel la fonction 𝒇(. ) est toujours dominée
par la fonction 𝒈(. ), à une constante k multiplicative fixée près.
Exemples:
3 2
Soit un algorithme effectuant C(n) = 4n - 5n +2n +3 opérations. On a alors C(n)=O(n
3
)
(Il suffit de garder le terme de plus grand ordre et supprimer son coefficient)
O(1) Constante Le temps d'exécution ne dépend pas des données traitées, ce qui est assez rare!
O(log(n)) Logarithmique augmentation très faible du temps d'exécution quand le paramètre croit.
>>> x , y = 10 , 3 >>>Somme(L)
>>> division(x , y) 15
Temps de calcul est constant quelque soient a et b en fixant i on exécute 3 opérations: (addition,
𝑪(𝒏) = 𝟏 + 𝟏 + ∑ 𝟑 = 𝟑𝒏 + 𝟐
𝒊=𝟎
Complexité: 𝓞(𝒏)
La fonction suivante permet de retourner la somme des éléments d’une matrice carré M de dimensions n
lignes et n colonnes:
def Somme(M):
n=len(M)
s=0
for i in range(n) :
for j in range(n) :
s=s+M[i][j]
return s
Exemple
>>> M=[[1,2,3],[1,0,1],[6,4,5]]
>>> Somme(M)
23
Le paramètre de complexité est n=len(M)
Avant la boucle for on a 2 affectations et la fonction len(M)
Le Coût pour calculer une valeur de s est 4 :(addition, affectation et double lecture de M[i][j])
Le nombre total d'opérations est :
𝒏−𝟏 𝒏−𝟏
𝑪(𝒏) = 𝟑 + ∑ ∑ 𝟒 = 𝟑 + 𝟒𝒏𝟐
𝒊=𝟎 𝒋=𝟎
Complexité: 𝓞(𝒏𝟐 )
def prodMatrice(A,B):
n=len(A) #nombre de lignes de A
m=len(A[0]) #nombre de colonne de A
p=len(B[0]) #nombre de colonnes de B
C=[p*[0] for i in range(n)]
for i in range(0,n):
for j in range (0,p):
s=0
for k in range (0,m):
s = s + A[i][k]*B[k][j]
C[i][j]=s
return C
On suppose que A et B sont deux matrices carrées d'ordre n = m = p
Coût pour calculer une valeur de s est : 7 (produit, addition , affectation et lecture de A[i][k]et B[k][j])
Le nombre d'itérations de la boucle sur k pour j fixé égal à m = n
Le nombre d'itérations de la boucle sur j pour i fixé égal à p = n
Le nombre total d'opérations est :
𝒏−𝟏 𝒏−𝟏 𝒏−𝟏
𝐓(𝐧) = 𝟐 + 𝟑 + 𝟑 + 𝐧 + 𝟏 + ∑ ∑ (𝟑 + ∑ 𝟕)
𝒊=𝟎 𝒋=𝟎 𝒌=𝟎
𝐓(𝐧) = 𝟗 + 𝐧 + ∑ ∑(𝟑 + 𝟕. 𝒏)
𝒊=𝟎 𝒋=𝟎
𝒏−𝟏
𝒏−𝟏
𝐓(𝐧) = 𝟐 + ∑ 𝟐 = 𝟐𝒏 + 𝟐
𝒊=𝟎
Complexité : 𝓞(𝒏)
𝑻(𝒏) = 𝟑 + ∑(𝟒𝒏 + 𝟒) − 𝟒. ∑ 𝒊
𝒊=𝟎 𝒊=𝟎
(𝒏 − 𝟐)(𝒏 − 𝟏)
𝑻(𝒏) = 𝟑 + (𝟒𝒏 + 𝟒)(𝒏 − 𝟏) − 𝟒. = 𝟑 + (𝟒𝒏 + 𝟒)(𝒏 − 𝟏) − 𝟐(𝒏 − 𝟐)(𝒏 − 𝟏)
𝟐
𝑻(𝒏) = 𝟑 + (𝒏 − 𝟏)(𝟒𝒏 + 𝟒 − 𝟐𝒏 + 𝟒)
𝑻(𝒏) = 𝟐𝒏𝟐 + 𝟔𝒏 − 𝟓
Donc, la complexité est: 𝓞(𝒏𝟐 )
def RechDichotomique(T,x):
g,d=0,len(T)-1
while g<=d:
m=(g+d)//2
if T[m]==x: return True
if T[m]<x:
g=m+1
else:
d=m-1
return False
n
Après k itérations, la taille de l’intervalle restant est :
2k
La boucle continue tant que cet intervalle contient au moins un élément, donc :
n
≥ 1 ⇒ n ≥ 2k ⇒ k ≤ log 2 (n)
2k
À chaque itération, on effectue un nombre constant d’opérations (calcul du milieu, comparaisons, mise à jour
des indices).
𝓞(𝒍𝒐𝒈 𝒏)