Conception d`Algorithmes – Cours 1. Introduction

publicité
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Conception d'Algorithmes Cours 1.
Introduction
Mario Valencia
e-mail : [email protected]
27/01/2017
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License.
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Informations pratiques
•
Mes coordonnées :
•
•
•
•
Mario VALENCIA
•
Volume (prévu) :
E-mail : [email protected]
Bureau : A-112 (bât. A, 1er étage)
http://www-lipn.univ-paris13.fr/
~valencia/teaching/ConceptionAlgo/
Page du cours :
•
•
cours : 1h30/semaine (13 séances)
TD : 3h/semaine (2 groupes, 13 séances) ;
•
Les supports de cours seront disponibles à l'adresse ci-dessus ;
•
Évaluation en continu : Sup( 2 , ( 1
P P
+ P2 )/2)
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
L'algorithmique
•
•
•
L'objet de ce cours est l'algorithmique ;
L'algorithmique est l'étude des algorithmes ;
Un algorithme est une méthode permettant de résoudre un
problème donné en un temps ni ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Développement de logiciels
•
Un algorithme n'est pas un programme !
•
l'algorithme décrit une méthode qui sera ensuite implémentée
dans un langage de programmation ;
•
Le développement d'un programme se divise en plusieurs
phases :
•
L'algorithmique se situe au niveau conceptuel ;
•
En pratique, les choses sont souvent plus compliquées ...
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
L'algorithmique
•
En algorithmique, on veut expliquer (à un ordinateur)
comment résoudre ecacement un problème ;
•
Remarquons que certains problèmes sont évidents pour un
humain, moins pour un ordinateur ;
•
Exemple simple : où est la case rouge ?
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Méthodologie
•
Il n'existe pas d'algorithme pour créer des algorithmes ;
•
Cela dit, il existe quelques principes généraux que l'on peut
suivre ;
•
Ce Cours et ses TDs vous serviront à acquérir ces principes ;
•
Les tâches à accomplir étant parfois complexes, il est
important de les décomposer et d'établir un plan à suivre ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Méthodologie : sous-problèmes
•
Principe : on découpe une tâche complexe en tâches plus
simples ;
•
Exemple : créer un réseau social (Facebook, etc.) :
•
•
•
•
stocker et sauvegarder les données ;
représenter les utilisateurs et leurs attributs ;
interface ;
gestion de la vie privée ;
...
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Sujets traités dans ce cours
•
Un algorithme doit résoudre de manière ecace le problème
donné, quelles que soient les données à traiter ;
•
On s'intéresse principalement à deux aspects d'un algorithme
donné :
1. sa correction : résout-il bien le problème donné ?
2. son ecacité : en combien de temps et avec quelles
ressources ?
•
On verra :
•
•
comment concevoir des algorithmes ;
comment démontrer leur correction et analyser leur ecacité ;
Informations pratiques Introduction Complexité algorithmique La notation
Référence
•
La référence suivante peut vous être utile :
O (·)
Classification(s) Base
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Motivation
•
On veut qu'un algorithme soit correct, mais aussi
c'est-à-dire :
•
•
•
ecace
rapide (en termes de temps d'exécution) ;
économe en ressources (espace de stockage, mémoire utilisée) ;
On a donc besoin d'outils qui nous permettront d'évaluer la
qualité théorique des algorithmes proposés ;
•
,
On se focalisera dans un premier temps sur le temps
d'exécution ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Exemple : deux méthodes de recherche dans les tableaux
ordonnés
Voici deux méthodes vériant si un élément appartient à un
tableau :
Version courte
Version longue
Bool f(T , x ){
i =0;
while (i <n ){
if T [i] == x
return True ;
i ++;
}
return False ;
}
Bool g(T , x , a =0 , b=n -1){
if a > b
return False ;
p = (a + b) / 2;
if T[p ] == x
return True ;
if T[p ] > x
return g(T , x , a , p -1);
return g(T , x , p +1 , b );
}
Laquelle choisir ?
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Exemple : deux méthodes de recherche dans les tableaux
La mesure du temps d'exécution en pratique nous aide :
... mais ne nous dit pas
pourquoi
l'une est meilleure que l'autre.
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Théorie de la complexité
•
La théorie de la complexité (algorithmique) vise à répondre à
ces besoins ;
•
Elle permet :
1. de classer les problèmes selon leur diculté ;
2. de classer les algorithmes selon leur ecacité ;
3. de comparer les algorithmes résolvant un problème donné an
de faire un choix éclairé sans devoir les implémenter ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Évaluation de la rapidité d'un algorithme
•
On ne mesure pas la durée en heures, minutes, secondes, ... :
1. cela impliquerait d'implémenter les algorithmes qu'on veut
comparer ;
2. de plus, 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 abstraites
proportionnelles au nombre d'opérations eectuées ;
•
Au besoin, on pourra ensuite adapter ces quantités en fonction
de la machine sur laquelle l'algorithme s'exécute ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Calcul du temps d'exécution
•
Chaque
instruction basique
consomme une unité de temps ;
(aectation d'une variable, comparaison,
•
Chaque
itération
+, −, ∗, /,
...)
d'une boucle rajoute le nombre d'unités de
temps consommées dans le corps de cette boucle ;
•
Chaque
appel de fonction
rajoute le nombre d'unités de
temps consommées dans cette fonction ;
•
Pour avoir le nombre d'opérations eectuées par l'algorithme,
on additionne le tout ;
Informations pratiques Introduction Complexité algorithmique La notation
Exemple : calcul de la factorielle de
•
L'algorithme suivant calcule
(avec 0!
= 1)
O (·)
Classification(s) Base
n∈N
n! = n ∗ (n − 1) ∗ (n − 2) ∗ · · · ∗ 2 ∗ 1
:
int factorielle(n){
initialisation : 1
fact = 1 ;
initialisation : 1
i = 2;
while i <= n{
itérations : au plus
fact = fact * i ;
i = i + 1 ;}
n−1
multiplication + aectation : 2
addition + aectation : 2
return fact ;}
renvoi d'une valeur : 1
•
On a aussi un test à chaque itération ;
•
Nombre total d'opérations :
1
+ 1 + ( n − 1) ∗ 5 + 1 + 1 = 5n − 1
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Remarques
•
Ce genre de calcul n'est pas tout à fait exact ;
•
En eet, on ne sait pas toujours combien de fois exactement
on va eectuer une boucle ;
•
De même, lors d'un branchement conditionnel, le nombre de
comparaisons eectuées n'est pas toujours le même ;
•
par exemple, si
inutile puisque
•
a est faux dans le test a ∧ b, alors évaluer b est
a ∧ b sera toujours faux ;
Heureusement, on dispose d'outils plus simples à manipuler et
plus adaptés ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Complexité algorithmique
•
La complexité d'un algorithme est une mesure de sa
performance asymptotique dans le pire cas ;
•
Que signie asymptotique ?
,→
on s'intéresse à des données très grandes ;
•
pourquoi ?
,→
•
les petites valeurs ne sont pas assez informatives ;
Que signie dans le pire cas ?
,→
on s'intéresse à la performance de l'algorithme dans les
situations où le problème prend le plus de temps à résoudre ;
•
pourquoi ?
,→
on veut être sûr que l'algorithme ne prendra jamais plus de
temps que ce qu'on a estimé ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Intuition : comportement asymptotique
•
Soit :
1. un problème à résoudre sur des données de taille
n, et
f1 (n) et
2. deux algorithmes résolvant ce problème en un temps
f2 (n), respectivement ;
•
Quel algorithme préférez-vous ?
•
La courbe verte semble correspondre à un algorithme
beaucoup plus ecace ...
•
... mais seulement pour de très petites valeurs !
Informations pratiques Introduction Complexité algorithmique La notation
La notation
•
O (·)
Classification(s) Base
O (·) : motivation
Les calculs à eectuer pour évaluer le temps d'exécution d'un
algorithme peuvent parfois être longs et pénibles ;
•
De plus, le degré de précision qu'ils requièrent est souvent
inutile ;
•
On aura donc recours à une approximation de ce temps de
calcul, représentée par la notation
O (·) ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Notation
•
n la taille des données à traiter ; on dit qu'une fonction
f (n) est en O (g (n)) (en grand O de g (n)) si :
Soit
n0 ∈ N, ∃ c ∈ R+ , ∀ n ≥ n0 :
|f (n)| ≤ c |g (n)|.
Autrement dit : f (n ) est en O (g (n )) s'il existe un seuil à partir
duquel la fonction f (·) est toujours dominée par la fonction
g (·), à une constante multiplicative xée près ;
Exemple : quelques cas où f (n ) = O (g (n ))
∃
•
•
Informations pratiques Introduction Complexité algorithmique La notation
Exemples d'utilisation de
•
O (·)
Classification(s) Base
O (·)
f n) = 5n + 37 est en O (n) :
Prouvons que la fonction 1 (
1. but : trouver une constante
duquel
c ∈ R+ et un seuil n0 ∈ N à partir
|f1 (n)| ≤ c |n|.
| n + 37| ≤ |6n|
2. on remarque que 5
si
n ≥ 37 :
|5 ∗ 37 + 37| ≤ 6 ∗ |37| ;
|5 ∗ 38 + 37| ≤ 6 ∗ |38| ;
.
.
.
3. on en déduit donc que
n0 = 37, et on a ni.
•
c = 6 fonctionne à partir du seuil
Remarque : on ne demande pas d'optimisation (le plus petit
ou
n0 qui fonctionne), juste de donner des valeurs qui
fonctionnent ;
•
c = 10 et n0 = 8 est donc aussi acceptable ;
c
Informations pratiques Introduction Complexité algorithmique La notation
Exemples d'utilisation de
•
O (·)
Classification(s) Base
O (·)
f n) = 6n2 + 2n − 8 est en O (n2 ) :
Prouvons que la fonction 2 (
1. cherchons d'abord la constante
essayons donc
c = 7;
n0 ∈ N à partir duquel :
|6n + 2n − 8| ≤ 7|n2 |
∀ n ≥ n0 ;
4
un simple calcul nous donne n1 = − et n2 = 1 comme
3
2
racines de l'équation 6n + 2n − 8 = 0 ;
en conclusion, c = 7 et n0 = 1 nous donnent le résultat voulu ;
2. on doit alors trouver un seuil
2
3.
4.
c ; c = 6 ne peut pas marcher,
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Règles de calcul : simplications
•
On calcule le temps d'exécution comme avant, mais on
eectue les simplications suivantes :
1. on oublie les constantes multiplicatives (elles valent 1) ;
2. on annule les constantes additives ;
3. on ne retient que les termes dominants ;
Exemple : simplication Soit un algorithme eectuant
g (n) = 4n3 − 5n2 + 2n + 3 opérations ;
1. on remplace les constantes multiplicatives par 1 :
n 3 − 1n 2 + 1n + 3
1
2. on annule les constantes additives :
3. on garde le terme de plus haut degré :
et on a donc
g (n) = O (n3 ).
n3 − n2 + n + 0
n3 + 0
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Justication des simplications
•
Les processeurs actuels eectuent plusieurs milliards
d'opérations à la seconde ;
1. qu'une aectation requière 2 ou 4 unités de temps ne change
donc pas grand-chose ;
,→
d'où le remplacement des constantes par des 1 pour les
multiplications
2. un nombre constant d'instructions est donc aussi négligeable
par rapport à la croissance de la taille des données ;
,→
d'où l'annulation des constantes additives
3. pour de grandes valeurs de
n, le terme de plus haut degré
l'emportera ;
,→
•
d'où l'annulation des termes inférieurs
On préfère donc avoir une idée du temps d'exécution de
l'algorithme plutôt qu'une expression plus précise mais
inutilement compliquée ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Règles de calculs : combinaison des complexités
•
•
Les instructions de base prennent un temps constant, noté
O(1)
;
On additionne les complexités d'opérations en séquence :
O (f1 (n)) + O (f2 (n)) = O (f1 (n) + f2 (n))
•
Même chose pour les branchements conditionnels :
Exemple
if <condition>
# instructions (1)
else
# instructions (2)
O (g (n))

O (f1 (n)) = O (g (n) + f (n) + f (n))

1


O (f2 (n))
2
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Règles de calculs : combinaison des complexités
•
Dans les boucles, on multiplie la complexité du corps de la
boucle par le nombre d'itérations ;
•
La complexité d'une boucle
Exemple :
en supposant qu'on a
while
se calcule comme suit :
m
itérations
while <condition>
# instructions
O (g (n))
O (f (n))
= O (m ∗ (g (n) + f (n)))
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Calcul de la complexité d'un algorithme
•
Pour calculer la complexité d'un algorithme :
1. on calcule la complexité de chaque partie de l'algorithme ;
2. on combine ces complexités conformément aux règles qu'on
vient de voir ;
3. on simplie le résultat grâce aux règles de simplications qu'on
a vues ;
•
•
élimination des constantes, et
conservation du (des) terme(s) dominant(s)
Informations pratiques Introduction Complexité algorithmique La notation
Exemple : calcul de la factorielle de
•
O (·)
Classification(s) Base
n∈N
Reprenons le calcul de la factorielle, qui nécessitait 5
n−1
opérations :
Exemple : factorielle de
n
int factorielle(n){
initialisation :
i = 2;
while i <= n{
fact = fact * i ;
i = i + 1 ;}
return fact ;}
•
O (1)
O (1)
n − 1 itérations : O (n)
multiplication :
O (1)
incrémentation : O (1)
renvoi :
O (1)
initialisation :
fact = 1 ;
Complexité de la procédure :
O (1) + O (n) ∗ O (1) + O (1) = O (n)
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Équivalence de fonctions en termes de
•
•
•
Classification(s) Base
O (·)
f (n) = O (g (n)) n'implique pas g (n) = O (f (n)) :
n + 43 = O (n2 ), mais n2 6= O (n) ;
•
contre-exemple : 5
•
contre-exemple : 18
f (n) 6= O (g (n)) n'implique pas g (n) 6= O (f (n)) :
n3 − 35n 6= O (n), mais n = O (n3 ) ;
On dit que deux fonctions
f (n) et g (n) sont équivalentes si
f (n) = O (g (n)) et g (n) = O (f (n))
•
D'un point de vue algorithmique, trouver un nouvel algorithme
de même complexité pour un problème donné ne présente donc
pas beaucoup d'intérêt ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Quelques classes de complexité
•
On peut donc ranger les fonctions équivalentes dans la même
classe ;
•
Voici quelques classes fréquentes de complexité (par ordre
croissant en termes de
O (·)) :
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Autres notations
•
n la taille des données à traiter ; on dit qu'une fonction
f (n) est en Ω(g (n)) (en Omega de g (n)) si :
Soit
∃
•
n0 ∈ N, ∃ c ∈ R+ , ∀ n ≥ n0 :
Autrement dit :
|f (n)| ≥ c |g (n)|.
f (n) est en Ω(g (n)) s'il existe un seuil à partir
f (·) toujours domine la fonction g (·), à une
duquel la fonction
constante multiplicative xée près ;
•
f (n) est en Θ(g (n)) (en Thêta de
g (n)) si : f (n) est en O (g (n)) et f (n) est en Ω(g (n)).
On dit qu'une fonction
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Temps de calcul en pratique
•
Voici un tableau qui permet de mieux se rendre compte de
l'importance de la croissance de ces fonctions en pratique :
(source : Steven Skiena, The Algorithm Design Manual )
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Hiérarchie
•
Pour faire un choix éclairé entre plusieurs algorithmes, il faut
être capable de situer leur complexité ;
•
On fait une première distinction entre les deux classes
suivantes :
1. les algorithmes dits polynomiaux, dont la complexité est en
O (nk ) pour un certain k ;
2. les algorithmes dits exponentiels, dont la complexité ne peut
pas être majorée par une fonction polynomiale ;
•
De même :
1. un problème de complexité polynomiale est considéré facile ;
2. sinon (complexité non-polynomiale ou inconnue ( !)) il est
considéré dicile ;
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Résolution d'équations de récurrence linéaires
Commençons par rappeler la méthode de résolution des récurrences
linéaires homogènes à coecients constants. Il s'agit d'équations du
type :
où les
(tn )
ti
a0 tn + a1 tn−1 + . . . + ak tn−k = 0
sont les valeurs que l'on cherche (la suite mathématique
) et les
Soient
ai
sont des constantes.
r1 , . . . , rl
les zéros (distincts) de multiplicité
m1 , . . . , ml
respectivement de l'équation caractéristique,
a0 x k + a1 x k −1 + . . . + ak = 0
correspondant à cette récurrence. La solution générale est alors de
la forme
tn =
l m
i −1
X
X
i =1 j =0
cij nj rin
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Résolution d'équations de récurrence linéaires (2)
Récurrences linéaires non homogènes de la forme :
a0 tn + a1 tn−1 + . . . + ak tn−k = bn p(n),
où
b est une constante et p(n) un polynôme en n de degré d . Son
polynôme caractéristique est
(a0 x k + a1 x k −1 + . . . + ak )(x − b)d +1 .
Note : Une combinaison linéaire générale de solutions n'est plus
nécessairement une solution : il faut la réinjecter dans la récurrence,
ce qui précise certaines constantes.
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Résolution d'équations de récurrence linéaires (3)
Exemple 1
tn =
(
tn =
(
1
si
n=0
tn−1
sinon
Polynôme caractéristique : (x − 4)(x − 2).
n
n
Solution : c1 4 + c2 2 , et donc, c1 = 0 et c2 = 1. Finalement,
tn = 2n . On a que tn ∈ Θ(2n ).
4
− 2n
Exemple 2
1
si
n=0
tn−1 + n sinon
2
Polynôme caractéristique : (x − 4)(x − 2) .
n
n
n
Solution : c1 4 + c2 2 + c3 n 2 , . . . et donc, c1 = 3 et c2 = −2 et
c3 = −1. Finalement, tn = 3.4n − 2n (n + 2). On a que tn ∈ Θ(4n ).
4
n
2
Informations pratiques Introduction Complexité algorithmique La notation
O (·)
Classification(s) Base
Résolution d'équations de récurrence linéaires (4)
Généralisation supplémentaire : De la même façon, une récurrence
de la forme
a0 tn + a1 tn−1 + . . . + ak tn−k = b1n p1 (n) + b2n p2 (n) + . . . ,
où les
degré
bi sont des constantes et les pi (n) des polynômes en n de
di respectivement ont pour polynôme caractéristique :
(a0 x k + a1 x k −1 + . . . + ak )(x − b1 )d1 +1 (x − b2 )d2 +1 . . . .
Téléchargement