Vous êtes sur la page 1sur 25

Complexité algorithmique

Mirrane Achraf

CPGE Moulay Youssef


mirraneachraf@gmail.com

septembre 2022

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 1 / 25


Aperçu général

1 Introduction

2 Calcul du coût d’un algorithme itératif

3 Ordre de grandeur et Notation O

4 les Types de complexité

5 Complexité des fonctions récursives

6 la complexité spatiale

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 2 / 25


Introduction

Introduction

La complexité algorithmique est un concept très important qui permet


de comparer les algorithmes afin de trouver celui qui est le plus
efficace.
Un algorithme utilise plusieurs ressources : le processeur pour
exécuter les instructions, la mémoire pour stocker les données et les
résultats, la bande passante pour envoyer et recevoir les données qui
circulent dans un réseau informatique, etc.
Une qualité importante d’un algorithme est son efficacité (ou sa
complexité). C’est grâce à elle que l’on peut définir ce qu’est un bon
algorithmes et comparer les différents algorithmes résolvant le même
problème.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 3 / 25


Introduction

Complexité temporelle
La théorie de la complexité algorithmique étudie les questions
concernant l’efficacité des algorithmes.
Dans ce cours, on s’intéressera uniquement à l’efficacité temporelle des
algorithmes. La mesure usuelle pour l’efficacité temporelle est la
rapidité d’un algorithme, c’est-‘a-dire le temps que va prendre un
algorithme pour produire son résultat.
Il s’agit de mesurer le temps d’exécution intrinsèque d’un algorithme
(qui ne dépend que de l’algorithme et pas de son environnement.

Définition
On appelle complexité d’un algorithme le nombre asymptotique
d’opérations de base qu’il doit effectuer en fonction de la taille de
l’entrée. Cette complexité est indépendante de l’environnement où
s’exécute l’algorithme.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 4 / 25


Introduction

Une optimisation qui fait diminuer le nombre asymptotique


d’opérations de base (et donc la complexité) doit être vue comme une
amélioration de la performance d’algorithme. La définition précédente
met en jeu deux notions très importantes :
• La taille de l’entrée : comment l’identifier ?
• Les opérations de base d’un algorithme : comment les identifier
et comment les compter ?

Remarque
Dans ce cours, on s’intéressera le plus souvent à la recherche d’une
estimation par excès du cas le plus défavorable (complexité dans le
pire des cas).

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 5 / 25


Calcul du coût d’un algorithme itératif

étape initiale

Pour réaliser l’évaluation de la complexité algorithmique, il est


nécessaire de préciser les instructions élémentaires disponibles ainsi
que leurs coûts.
Ceci est particulièrement important lorsqu’on utilise un langage de
programmation tel que Python pour illustrer un cours d’algorithmique
car ce langage possède de nombreuses instructions de haut niveau
qu’il serait irréaliste de considérer comme ayant un coût constant : il
existe par exemple une fonction sort qui permet de trier un tableau en
une instruction, mais il serait illusoire de croire que son temps
d’exécution est indépendant de la taille du tableau.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 6 / 25


Calcul du coût d’un algorithme itératif

Instructions élémentaires

La première étape consiste donc à préciser quelles sont les instructions


élémentaires, c’est-à-dire celle qui seront considérées comme ayant un
coût constant, indépendant de leurs paramètres. Parmi celles-ci
figurent en général :
• Les opérations arithmétiques (addition, soustraction,
multiplication, division, modulo, partie entière, . . .)
• La comparaisons de données (relation d’égalité, d’infériorité, . . .)
• Le transferts de données (lecture et écriture dans un emplacement
mémoire)
• Les instructions de contrôle (branchement conditionnel et
inconditionnel, appel à une fonction auxiliaire, . . .)

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 7 / 25


Calcul du coût d’un algorithme itératif

Temps d’exécution d’un calcul

Pour évaluer le temps d’exécution d’un calcul, il faut évaluer et


cumuler le temps que requiert chaque instruction réalisant le calcul.
Dans l’idéal, il faudrait faire les calculs pour un type d’ordinateur
donné, exclusivement dédié à cette tâche. On se contente ici d’un
modèle très simplifié en ne gardant que les temps des opérations
élémentaires les plus importantes, par exemple : temps de transfert
entre mémoire et unité centrale, temps d’une addition ou d’une
soustraction, temps d’une multiplication, temps d’une division, temps
d’une comparaison d’un registre et de la valeur 0, temps d’une
entrée-sortie.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 8 / 25


Calcul du coût d’un algorithme itératif

Exemple : Recherche d’un élément x dans une liste L non triée de n


éléments.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 9 / 25


Calcul du coût d’un algorithme itératif

Programme Python correspondant :

Dans le pire des cas, l’élément cherché est absent du tableau. Le


nombre d’opérations est alors 3n, ce qui correspond aux n + n tests et
aux n additions.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 10 / 25


Calcul du coût d’un algorithme itératif

Prenons un exemple concret : la détermination du nombre de


diviseurs d’un entier naturel n.

Une première solution consiste à essayer si chacun des entiers compris


entre 1 et n est un diviseur de n.
Mais on peut aussi se faire la réflexion suivante : si d ∈ [0, n] divise n
n √ √
alors d′ = aussi, de plus d ≤ n ⇐⇒ d′ ≥ n Autrement dit, il
d
suffit
√ de rechercher les diviseurs de n qui sont inférieurs ou égaux à
n pour en connaitre le nombre total.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 11 / 25


Calcul du coût d’un algorithme itératif

Comment comparer ces deux versions ?


Si on se focalise sur les deux boucles conditionnelles de ces
algorithmes on constate que dans les deux cas on effectue deux
additions, une division euclidienne et un test.

Chacune de ces opérations est effectuée n fois dans le premier cas, n
fois dans le second. Autrement dit :
• multiplier n par 100 multiplie le temps d’exécution de diviseurs1
par 100 ;
• multiplier n par 100 multiplie le temps d’exécution de diviseurs2
par 10.
Ainsi, connaissant le temps d’exécution pour une valeur donnée de n il
est possible d’évaluer l’ordre de grandeur du temps d’exécution pour
de plus grandes valeurs.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 12 / 25


Calcul du coût d’un algorithme itératif

Règles de calcul

On considère que les opérations élémentaires sont à égalité de coût :


toute lecture, écriture, affectation, opération arithmétique (+, -, *, /),
concaténation, comparaison a un temps en Θ(1).
Lors de l’évaluation de la complexité, on comptabilise le nombre
d’opérations élémentaires et on ne conserve finalement que l’élément
de plus grand ordre. Par exemple, si la fonction du nombre
d’opérations d’un algorithme est 3n2 + 1000n, on ne retiendra que le
terme n2 car quand on fait tendre le nombre d’éléments à l’infini, c’est
ce terme qui domine.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 13 / 25


Calcul du coût d’un algorithme itératif

Règles de calcul
Dans un programme purement séquentiel, les boucles sont disjointes
ou emboîtées : il n’y a pas de récursivité. Dans ce cas, les temps
d’exécution s’additionnent. Ainsi
• dans le cas d’une alternative : si A alors B sinon C :

T(n) = TA (n) + Max(TB (n), TC (n))

• dans le cas d’une itération bornée : pour i allant de j à k faire A :

T(n) = (k − j + 1)TA (n)

• dans le cas d’une itération non bornée : tant que A faire B :

T(n) = (nombre d’itérations)(TA (n) + TB (n))

Le nombre d’itérations s’évalue alors de façon inductive.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 14 / 25


Ordre de grandeur et Notation O

Ordre de grandeur

Intéressons-nous par exemple à un algorithme qui, pour compter le


nombre d’éléments d’une liste, la parcourt une fois entièrement puis
s’arrête. Il est clair que plus la liste est grande, et plus le temps
d’exécution est important.
Comment caractériser la croissance de la complexité en temps en
fonction de la taille des données ? Plus largement, comment comparer,
à l’aide d’un langage rigoureux, les vitesses d’exécution de plusieurs
algorithmes effectuant la même tâche, ou l’espace mémoire qu’ils
utilisent ?
On fait appel ici à la notation de Landau O (lit « grand O »), destinée à
comparer le com- portement de deux fonctions f et g, dont on suppose
pour toute la suite qu’elles sont à valeurs strictement positives.
Par la suite, on ne considère que les fonctions dénies de IN
vers IR.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 15 / 25


Ordre de grandeur et Notation O

Notations asymptotiques (notation de Landau)


Définition (Borne supérieure asymptotique)
Une fonction g(n) est une borne supérieure asymptotique pour une
fonction f (n), si et seulement si :

(∃C > 0)(∃n0 ≥ 0) : f (n) ≤ C.g(n); (∀n ≥ n0 )

On note f (n) = O(g(n))


exemple : (n + 1)2 = O(n2 )

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 16 / 25


Ordre de grandeur et Notation O

Notations asymptotiques (notation de Landau)


Définition (Borne inférieure asymptotique)
Une fonction g(n) est une borne inférieur asymptotique pour une
fonction f (n), si et seulement si :

(∃C > 0)(∃n0 ≥ 0) : f (n) ≥ C.g(n); (∀n ≥ n0 )

On note f (n) = Ω(g(n))


exemple : (n + 1)2 = Ω(n2 )

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 17 / 25


Ordre de grandeur et Notation O

Notations asymptotiques (notation de Landau)


Définition (Borne asymptotique)
Une fonction g(n) est une borne asymptotique pour une fonction f (n),
si et seulement si :

(∃C1 > 0)(∃C2 > 0)(∃n0 ≥ 0) : C1 .g(n) ≤ f (n) ≤ C2 .g(n); (∀n ≥ n0 )

On note f (n) = Θ(g(n))


exemple : (n + 1)2 = Θ(n2 )

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 18 / 25


Ordre de grandeur et Notation O

Proposition
Réflexivité :
• f (n) = O(f (n))
• f (n) = Ω(f (n))
• f (n) = Θ(f (n))
Transitivité :
• f (n) = O(g(n)) et g(n) = O(h(n)) =⇒ f (n) = O(h(n))
• f (n) = Ω(g(n)) et g(n) = Ω(h(n)) =⇒ f (n) = Ω(h(n))
• f (n) = Θ(g(n)) et g(n) = Θ(h(n)) =⇒ f (n) = Θ(h(n))
Symétrie :
• f (n) = Θ(g(n)) ⇐⇒ g(n) = Θ(f (n))
(Symétrie transposée :
• f (n) = O(g(n)) ⇐⇒ g(n) = Ω(f (n))

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 19 / 25


Ordre de grandeur et Notation O

Ordre de grandeur et temps d’exécution

Nous l’avons dit, la détermination de la complexité algorithmique ne


permet pas d’en déduire le temps d’exécution mais seulement de
comparer entre eux deux algorithmes résolvant le même problème.

La lecture de ce tableau est édifiante : on comprend que les


algorithmes ayant une complexité supérieure à une complexité
quadratique soient en général considérées comme inutilisables en
pratique (sauf pour de petites voire très petites valeurs de n).

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 20 / 25


Ordre de grandeur et Notation O

Ordre de grandeur et temps d’exécution

Voici une liste des complexités utilisées en algorithmique classées par


ordre de croissance de la plus lente à la plus rapide.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 21 / 25


Ordre de grandeur et Notation O

Exercice : Pour vous familiariser avec ces notions, évaluez pour


chacune des fonctions suivantes le temps d’exécution en fonction de n.

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 22 / 25


les Types de complexité

1 + 9 × (1 + 1 + 2 + 3 + · · · + (n − 1))
9n(n − 1)
= 10 +
2
1
= (9n2 − 9n + 20).
2

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 23 / 25


Complexité des fonctions récursives

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 24 / 25


la complexité spatiale

Mirrane Achraf (CPGE) Complexité algorithmique septembre 2022 25 / 25

Vous aimerez peut-être aussi