Complexité des algorithmes

Position du problème

L'exécution d'un programme a toujours un coût. Il existe deux paramètres essentiels pour mesurer ce coût :

tabular48

tex2html_wrap687

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)

Choix d'un système de mesure et d'une complexité

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 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 !

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 tex2html_wrap_inline707 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.

Une étude de cas : la recherche linéaire

 

Pb :
Déterminer si un objet x donné est présent dans un tableau de taille n, on a donc : tex2html_wrap_inline719 .

Algorithme proposé : tex2html_wrap737

Correction

Terminaison :
le corps de la boucle tant que est exécuté un nombre fini de fois, car si tex2html_wrap_inline739 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 :

displaymath749

à la fin du programme est vérifiée. Pour cela, montrons que :

displaymath751

est un invariant de la boucle.

En conclusion, en 8 on a bien :
tex2html_wrap835

donc la correction partielle est assurée. Comme nous avons montré la terminaison, l'algorithme est donc correct.

Complexité temporelle

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 :

displaymath847

en moyenne :
tex2html_wrap_inline849

Hypothèse : les éléments de t, ainsi que x, tex2html_wrap_inline855

Il existe donc tex2html_wrap_inline857 tableaux distincts. Parmi ceux-ci, il y a tex2html_wrap_inline859 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 tex2html_wrap_inline871 , il y a tex2html_wrap_inline873 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]).

exo145

Le coût moyen est donc :

displaymath887

Simplifions cette expression :

displaymath889

exo167

D'où :

displaymath893

et enfin :

displaymath895

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.

exo187

exo190

tex2html_wrap935

exo200

tex2html_wrap937

Outils mathématiques

Soient f et g deux applications de tex2html_wrap_inline943

definition215

ex230

prop235

exo249

definition251

ex253

prop257

rqe259

  exo261

Les principales classes de complexité

Lors de l'analyse de complexité, on essaie de se ramener aux classes suivantes (données par complexité croissante) :

Complexité logarithmique :
coût en tex2html_wrap_inline1003 .
ex : recherche dichotomique dans un tableau trié t[1..n].
Complexité linéaire :
coût en tex2html_wrap_inline1007 .
ex : calcul du produit scalaire de deux vecteurs de tex2html_wrap_inline1009 .
Complexité quasi-linéaire :
coût en tex2html_wrap_inline1011 .
ex : tri par fusion.
Complexité polynomiale :
coût en tex2html_wrap_inline1013 avec k > 1.
ex : multiplication de deux matrices carrées d'ordre n : tex2html_wrap_inline1019 .
Complexité exponentielle :
coût en tex2html_wrap_inline1021 avec a > 1.
ex : tours de Hanoï.

rqe285

Résolution de récurrences linéaires

Etude de suites tex2html_wrap_inline1047 telles que :
tex2html_wrap1089

De telles suites interviennent dans l'analyse de complexité d'algorithmes récursifs tels que :

cas a = 1 :
Par sommation et télescopage, on a : tex2html_wrap_inline1053

Supposons tex2html_wrap_inline1055 , pour tex2html_wrap_inline1057 ; d'après l'exercice 7,

displaymath1059

d'où tex2html_wrap1091

cas tex2html_wrap_inline1063 :
On a : tex2html_wrap_inline1065

donc tex2html_wrap1093

tex2html_wrap1095

exo361

Résolution des récurrences ``diviser pour régner''

La stratégie ``diviser pour régner'' consiste `a découper la donnée en deux parts (ou plus) de tailles identiques ( tex2html_wrap_inline1097 ), 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 : tex2html_wrap_inline1099

ex374

Cas où n est une puissance de 2 :
on a : tex2html_wrap_inline1105
Posons : tex2html_wrap_inline1107 , ce qui nous ramène à :

displaymath1109

i.e.

displaymath1111

Posons tex2html_wrap_inline1113 ; alors tex2html_wrap_inline1115
Par sommation et télescopage : tex2html_wrap_inline1117

donc tex2html_wrap1203

en repassant à la suite (c)

tex2html_wrap1205

Le comportement asymptotique de c(n) dépend de la nature de la série de terme général tex2html_wrap_inline1127 . Examinons les trois cas pour lesquels on peut conclure :

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 tex2html_wrap_inline1151 croît pour tex2html_wrap_inline1153 par récurrence :

Encadrons n : tex2html_wrap_inline1171 (où tex2html_wrap_inline1173 ).
On a : tex2html_wrap_inline1175 .
Si tex2html_wrap_inline1177 alors :

displaymath1179

montre que tex2html_wrap_inline1181 . On aboutit à une conclusion analogue si tex2html_wrap_inline1183 .

tex2html_wrap1209

exo525

exo527

Àpropos de ce document...

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