Algorithmique
Feuille d’exercices 3: Complexit´e
1. ´
Ecrire un algorithme prenant en argument deux listes d’entiers, et retournant la liste des ´el´ements
communs aux deux listes. ´
Etudier.... sa complexit´e
2. Pour cette question on s’interdit d’utiliser l’op´erateur d’exponentiation **. On pourra quand mˆeme
calculer des puissances, mais `a l’aide d’une fonction programm´ee par nos soins. ´
Ecrire un algorithme
calculant P(x) pour PR[X] et xR. Votre fonction prendra en argument xet la liste des
coefficients de P(le coefficient dominant en premier). Combien d’additions effectue-t-on ? Combien
de multiplications ?
3. SANS utiliser la fonction L.insert, ´ecrire une fonction qui ins`ere une valeur xau bon endroit dans
une liste tri´ee L, et ´etudier sa complexit´e dans le pire et dans le meilleur cas.
4. Le tri par insertion d’une liste Lconsiste `a cr´eer une liste Gqui est initialement vide donc tri´ee, puis
`a y ins´erer un `a un les ´el´ements de Len la maintenant tri´ee. Quelle est sa complexit´e dans le pire et
dans le meilleur cas ?
5. La fonction divmod de python calcule reste et quotient d’une division euclidienne : (q,r)=divmod(a,b).
Consid´erons l’algorithme suivant, appel´e Exponentiation rapide :
def expo_rapide(x,e):
# Calcule x**e, avec ’x’ entier ou r´eel et ’e’ naturel
p=1
while e>0 :
q,r=divmod(e,2)
if r==1 :
p=p*x
e=q
x=x*x
return p
Terminaison et Complexit´e
(a) Montrer la terminaison de cet algorithme.
(b) En toute g´en´eralit´e la division euclidienne n’est pas une op´eration ´el´ementaire. Expliquer pour-
quoi on peut consid´erer que la division euclidienne par 2 en est une.
(c) Justifier le fait que blog2(e)cest un variant de la boucle.
(d) En d´eduire la complexit´e dans le pire et le meilleur cas, en nombre de multiplications et de
divisions euclidiennes par 2. Justifier le nom donn´e `a cet algorithme.
— Correction
(e) Quelles sont les valeurs successives de p,x,e dans le calcul de expo rapide(α,11), pour un
r´eel αdonn´e ?
(f) Identifier un invariant de boucle et montrer la correction de l’algorithme.
(g) ´
Ecrire une version r´ecursive de l’exponentiation rapide.
1
6. M´ethode de Horner (suite de l’exercice 2). Notons P=a1Xn1+... +an1X+an.
Pour tout k[[0, n]], on pose Dk=a1Xk1+... +ak=
k
X
i=1
aiXki(le quotient de Pdivis´e par Xnk)
(a) Donner une relation simple liant Dket Dk+1, et en d´eduire une relation liant Dk(x) et Dk+1(x).
(b) En remarquant que D0= 0 et Dn=P, proposer un algorithme de calcul de P(x) reposant sur la
relation pr´ec´edente. Quelle est sa complexit´e ?
Remarque : William George Horner ´etait anglais, son nom ne s’´ecrit pas “H¨orner”, mˆeme si de
nombreux auteurs et enseignants font cette faute.
7. Recherche de z´ero par dichotomie.
(a) ´
Ecrire une fonction trouve zero(f,a,b,epsilon) qui prend en argument une fonction fet trois
r´eels a b et ε, avec la garantie que f(a) et f(b) sont de signe oppos´e. Elle devra retourner un r´eel
c[a, b] tel que fs’annule ou change de signe dans l’intervalle [cε, c +ε] (ou None si c’est
impossible)
(b) Quelle est sa complexit´e, en fonction de a,b, et ε?
(c) Pour quelle raison cette tˆache pourrait-elle ˆetre impossible ?
8. Fibonacci rapide. Fn=(nsi n∈ {0,1}
Fn1+Fn2sinon On a vu en TP (avec une d´efinition de Fneg`erement
diff´erente) un algorithme r´ecursif de calcul de Fnde complexit´e lin´eaire.
(a) On pose A=0 1
1 1. V´erifier que nN, An=Fn1Fn
FnFn+1(en posant F1= 1)
(b) Proposer un algorithme de calcul de Fnde complexit´e logarithmique.
9. Algorithme d’Euclide et suite de Fibonacci
(a) Montrer par r´ecurrence que pour tout n1, si a>bet l’algorithme d’Euclide (voir feuille
d’exercices 2) effectue ndivisions euclidiennes pour calculer pgcd(a, b), alors aFn+2 et b
Fn+1.
On fixe un n1.
(b) En d´eduire que si Fn+2 > a > b, le calcul de pgcd(a, b)effectue au plus n1 divisions euclidiennes.
(c) En d´eduire que a, b si a < Fn+2 et b < Fn+2, le calcul de pgcd(a, b)effectue au plus ndivisions
euclidiennes.
(d) Conclure quant `a la complexit´e de l’algorithme d’Euclide, en utilisant le fait que
Fn=k(ϕn(ϕ)n), avec ϕ=1+5
2et k=ϕ
ϕ2+1 .
10. Op´erations dans R[X]. On repr´esentera un polynˆome par la liste de ses coefficients (coefficient domi-
nant en premier)
(a) ´
Ecrire une fonction calculant le produit d’un polynˆome par un scalaire, et ´etudier sa complexit´e.
(b) ´
Ecrire une fonction calculant la somme de deux polynˆomes, et ´etudier sa complexit´e.
(c) ´
Ecrire une fonction calculant le produit de deux polynˆomes, et ´etudier sa complexit´e.
(d) ´
Ecrire une fonction effectuant la division euclidienne de deux polynˆomes, et ´etudier sa complexit´e.
2
1 / 2 100%