Algorithmes et complexité Complexité Combien de temps mon algorithme mettra-t-il pour résoudre un problème donné ? Pour résoudre une instance de taille n fixée. Combien d’espace mémoire faut-il prévoir ? Complexité d’un algorithme en temps = nombre d’instructions exécutées (ordre de grandeur) Problème et instance = fonction de n Problème général : tester si un nombre est premier en supposant que les instructions prennent un temps constant Problème particulier (instance) : tester si 494059397730 est premier Complexité en espace Une instance est caractérisée par sa taille = nombre de cellules mémoire utilisées (ordre de grandeur) Il y a différentes manières de définir la taille = fonction de n p.ex. taille(494059397730) = 494059397730 (linéaire) ou taille(494059397730) = 12 chiffres (logarithmique) G. Falquet, CUI, Université de Genève 1 de 14 G. Falquet, CUI, Université de Genève Exemple: résolution d’une équation 2 de 14 Exemple pn Trouver x tels que ax + b = 0 (a différent de 0) Avec a et b inférieurs à MAX { 1. 2. 3. 4. 5. x←–b/a } Nombre d’opérations arithmétiques effectuées : 2 Complexité en temps : constante r ← 1; s ← 0; tant que (s ≠ n) { r ← r * p; s ← s + 1; } // nombre d’itérations = n T(n) = k Temps effectif : dépend de la machine G. Falquet, CUI, Université de Genève 3 de 14 G. Falquet, CUI, Université de Genève 4 de 14 Nombre d’opérations exécutées 1. 2. 3. 4. 5. r ← 1; s ← 0; tant que (s ≠ n) { r ← r * p; s ← s + 1; Exemple pn bien amélioré 1 fois 1 fois n + 1 fois n fois n fois Observation : p2n = (pn)2 p2n+1 = (pn)2 . p1 en tout : 2 + (n+1) + 2n opérations = 3 + 3n opérations p26 = (p 13)2 1 multiplication où p13 = (p6)2 . p 2 multiplications 6 Si n est grand 3n >> 3 T(n) = environ k * 3n Le temps croît linéairement en fonction de n, indépendament de p. 3 2 où p = (p ) 1 multiplication où p3 = (p)2 . p 2 multiplications EN TOUT 6 multiplications (à la place de 25) Nombre d’étapes : log 2(n) À chaque étape 1 ou 2 multiplications ==> T(n) ≤ 2 . log 2(n) G. Falquet, CUI, Université de Genève 5 de 14 G. Falquet, CUI, Université de Genève Algorithme (récursif) 6 de 14 Cas de complexité On définit une fonction récursive À cause des instructions si et tant que Un algorithme ne suite pas toujours le même chemin pour résoudre un problème. fonction puissance(p, n) { si ( n = 0 ) retourne 1 sinon { y ← puissance(p, n/2) y←y*y si ( n mod 2 = 1) y ← y * p retourne y } } => Pour deux problèmes de taille n il peut exécuter des nombres différents d’opérations. => La complexité n’est pas constante pour un problème de taille n Exemple intuitif Pour un "processeur" humain, il est plus facile de trier la liste (2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) que la liste (34, 1, 101, 3, 8, 221, 14, 71, 6, 106, 93, 2, 88) Complexité : T(n) proportionnel à 2log2(n) Amélioration pour n = 1024 3x1024 / 2log2(1024) = 3072 / 20 = 153.6 fois plus rapide G. Falquet, CUI, Université de Genève 7 de 14 G. Falquet, CUI, Université de Genève 8 de 14 Définition des cas de complexité Impact pratique Pour un algorithme donné et un problème de taille n on distingue Mesurer si les ressources dont on dispose sont suffisante pour résoudre les problèmes auxquels on veut s’attaquer; Le meilleur des cas Calculer la taille maximum des problèmes qu’on peut attaquer étant donné les ressources dont on dispose. les données qui font que la complexité est minimale – pour certains algo de tri: liste déjà dans l’ordre – résoudre une équation dont tous les coefficients sont nuls Le pire des cas Algorithme Complexité en temps nombre maximum d’opération que peut faire l’algorithme — pour certains algo de tri: liste dans l’ordre inverse ou liste déjà triée Le cas moyen le nombre moyen d’opérations calculé sur tous les problèmes de taille n difficile à définir G. Falquet, CUI, Université de Genève 9 de 14 Taille maximum du problème que l’on peut résoudre en 1 seconde 1 minute 1 heure A1 n 1’000’000 60’000’000 3’600’000’000 A2 n log(n) 62746 2’801’420 133’378’000 A3 n2 1000 7745 60’000 A4 n3 100 391 1’532 A5 2n 19 25 31 G. Falquet, CUI, Université de Genève Impact sur l’interface utilisateur 10 de 14 Ordres de grandeur Le temps de calcul peut changer radicalement l’usage de la machine Difficile de calculer exactement le nombre d’instructions qui seront exécutées On s’intéresse à l’ordre de grandeur de ce nombre en fonction de n. Ex. vérifier l’orthographe d’un mot Notation O( f ) si T < 0.1 sec : vér ification possible "en direct" pendant qu’on tape le texte g(x) ∈ O( f ) si T > 0.1 sec : la vérification devient une opération à effectuer séparément s’il existe un n 0 et un c tels que g (x) ≤ c f(x) Ex. calcul d’une image en 3D dès que si T < 0.1 sec : animation (jeu vidéo) n ≥ n 0. si T < 1 sec : travail interactif sur une image (création d’images 3D, dessin) But : utiliser des fonctions f simples telles que si T plus grand : calcul différé (films d’animation réalistes calculés avec des "fermes de processeurs") G. Falquet, CUI, Université de Genève 1, n , n2, n 3, …, nk, 2n , log( n). 11 de 14 G. Falquet, CUI, Université de Genève 12 de 14 Graphiquement 3x 2 g ∈ O (x ) Quelques ordres de grandeur 2 2 4 g(x) = 1.2x + cos(x ) - log(x+1) + ... constante k ∈ O(1) linéaire ax + b ∈ O( x) quadratique ax 2 + bx + c ∈ O( x2) … polynômial ∀p n0 ∀a G. Falquet, CUI, Université de Genève 13 de 14 G. Falquet, CUI, Université de Genève a kxk + ak–1xk–1 + … + a 1x + a0 ∈ O( xk) xq ∈ O(2x) polynome < exponentielle] 2x ∉ O(xp) exponentielle toujours > polynôme log(n ) ∈ O(n ) logarithme < linéaire ax ∉ O(log(n)) linéaire toujours > logarithme 14 de 14