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