Chapitre 1
Chapitre 1
Chapitre 1
1
Marrakech
mohamedaatila350@gmail.com
Plan :
2 La complexité
Complexité
Différentes mesures de complexité
Règles de calculs sur la complexité
3 Notation de Landau
Notation O (respectivement Ω)
Exercice
Exercice
Écrire par deux méthodes différentes une fonction qui prend en paramètre un entier
positif non nul n et qui calcule le nieme terme de la suite de Fibonacci.
F0 = 0
F1 = 1
Fn = Fn−1 + Fn−2
Comparer les deux programmes!.
Algorithme
Algorithme
Un algorithme est une ”Procédure de calcul bien définie qui prend en entrée une valeur,
Programme
Algorithme fonctionnel
Dire qu’un algorithme est fonctionnel est équivalent à répondre aux questions suivantes:
— L’algorithme se termine-t-il?
Plan :
2 La complexité
Complexité
Différentes mesures de complexité
Règles de calculs sur la complexité
3 Notation de Landau
Notation O (respectivement Ω)
complexité
Pour juger donc l’efficacité des algorithmes, on s’intéresse alors à la quantité des
même question.
complexité
Pour juger donc l’efficacité des algorithmes, on s’intéresse alors à la quantité des
même question.
complexité
Pour juger donc l’efficacité des algorithmes, on s’intéresse alors à la quantité des
même question.
complexité
Pour juger donc l’efficacité des algorithmes, on s’intéresse alors à la quantité des
même question.
Mesures de complexité
Mesures de complexité
Meilleur cas (cas le plus favorable): C’est la valeur minimale de la complexité d’un
Mesures de complexité
Meilleur cas (cas le plus favorable): C’est la valeur minimale de la complexité d’un
possibles
Mesures de complexité
Meilleur cas (cas le plus favorable): C’est la valeur minimale de la complexité d’un
possibles
Mesures de complexité
On définit les trois mesures de complexité sur l’ensemble Dn des données de taille n
comme suit:
Notons cout(d) la complexité en temps de l’algorithme A sur la donnée d,
— La complexité dans le meilleur des cas: MinA (n) = min{coutA (d) | d ∈ Dn }
— La complexité dans le pire des cas: MaxA (n) = max{coutA (d) | d ∈ Dn }}
P
— La complexité en moyenne: MoyA (n) = d∈Dn p(d) × coutA (d)}
où p(d) est la probabilité que l’on ait la donnée d en entrée de l’algorithme.
10 3 11 5 1 13 2 12 8 4 9 7 6
Exercice
On souhaite chercher un nombre existant dans la liste en utilisant une recherche
séquentielle.
Proposer un programme qui nous permet de retourner l’indice du nombre cherché dans la
liste.
10 3 11 5 1 13 2 12 8 4 9 7 6
Exercice
On souhaite chercher un nombre existant dans la liste en utilisant une recherche
séquentielle.
Proposer un programme qui nous permet de retourner l’indice du nombre cherché dans la
liste.
10 3 11 5 1 13 2 12 8 4 9 7 6
Exercice
On souhaite chercher un nombre existant dans la liste en utilisant une recherche
séquentielle.
Proposer un programme qui nous permet de retourner l’indice du nombre cherché dans la
liste.
10 3 11 5 1 13 2 12 8 4 9 7 6
Exercice
On souhaite chercher un nombre existant dans la liste en utilisant une recherche
séquentielle.
Proposer un programme qui nous permet de retourner l’indice du nombre cherché dans la
liste.
Opérations élémentaires
complexité suivant :
général un faible temps d’exécution, celui-ci sera considéré comme l’unité de mesure du
Somme de complexités
de l’instruction q:
exemple
Programme K:
instruction q : A = 5
instruction p : B = 10
Exemple:
if Condition :
Traitement 1
else :
Traitement 2
Exemple:
if Condition :
Traitement 1
else :
Traitement 2
T(n)=Coût(condition)+max{Coût(Traitement1), Coût(Traitement2)}
Exemple:
if Condition :
Traitement 1
else :
Traitement 2
T(n)=Coût(condition)+max{Coût(Traitement1), Coût(Traitement2)}
tel que xi représente le coût de chaque instruction élémentaire dans la boucle while.
boucle while
while n >= 0:
T +=1
n -=1
tel que xi représente le coût de chaque instruction élémentaire dans la boucle while.
boucle while
while n >= 0:
T +=1
n -=1
Nous avons donc n + 1 répétition, et pour chacune nous avons 5 opérations élémentaires,
d’où T (n) = 5n + 5
boucle for
for i in range(n) :
print(”Bonjour”)
boucle for
for i in range(n) :
print(”Bonjour”)
Nous avons donc n répétitions, avec une instruction élémentaire de complexité constante
O(1), d’où T (n) = 3n + 1
Application
Application
solution
1 multiplication (lignes 3 ou 5)
3 affectations de variables (lignes 1, puis 3 ou 5)
1 lecture et 1 écriture
1 test (ligne 2)
Au total 7 opérations, donc une complexité constante.
Application
Application
solution
1 boucle for qui se répète k fois
1 boucle while de n répétition pour chaque i
1 Des opérations d’affectation et de lecture et d’écriture.
La complexité est donc T(n)= n*k + cst.
Exercice
Exercice 1
Proposer un programme qui demande à l’utilisateur d’entrer un nombre positif non nul n
, et qui donne la table de multiplication des nombres de 1 jusqu’à n. Donner sa
complexité en fonction de n
Exercice
Exercice 1
Proposer un programme qui demande à l’utilisateur d’entrer un nombre positif non nul n
, et qui donne la table de multiplication des nombres de 1 jusqu’à n. Donner sa
complexité en fonction de n
Exercice 2
Écrire une fonction qui prend en paramètre un nombre positif non nul, et qui retourne si
ce nombre est un nombre parfait.
Un nombre est parfait s’il est égal à la somme de ses diviseurs propres.
Donner sa complexité.
solution 2
# version 2
def est_parfait ( n ) :
somme_diviseu rs = 1
for i in range (2 , n ) :
if n % i == 0:
s om me _d i vi se ur s += i
if n == somme_ d iv is eu r s :
return True
else :
return False
Complexité ?
solution 1
# Version 1
from math import *
def est_parfait ( n ) :
somme_diviseu rs = 1
for i in range (2 , n /2 + 1) :
if n % i == 0:
s om me _d i vi se ur s += i
if n == somme_ d iv is eu r s :
return True
else :
return False
Complexité ?
solution 3
# version 3
def est_parfait ( n ) :
somme_diviseu rs = 1
for i in range (2 , int ( round ( n **0.5) ) +1) :
if n % i == 0:
s om me _d i vi se ur s += i
s om me _d i vi se ur s += n / i
if n == somme_ d iv is eu r s :
return True
else :
return False
Complexité ?
Exercice
Exercice
Écrire par deux méthodes différentes (une par un tableau, une par des simples variables)
une fonction qui prend en paramètre un entier positif non nul n et qui calcule le nieme
terme de la suite de Fibonacci.
F0 = 0
F1 = 1
Fn = Fn−1 + Fn−2
Pour chaque méthode, calculer sa complexité spatiale et temporelle.
solution 1
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
T =[0 ,1]
for i in range (2 , n +1) :
T . append ( T [i -1]+ T [i -2])
return T [ n ]
Complexité spatiale:?
solution 1
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
T =[0 ,1]
for i in range (2 , n +1) :
T . append ( T [i -1]+ T [i -2])
return T [ n ]
Complexité spatiale:? n + 1
Complexité temporelle: ?
solution 1
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
T =[0 ,1]
for i in range (2 , n +1) :
T . append ( T [i -1]+ T [i -2])
return T [ n ]
Complexité spatiale:? n + 1
Complexité temporelle: ? n − 1 additions
solution 2
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
a =0
b =1
c =0
for i in range (2 , n +1) :
c=b+a
a=b
b=c
return c
Complexité spatiale:?
solution 2
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
a =0
b =1
c =0
for i in range (2 , n +1) :
c=b+a
a=b
b=c
return c
Complexité spatiale:? 3
Complexité temporelle: ?
solution 2
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
a =0
b =1
c =0
for i in range (2 , n +1) :
c=b+a
a=b
b=c
return c
Complexité spatiale:? 3
Complexité temporelle: ? n − 1 additions
solution 3
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
a =0
b =1
for i in range (2 , n //2 +2) :
a=b+a
b=a+b
if n %2==0:
return a
else :
return b
Complexité spatiale:?
solution 3
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
a =0
b =1
for i in range (2 , n //2 +2) :
a=b+a
b=a+b
if n %2==0:
return a
else :
return b
Complexité spatiale:? 2
Complexité temporelle: ?
solution 3
def fibo1 ( n ) :
if (n >=0) :
if n ==0:
return 0
elif n ==1:
return 1
else :
a =0
b =1
for i in range (2 , n //2 +2) :
a=b+a
b=a+b
if n %2==0:
return a
else :
return b
Complexité spatiale:? 2
Complexité temporelle: ? n/2 additions
Plan :
2 La complexité
Complexité
Différentes mesures de complexité
Règles de calculs sur la complexité
3 Notation de Landau
Notation O (respectivement Ω)
La notation la plus utilisée pour noter la complexité d’un algorithme est la notation O
(respectivement Ω), qui dénote un ordre de grandeur. Par exemple, on dira d’un
algorithme qu’il est O(10) (respectivement Ω(10)) s’il nécessite au plus (respectivement
au moins) 10 opérations dans le pire cas (respectivement dans le meilleur des cas) pour
se compléter.
Big O
Big Ω
Exercice
Exercice1
Répondre par (Vrai, Faux) aux propositions suivantes en justifiant:
T (n) = 3n + 6 ∈ O(n)
n2 + 3n ∈ O(n2 );
3n2 ∈ O(2n );
3n2 ∈ Ω(n2 );
3n2 ∈ Θ(n2 );
Exercice 2
Pour convertir un nombre entier positif N de la base décimale à la base binaire, il faut
opérer par des divisions successives du nombre N par 2. Les restes des divisions
constituent la représentation binaire.
Écrire une fonction itérative Binaire(N) permettant d’imprimer à l’écran la
représentation binaire d’un nombre N;
Donner sa complexité spatiale et temporelle.