cours7Complexité(Part1)
cours7Complexité(Part1)
cours7Complexité(Part1)
Cours 7 ASD
2018-2019
Analyse d’un algorithme
L’analyse d’un algorithme permet de le juger sur la
base de plusieurs critères :
Est-ce qu'il fait ce qu'on lui demande de faire ?
(correction)
Est-ce qu’il le fait en un temps raisonnable
?(performance)
Ou encore:
Est-ce qu'il est muni d'une documentation expliquant
comment il fonctionne ?
Est-ce que le code est lisible ?
Étudier la complexité d'un algorithme fait partie
d'une démarche globale d'analyse et de mesure
des performances d'un algorithme.
2
Théorie de la complexité
La théorie de la complexité (algorithmique) a pour
objectifs de :
évaluer les performances des algorithmes
classer les algorithmes selon leur efficacité
comparer les algorithmes résolvant un problème donné
et de choisir le plus adéquat sans avoir besoin de les
implémenter
3
Analyse de la complexité
L’analyse de la complexité revient à quantifier les
2 grandeurs physiques :
4
Complexité d’un programme
L'efficacité d'un algorithme peut être évaluée à
travers l’implémentation sur ordinateur d’un
programme correspondant.
Le programme va s'exécuter en un temps fini et
va forcément mobiliser des ressources pendant
son exécution.
Le complexité d'un programme est définie à
travers :
la quantité de mémoire nécessaire à son exécution
complexité spatiale
la quantité de temps nécessaire pour son exécution du
début jusqu'à la fin complexité temporelle
5
Inconvénients
Les mesures de performances étant dépendantes :
du processeur utilisé,
des temps d'accès à la mémoire vive et au disque
dur,
du langage de programmation,
de la qualité du code produit par le compilateur
utilisé,
etc.
6
Comment quantifier ?
Une approche indépendante de la machine sur laquelle
s’exécute l’algorithme et de la traduction de
l’algorithme en langage exécutable par la machine est
nécessaire pour évaluer l'efficacité des algorithmes.
7
Détermination de la
complexité temporelle d’un
algorithme
8
Complexité temporelle
On peut calculer la complexité selon les deux
paramètres "temps d'exécution" et "place
mémoire" pour comparer l'efficacité des
algorithmes
Cependant la complexité temporelle est la plus
utilisé pour comparer les algorithmes, c’est pour
cela que nous allons nous intéresser dans ce cours
uniquement à la complexité temporelle.
Dans la suite de ce cours, lorsqu’on parlera de
complexité, il s’agira de complexité temporelle.
9
Mesure de la complexité temporelle
La mesure de la complexité temporelle ne peut pas
s'appuyer sur une unité de temps (par exemple la
milliseconde) car ce genre d'unité est étroitement
lié aux caractéristiques techniques de
l'ordinateur.
En effet, il est important que l'unité utilisée
reflète la complexité de l'algorithme utilisé
indépendamment de la machine sur laquelle le
programme s'exécute
il faut donc utiliser des unités de temps
abstraites
Comment?
10
De quoi dépend la mesure de la complexité ?
A priori, on peut distinguer 2 facteurs
déterminants pour le calcul de la complexité en
temps d’un algorithme :
1. Une ou plusieurs opérations élémentaires
pertinentes par rapport au problème, au sens où
le temps d’exécution d’un algorithme résolvant
ce problème est toujours proportionnel au
nombre de ces opérations. On les désignera par
opérations fondamentales.
11
Taille des entrées
En pratique, pour évaluer la taille des données
d’un algorithme on choisit la ou les dimensions
les plus significatives.
Par exemple:
dans le cas de la recherche dans un tableau ou
le tri d’un tableau : la taille est le nombre
d’éléments du tableau,
dans le cas du produit de 2 matrices carrées :
la taille est la dimension de la matrice.
12
Détermination des opérations fondamentales
La nature du problème fait que certaines
opérations sont fondamentales et que leur
nombre intervient principalement dans l’étude de
la complexité de l’algorithme.
Exemple d’opérations fondamentales :
Pour la recherche d’un élément e dans un tableau :
le nombre de comparaisons entre l’élément e et
les entrées du tableau;
Pour le tri d’un tableau, on peut considérer 2
opérations fondamentales : le nombre de
comparaisons et le nombre de déplacements;
Pour la multiplication de 2 matrices : le nombre de
multiplications et le nombre d’additions.
13
Calcul du nombre d’opérations fondamentales
Après avoir déterminé les opérations fondamentales, il
faut compter le nombre d’opérations de chaque type.
14
Règle 1 : nombre d’opérations d’une séquence
Lorsque les opérations sont dans une séquence
d’instructions S, leur nombre s’ajoutent.
15
Règle 2 : nombre d’opérations d’une alternative
Comme il est difficile, voire impossible, de
déterminer la branche de l’alternative qui est
exécutée, la règle généralement adoptée consiste à
majorer le nombre d’opérations par le nombre
maximum d’opérations entre les 2 branches.
if condition I1 else I2
Alors :
TA = Tcondition + max (TI1,TI2)
16
Règle 3 : nombre d’opérations d’une boucle
Le nombre d’opérations dans la boucle est :
TI(i) avec,
i : variable de contrôle de la boucle
TI(i) : nombre d’opérations fondamentales
lors de l’exécution de la ième itération.
Pour évaluer les bornes de i, il faut connaître
le nombre d’itérations.
il doit être calculé à partir de l’algorithme. Ce
calcul peut s’avérer difficile. On se contente donc
d’un majorant.
17
Détermination de la complexité (1)
Nous allons analyser une fonction de recherche séquentielle
d’un double x dans un tableau v. Cette fonction renvoie le
rang i de x si xv et -1 si xv.
#define N 100
double v[N];
19
Exemple : Détermination de la complexité (3)
20
Détermination de la complexité
L’exemple d’analyse d’algorithme met en évidence
2 points essentiels :
1. Le choix du (ou des) l’opération(s) que l’on prend en
compte doit être établi avant toute analyse et précisé
dans le résultat.
2. La complexité dépend de la taille des données (ici N)
et, pour une taille fixée, des différentes entrées
possibles.
Dans le cas de l’exemple, pour les données de
taille N, la complexité en nombre de comparaisons
varie de 1 à N selon les données x et v :
Les données où x apparaît au rang i de v correspondent à
une complexité i,
Celles où x n’apparaît pas dans v, correspondent à une
complexité N.
21