Complexité des algorithmes
L'exécution d'un programme a toujours un coût. Il existe deux
paramètres essentiels pour mesurer ce coût :
- Le temps d'exécution : la complexité en temps
- L'espace mémoire requis : la complexité en espace
- Objectif :
- Proposer des méthodes qui, pour la résolution d'un
problème donné, permettent d'estimer le coût d'un algorithme, de
comparer deux algorithmes différents (sans avoir à les
programmer effectivement)
L'analyse de la complexité consiste à déterminer une fonction
associant un coût (en unité de temps ou de mémoire) à chaque entrée
soumise à l'algorithme. En fait, on peut se contenter d'associer un
coût à un paramètre entier n qui résume la taille de la donnée :
- pour la recherche d'un élément dans un tableau : n = taille du
tableau,
- pour le tri d'une liste : n = taille de la liste,
- pour le calcul d'un terme d'une suite définie par une relation
de récurrence (par exemple fibonacci) : n = indice du terme.
Pour la complexité en temps, il existe une opération répandue :
calculer (en fonction de n) le nombre d'opérations élémentaires
(addition, comparaison, affectation, ...) requise par l'exécution
puis multiplier par le temps moyen de chacune d'elle. Mais problème
pour les accès à la mémoire. Il faut donc faire preuve de bon sens !
- pour un algorithme avec essentiellement des calculs numériques,
compter les opérations coûteuses (multiplications, ,
, , ...),
- dans les autres cas, compter les accès à la mémoire ou le nombre
d'appels à l'opération la plus fréquente.
Quelle complexité ? On distingue, en effet, trois sortes de
complexités :
- La complexité dans le pire des cas :
- calcul du coût dans le
pire des cas,
- La complexité en moyenne :
- on calcule le coût pour chaque
donnée possinle puis on divise la somme de ces coûts par le nombre
de données différentes,
- La complexité dans le meilleur des cas :
- on calcule le coût en
se plaçant dans le meilleur des cas.
Le type de complexité dépend de l'application (par exemple : réseau
téléphonique, commande de freinage, ...).
- Résumé :
- L'analyse de la complexité d'un algorithme consiste à
déterminer un fonction
qui, à un paramètre n dépendant de la donnée soumise à
l'algorithme (en général, n est la taille de cette donnée),
associe le coût f(n) (exprimé en unités arbitraires de temps ou
d'espace) de l'exécution de algorithme pour la donnée.
- Pb :
- Déterminer si un objet x donné est présent dans un
tableau de taille n, on a donc : .
Algorithme proposé :
- Terminaison :
- le corps de la boucle tant que est
exécuté un nombre fini de fois, car si passe à
vrai, on sort de la boucle et dans tous les cas, i augmente de 1
et i est borné par n.
- Correction partielle :
- il faut montrer que la post-condition :
à la fin du
programme est vérifiée. Pour cela, montrons que :
est un
invariant de la boucle.
- I est vrai en 3 la première fois qu'on entre dans la boucle
car :
- Supposons I vrai à l'entrée de la boucle en 3. Alors I est
toujours vrai en fin du corps de la boucle en 8. En effet :
- Au point 7, après l'affectation , la
propriété vérifiée au point 5 devient :
- Au point 8, on a donc :
En conclusion, en 8 on a bien :
donc la correction partielle est assurée. Comme nous avons montré la
terminaison, l'algorithme est donc correct.
- taille des données : n
- coût : compter le nombre d'évaluation de la condition t[i] = x
- dans le meilleur des cas :
- c(n) = 1 pour les tableaux tels
que t[1] = x.
- dans le pire des cas :
- c(n) = n pour les tableaux tels que :
- en moyenne :
-
Hypothèse : les éléments de t, ainsi que x,
Il existe donc tableaux distincts. Parmi ceux-ci, il y a
tableaux pour lesquels le coût sera n : les n-1
premiers éléments sont différents de x (le n-ième peut être x ou
différent de x). D'autre part, pour tout , il y a
tableaux pour lesquels le coût sera k (les
k-1 premiers éléments diffrérents de x, le k-ième égal à x, les
autres dans [1,p]).
Le coût moyen est donc :
Simplifions cette expression :
D'où :
et enfin :
Application : on récupère un paquet de 1000 copies d'un
partiel noté en point entier de 0 à 20. On se demande s'il y a un
étudiant qui a obtenu 20.
- en utilisant l'algorithme proposé en 3, en
moyenne (donc p = 21, n = 1000), l'examen des 21 premières
copies permettra de conclure.
- en posant la question au correcteur, on aura la réponse
immédiatement !
Soient f et g deux applications de
Lors de l'analyse de complexité, on essaie de se ramener aux classes
suivantes (données par complexité croissante) :
- Complexité logarithmique :
- coût en .
ex : recherche dichotomique dans un tableau trié t[1..n].
- Complexité linéaire :
- coût en .
ex : calcul du produit scalaire de deux vecteurs de
.
- Complexité quasi-linéaire :
- coût en .
ex : tri par fusion.
- Complexité polynomiale :
- coût en avec k > 1.
ex : multiplication de deux matrices carrées d'ordre n :
.
- Complexité exponentielle :
- coût en avec a > 1.
ex : tours de Hanoï.
Etude de suites telles que :
De telles suites interviennent dans l'analyse de complexité
d'algorithmes récursifs tels que :
- tri par sélection
- tours de Hanoï
- cas a = 1 :
- Par sommation et télescopage, on a :
Supposons , pour ; d'après
l'exercice 7,
d'où
- cas :
- On a :
donc
La stratégie ``diviser pour régner'' consiste `a découper la donnée en
deux parts (ou plus) de tailles identiques ( ), puis à appliquer
l'algorithme une (ou plus) fois à l'une de ces parts, avant de
combiner les résultats pour construire la solution pour la donnée
initiale. D'où, si le partage d'une donnée s'effectue équitablement :
- Cas où n est une puissance de 2 :
- on a :
Posons : , ce qui nous ramène à :
i.e.
Posons ; alors
Par sommation et télescopage :
donc
en repassant à la suite (c)
Le comportement asymptotique de c(n) dépend de la nature de la série
de terme général .
Examinons les trois cas pour lesquels on peut conclure :
- la série converge (cas particulier : f est un polynome de
degré inférieur à ) :
- alors :
- avec alors :
- Cas général (n quelconque) :
- on suppose f croissante (il
est raisonnable de penser que le coût du partage et de la
reconstruction croît quand n croît).
Montrons que croît pour par
récurrence :
- on a : car .
- supposons acquise la majoration :
et montrons ; on a :
or
donc
d'où
Encadrons n : (où ).
On a : .
Si alors :
montre que . On aboutit à une conclusion
analogue si .
Complexité des algorithmes
This document was generated using the LaTeX2HTML translator Version 96.1 (Feb 5, 1996) Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
The command line arguments were:
latex2html -split 0 cours.tex.
The translation was initiated by Jean-Christophe Soulie on mardi, 20 avril 1999, 09:09:14 GMT+4
- Chapitre inspiré de :
- Cours et
Exercices d'Informatique, Luc Albert et al., Vuibert 1998
Jean-Christophe Soulie
mardi, 20 avril 1999, 09:09:14 GMT+4