Chapitre 1 Complexite
Chapitre 1 Complexite
Chapitre 1 Complexite
Salsabila BENGHAZOUANI
Problème
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 1 soit 0).
Solutions proposées
1
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
Quelques questions
Que remarquez-vous concernant cet exercice ?
Le code le plus court ! est-il meilleur ?
Comment peut-on designer le meilleur code parmi ces 9 solutions ?
Quelques réflexions
La solution la plus intuitive pour choisir la meilleure solution consiste à mesurer le temps
d’exécution exacte pour chaque algorithme
Pour ce faire, python offre le module time qui permet de calculer le temps d’exécution.
2
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
Question
Mais, est ce que cette technique est toujours valide ?
Réponse :
Malheureusement, cette technique n’est pas toujours valide, car on se sait pas le
comportement de l’algorithme proposé quand n devient grand
Définition
Généralement, pour le même problème P, on peut trouver plusieurs algorithmes
(Alg1, Alg2, .., Algn ).
La complexité : mesure de la quantité de ressources nécessaires à la résolution
du problème P.
Mesure : estimation d’opérations de base en fonction de la taille des données.
Objectif de la complexité :
Evaluer le coût d’exécution de chaque algorithme afin de
choisir le meilleur.
Maitriser les techniques d’évaluation d’un algorithme
Types de complexité
Ressources utilisées ⇒ complexité temporelle et complexité spatiale.
Notation asymptotique
On introduit le concept de la notation asymptotique, qui permet d’estimer le temps
d’exécution d’un algorithme
Définition
Soit T(n) une fonction qui désigne le temps de calcul d’un algorithme A. On dit que T(n) est en
grand O de f(n) : T (n) = O (f (n)) si et seulement si : ∃(n0 , c ) telle que T (n) <= c ∗ f (n)
∀n >= n0
”Big” O : Exemples
Exemple 1 :
si T (n) = 3n + 6 alors T (n) = O (n)
Démonstration :
En effet, pour n >= 2, on a 3n + 6 <= 9n ; la quantité 3n + 6 est donc bornée, `à
partir d’un certain rang, par le produit de n et d’une constante.
3 ∗ 2 + 6 <= 9 ∗ 2
3 ∗ 3 + 6 <= 9 ∗ 3
3 ∗ 4 + 6 <= 9 ∗ 4
3 ∗ 5 + 6 <= 9 ∗ 5
Remarque
En général, il est difficile de trouver le seuil afin de borner la complexité O. Pour cela,
on applique des règles afin de simplifier l’expression du temps d’exécution
Règles de calcul
On calcule le temps d’exécution comme avant, mais on effectue des simplifications
suivantes :
4
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
5
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
→Technique 1 : Coût(A)=6
→Technique 2 : Coût(A)=c 1 + c 2 + c 3
Donc la complexité est O(1)
Le coût des instructions composées
On appelle opération composée, toute instruction contenant :
1 L’exécution d’une instruction conditionnelle : Si P est une instruction
conditionnelle du type Si b alors Q 1 sinon Q 2 finsi, le nombre
d’opérations est :
Cout (P ) <= Cout (test ) + max (Cout (Q 1), Cout (Q 2))
6
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
7
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
def division(a,b) :
q=a//b
r=a%b
return (q,r)
def somme(L) :
s=0
for i in range (len(L)) :
s=s+L[i]
return s
8
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
def RemplirMat(M,n,p) :
for i in range(n) :
for j in range(p) :
print(“T[”,i,“][“,j,”]=“,end=”)
T[i][j]=int(input())
9
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
def ProduitMatriciel(A,B) :
n,p,m= len(A)) , len(B[0])) , len(B))
prod = [[0]*len(A) for i in range(len(A))]
for i in range(n) :
for j in range(p) :
s=0
for k in range(m) :
s= s + A[i][k] * B[k][i]
prod[i].append(s)
return prod
Analyse: le corps de la boucle sur k est en O(1) car ne contient qu’un nombre constant d’opérations
élémentaires. Comme cette boucle est itérée m fois, sa complexité est alors en O(m). La boucle sur
j est itérée p fois. Sa complexité est en p.O(m) = O(mp). La boucle sur i est répétée n fois. Par
conséquent, la complexité de tout l’algorithme est en O(nmp).
Remarque : cas particulier, si A et B sont des matrices carrées donc m=n=p et T(n)=O(n3)
complexité polynomiale cubique
Différentes nuances de complexité temporelle
Pour des données de même taille, un algorithme n'effectue pas nécessairement le même nombre
d'opérations élémentaires. Pour cela, on distingue 3 types de complexité :
• Complexité au pire des cas.
• Complexité dans le meilleur des cas.
• Complexité en moyenne des cas.
Complexité dans le meilleur des cas : La complexité au meilleur est le plus petit nombre
d'opérations qu'aura à exécuter l'algorithme sur un jeu de données de taille fixée
Tmin (n) = min{C (d )}
d ∈Dn
Complexité en moyenne des cas
Tmoy (n) = {Pr (d ).C (d ), d ∈ Dn }
•
10
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
11
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
0 n
1 n/2
2 n/4
3 n/8
.......................................
k n/ 2k
On exécute la boucle while k fois tant que n/2k ≠ 1 plus une opération pour
exécuter la condition d’arrêt
𝑛
=1→n=2k → log2(n)=log2(2k)→k=log2(n),
2𝑘
12
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
def FiboRe(n) :
if (n==0 or n==1) :
return 1
else :
return FiboRe(n-1)+FiboRe(n-2)
13
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
Donc une équation de récurrence sans second membre : S(n) − S(n −1) − S(n − 2) = 0
Son polynôme caractéristique est : x2-x-1=0
Cette équation possède dans ce cas deux solutions réelles distinctes
S S
Théorème général
Soient a ≥ 1 et b > 1 deux constantes, soit f (n) une fonction et soit T(n) définie pour les
entiers non négatifs par la récurrence
T(n)=aT(n/b)+f (n)
où l’on interprète n/b comme signifiant ⌊n/b⌋. T(n) peut alors être bornée asymptotiquement
de la façon suivante.
14
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
Exemple
15