Algorithmie PC 1 : Complexité corrigé 1Élements de complexité

Algorithmie
PC 1 : Complexit´e
corrig´e
1´
Elements de complexit´e
1.1 D´efinitions
Le nombre d’op´erations effectu´es ou la place m´emoire prise par un programme
est souvent not´ee en O(). Une d´efinition math´ematique de cette fonction peut
ˆetre :
Une fonction g(N) est en O(f(N)) (de l’ordre de f(N)) s’il existe deux con-
stantes c0et N0tels que g(N)< c0f(N), pour tout N > N0.
1.2
Jeux des diff´erences
1.2.1
Quelle est la diff´erence entre O(1) et O(2) ?
en notant f(N)=1 et g(N)=2 on a que pour tout N, f(N) <g(N) et g(N) <
3f(N). Ces deux fonctions sont donc ´equivalentes.
On peut donner les r`egles suivantes :
• O(f(N) + g(N)) = O(f(N))+O(g(N))
• O(Af(N)) = A∗ O(f(N)) = O(f(N))
f(N)∗ O(g(N)) = O(f(N)g(N))
1.2.2
Quelle est la diff´erence entre O(N2+N3)et O(N3)?
De mˆeme que pr´ec´edemment ces deux fonctions sont ´equivalentes. On a
O(N2+N3) = O(N2) + O(N3). Comme N2est en O(N3), O(N2) + O(N3) =
O(N3) + O(N3) = 2O(N3) = O(N3)
1
1.3 Calcul de complexit´e pour des algorithmes fictifs
1.3.1
Donnez une complexit´e de l’algorithme suivant (et dites ce qu’il fait)
En dehors des boucles, il n’y a qu’une unique affectation. Il y a deux boucles im-
Algorithme 1 Algorithme ne servant pas `a grand chose
Donn´ees
n
ebut
total=0
de i=1 an-1 faire
de j=i+1 anfaire
total=total+1
Rendre k
Fin
briqu´es, et `a l’inerieur des deux boucles une affectation, donc en O(1). Chaque
boucle ´etant en O(n), la complexit´e de cet algorithme est en O(n2). On peut
bien sur regarder toutes les op´erations une `a une et on trouverait un nombre
d’op´eration ´egal `a 1 + n(n-1)/2.
L’algorithme fait de nombreuses choses : il compte les boucles, calcule le
nombre de sous-ensembles `a 2 ´el´ements d’un ensemble `a n ´el´ements, etc...
1.3.2
Quel est la complexit´e d’un algorithme qui, `a partir de n donn´ees
initiales, examine toutes les donn´ees, en supprime une et recommence
(examen des donn´ees et suppression) jusqu’`a ce qu’il n’y ai plus de
donn´ees.
On peut utiliser la formule de r´ecurrence C(N) = N+C(N1), o`u C(N)
est la complexit´e de l’algorithme `a N donn´ees.
On a alors C(N) = N+N1 + N2 + ... + 1 = N(N+ 1)/2
2 R´ecursion
2.1 D´efinition
La r´ecursion est un principe fondamental en math´ematique (la preuve par
r´ecurrence par exemple) et en informatique. Une d´efinition simple de ce principe
en informatique est qu’un programme r´ecursif s’appelle lui-mˆeme.
Pour ´eviter que le programme ne s’appelle ind´efiniment, il est n´ecessaire
d’avoir une condition d’arrˆet, qui, lorsqu’elle est satisfaite empˆeche le pro-
gramme de s’appeler lui-mˆeme.
2
2.2 Factorielle
La d´efinition math´ematique de la fonction factorielle est pour tout entier N:
N! = N˙
(N1)! pour N1
0! = 1
Voici une version algorithmique de l’´equation :
Algorithme 2 Algorithme Factorielle(N)
Donn´ees
N
ebut
Si N=0Alors
Rendre 1
Sinon
Rendre N*Factorielle(N-1)
Fin
2.2.1
L’algorithme 2 calcule-t-il bien une factorielle ?
Ben oui, il calcule bien ce qu’il faut. On le prouve par r´ecurrence. Pour
n= 0 on a bien que Factorielle(0) = 1 = 1!. On suppose donc que pour n0,
Factorielle(n) = n!.
Pour n+ 1. L’algorithme retourne (n+ 1) F actorielle(n). Par hypoth`ese
de r´ecurrence Factorielle(n) = n!, donc Factorielle(n+1) =(n+1)*Factorielle(n)
= (n+1)*n! = (n+1)!.
2.2.2
Quel est le domaine de d´efinition l’entier N de l’algorithme 2 ? Que
se passe-t-il si N est en dehors de son domaine ?
Le domaine de d´efinition est l’ensemble des entiers naturels. Si N est un r´eel
ou un entier n´egatif, l’algorithme ne s’arrˆete pas. Pour pallier ce probl`eme on
peut changer le test si N=0 alors rendre 1 par si N 0 alors rendre 1
2.2.3
Quelle est la complexit´e de l’algorithme 2 ?
Encore une fois, on va calculer sa complexit´e par r´ecurrence. Soit C(N) le
nombre d’op´eration effectu´e par l’algorithme 2. On a C(0) = 1, puisqu’il y a une
affectation (on ne compte pas le test comme une op´eration ici). De plus, C(N)
= 1 + C(N-1) pour N > 0 puisque l’on multiplie le r´esultat de Factorielle(N-1)
`a N.
3
Ainsi, C(N) = 1 + C(N-1) = 1 + 1 + C(N-2) = .... = N + C(0) = N+1.
Le calcul de Factorielle avec l’algorithme 2 est donc en O(n).
2.3 Fibonacci
La d´efinition math´ematique de la suite de Fibonacci (destin´ee initialement `a
compter le nombre de lapin g´en´eration apr`es g´en´eration. Le probl`eme initial,
propos´e en 1202 ´etait en effet : Partant d’un couple, combien de couples de
lapins obtiendrons-nous apr`es un nombre donn´e de mois sachant que chaque
couple produit chaque mois un nouveau couple, lequel ne devient productif
qu’apr`es deux mois.)
est pour tout entier N:
F(N) = F(N1) + F(N2) pour N2
F(0) = F(1) = 1
2.3.1
S’inspirer de l’algorithme 2 pour ´ecrire un programme r´ecursif calcu-
lant la suite de Fibonacci.
Algorithme 3 Algorithme Fibonacci(N)
Donn´ees
N
ebut
Si N1Alors
Rendre 1
Sinon
Rendre Fibonacci(N-1) + Fibonacci(N-2)
Fin
2.3.2
Calculer le nombre d’appels au programme Fibonacci lors de l’ex´ecution de
Fibonacci(n).
Lorsque N vaut 0 ou 1, le nombre d’appel est ´egal `a 1. Pour N2, le nom-
bre d’appel `a Fibonacci est ´egal au nombre d’appels de Fibonacci(N-1) plus le
nombre d’appels de Fibonacci(N-2) plus 1. Le nombre d’appel `a Fibonacci pour
l’algorithme 3 est donc ´egal `a 2*Fibonacci(N)-1, et est donc en O(Fibonacci(N)).
Pour calculer le nombre d’appels pr´ecis´ement, on va trouver un ´equivalent `a
Fibonacci(N).
La suite Fibonacci(N)/Fibonacci(N-1), si elle converge, converge vers Φ =
1+5
2qui est la solution positive de l’´equation x= 1 + 1/x. En effet, on a
Fibonacci(N)/Fibonacci(N-1) = 1 + Fibonacci(N-2)/Fibonacci(N-1) et donc si
4
la limite L existe elle satisfait L = 1 +1/L. Cette ´equation nous montre de plus
que pour tout N, Fibonacci(N)/Fibonacci(N-1) >1.
Il nous reste `a montrer que Fibonacci(N)/Fibonacci(N-1) converge. En
posant f(x) = 1+1/x, on a que Fibonacci(N)/Fibonacci(N-1) -Φ = f(Fibonacci(N-
1)/Fibonacci(N-2)) -f(Φ). La formule des accroissements fini nous indique donc
qu’il existe c dans [min{Fibonacci(N-1)/Fibonacci(N-2), Φ}, max{Fibonacci(N-
1)/Fibonacci(N-2), Φ}] tel que :
f(Fibonacci(N-1)/Fibonacci(N-2)) -f(Φ) = f’(c)((Fibonacci(N-1)/Fibonacci(N-
2)-Φ).
Comme f0(x) = 1/x2et que c > 1, on a que 0 <|f0(c)|<1. Ainsi :
|Fibonacci(N)/Fibonacci(N-1) Φ| ≤ A|(Fibonacci(N-1)/Fibonacci(N-2) Φ)|,
avec A < 1. De l`a, |Fibonacci(N)/Fibonacci(N-1) Φ| ≤ AN2|1Φ|et donc
Fibonacci(N)/Fibonacci(N-1) converge bien vers Φ.
Cette convergence nous permet ensuite de conclure que Fibonacci(N) est
´equivalent `a ΦN. Le nombre d’appel `a Fibonacci est donc en On).
2.4
Conclusion ?
Un nombre d’appel exponentiel, c’est trop ! L’algorithme propos´e n’est
pas un bon algorithme pour calculer la suite de Fibonacci. La raison en est
que beaucoup beaucoup de choses sont calcul´ees plusieurs fois. Par exemple
Fibonacci(N-2) est calcul´ee pour Fibonacci(N) et pour Fibonacci(N-1).
Il faut trouver un moyen de ne calculer les choses qu’une et une seule fois.
2.5
Proposez un algorithme it´eratif calculant la suite de Fibonacci, et
donner en sa complexit´e.
La complexit´e est en O(N). Ce qui n’a rien `a voire avec On).
3 Trop Poly pour ˆetre honnˆete
On repr´esente un polynˆome P(x) = a0+P1inaixide degr´e npar un tableau
tab de taille n+ 1 tel que tab[i]=ai(0 in).
3.1
Proposez un algorithme permettant de calculer la somme de deux
polynˆomes P(x)et Q(x)de mˆeme degr´e n. Quel est sa complexit´e ?
La complexit´e de cet algorithme est clairement en O(n).
3.2
Proposez un algorithme permettant de calculer le produit de deux
polynˆomes P(x)et Q(x)de mˆeme degr´e n. Quel est sa complexit´e ?
5
1 / 8 100%

Algorithmie PC 1 : Complexité corrigé 1Élements de complexité

La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !