Introduction À La Complexité
Introduction À La Complexité
Introduction À La Complexité
BOUHOUCH
Introduction à la complexité
I- Définitions
1. Définition1 : Algorithme
Th. H. Cormen, Ch. E. Leiserson, R. L. Rivest, C. Stein2, ont donné cette définition :
"Procédure de calcul bien définie qui prend en entrée une valeur, ou un ensemble de valeurs, et
qui donne en sortie une valeur, ou un ensemble de valeurs. Un algorithme est donc une séquence
d’étapes de calcul qui transforment l’entrée en sortie."
2. Définition 2 : Complexité d’un algorithme
La complexité d’un algorithme est le nombre d’opérations élémentaires qu’il doit effectuer pour
mener à bien un calcul en fonction de la taille des données d’entrée.
Pour Stockmeyer et Chandra, "l’efficacité d’un algorithme est mesurée par l’augmentation du
temps de calcul en fonction du nombre des données."
Nous avons donc deux éléments à prendre en compte :
la taille des données ;
le temps de calcul.
La théorie de la complexité est une branche de l’informatique théorique. Elle cherche à calculer,
formellement, la complexité algorithmique nécessaire pour résoudre un problème
algorithmique P au moyen de l’exécution d’un algorithme A. La complexité d’un algorithme A
est le calcul de la quantité de ressources (temps t et/ou espace mémoire s) nécessaire pour
résoudre P au moyen de l’exécution de A en fonction de la taille n de P et indépendamment de
la performance de la machine de l’exécution.
La théorie de la complexité vise à répondre aux besoins d’efficacité des algorithmes
(programmes). Elle permet :
• Classer les problèmes selon leur difficulté.
• Classer les algorithmes selon leur efficacité.
• Comparer les algorithmes résolvant un problème donné afin de faire un choix sans
devoir les implémenter.
On ne mesure pas la durée en heure, minute, seconde… cela impliquerait d’implémenter les
algorithmes qu’on veut comparer. Ces mesures ne seraient pas pertinentes car le même
algorithme sera plus rapide sur une machine plus puissante, au lieu de ça, on utilise des unités
de temps abstraite proportionnelles au nombre d’opérations effectuées. Au besoin, on pourra
alors adapter ces quantités en fonction de la machine sur laquelle l’algorithme s’exécute.
1
1LISI ASD et complexité Mme. R.BOUHOUCH
2
1LISI ASD et complexité Mme. R.BOUHOUCH
Pour connaitre le temps de calcul, nous choisissons une opération fondamentale et nous
calculons le nombre d’opérations fondamentales exécutées par l’algorithme.
IV- Operations fondamentales
C’est la nature du problème qui fait que certaines opérations deviennent plus fondamentales
que d’autres dans un algorithme.
Par exemple :
V- Exemple :
Algorithme (2)
3
1LISI ASD et complexité Mme. R.BOUHOUCH
Remarque : le résultat cherché est n ÷ p, où p est le plus petit diviseur supérieur ou égal à 2 de
n.
Notons ppd(n) le plus petit diviseur en question.
Algorithme (3)
On peut maintenant tenir compte de ce que : n non premier →2≤ ppd(n) ≤pgd(n) ≤n-1:
D’où il vient que :
n non premier→ (ppd(n))2 ≤n:
Ceci permet d’améliorer le temps de calcul pour les nombres premiers : il est donc inutile de
chercher en croissant entre ⌊√𝑛⌋ + 1 et n.
En procédant en croissant sur les diviseurs possibles :
4
1LISI ASD et complexité Mme. R.BOUHOUCH
Retenir
Sur une machine où les opérations sur les entiers s’effectuent en temps constant, le temps
d’exécution est donc de la forme :
a B(n) + b
où a et b sont des constantes.
Borne maximale :
Pour les solutions (1) et (2) B(n) ≤ n-2
Pour la solution (3) B(n) ≤⌊√𝑛⌋-1
Complexité temporelle maximale :
Pour les solutions (1) et (2) a’n + b’
Pour la solution (3) a’⌊√𝑛⌋+b’