Complexité ou Comment mesurer l'efficacité d'un algorithme Laurent Tichit - Licence GTSBD 1 Efficacité ? ● En temps ou en mémoire (stockage) ● Pourquoi ? – Savoir si la durée (ou la place mémoire) croît linéairement avec la taille des données en entrée. Ex : si je double la quantité de mémoire de mon ordinateur (ou la vitesse de traitement de son processeur) cela me permettra t-il de traiter des problèmes 2x plus gros ? – Comparer à d'autres algorithmes Laurent Tichit - Licence GTSBD 2 Temps d'exécution ● ● Sur certaines instances de vos algorithmes, mesurer les performances Besoin d'implémenter les algorithmes – ● ● attention : très dépendant du langage choisi Besoin de jeux de tests réalistes Utilisation de fonctions permettant de mesurer le temps d'exécution, la place mémoire – Attention : difficulté de savoir ce que ces fonctions mesurent exactement Laurent Tichit - Licence GTSBD 3 Comparer en pratique 2 algos ● implémenter les deux algorithmes ● dans le même langage ● en utilisant le même cadre de test (le même programme principal) ● calculer le temps passé entre le début et la fin de l'algorithme ● ne pas faire d'entrées-sorties ● utiliser le même ordinateur, ● la même disponibilité des ressources lors des exécutions ● le même jeu de test (entrées) ● faire plusieurs mesures, supprimer les extrêmes, moyenner. Laurent Tichit - Licence GTSBD 4 Somme des n premiers entiers ● V1, complexité constante ● V2, complexité linéraire ● Lire le code ● Exécuter Laurent Tichit - Licence GTSBD 5 Complexité ● But – déterminer l'efficacité d'un algorithme ● ● – déterminer l'efficacité d'un algorithme ● ● – – en temps d'exécution et espace mémoire dans le pire des cas en moyenne outil théorique indépendant de la programmation Laurent Tichit - Licence GTSBD 6 Complexité ● ● Comparer des algorithmes, indépendamment de leur implémentation : choix avant implémentation Déterminer comment l'algorithme évoluera en fonction de la taille des données à traiter : vérification de la faisabilité de l'implémentation Laurent Tichit - Licence GTSBD 7 Classes de complexité © Magali Contensin Laurent Tichit - Licence GTSBD 8 Classes de complexité - 2 © Magali Contensin Laurent Tichit - Licence GTSBD 9 Classes de complexité - 3 ● ● Classe de complexité = ordre d'idée du temps d'exécution en fonction de la taille des entrées Ex : n = 1000 ; CPU : 10⁶ opérations/s – – – – O(n) : 10-³ s O(n²) : 1 s O(n³) : ~15 min 2n : plusieurs siècles Laurent Tichit - Licence GTSBD 10 Détermination de la classe de complexité ● ● Dans le pire des cas (cas le plus étudié, en règle générale le plus facile à déterminer) : borne supérieure Comme seule la classe nous intéresse : – – – coût de chaque instruction de base (affectation, somme, produit, etc.) = 1 coût d'un branchement conditionnel = coût de la branche la plus coûteuse coût d'une boucle = coût du corps x nbre itérations Laurent Tichit - Licence GTSBD 11 Exemple ● Minimum d'un tableau de taille n min <- tab[0] i <- 0 Tant que i < n répéter si tab[i] < min min <- tab[i] i <- i + 1 coût: 2+ 1+ n * (1 +2 +1 +2) Complexité : 6n + 3 → O(n) Laurent Tichit - Licence GTSBD 12 Comportement asymptotique ● = quand n tend vers l'infini ● Borne supérieure de la complexité ● le « +3 » devient négligeable quand n croît ● notation de Landau O(n) ● La complexité de l'algorithme précédent est de l'ordre de O(n) Laurent Tichit - Licence GTSBD 13 Simplification de la fonction ● Supposons une complexité C calculée : C = 0.001 x 2n + 20n2 + 36n + 1380 Pour un n assez grand, 0.001 nx sera 2 2 + 36n + 1380 toujours supérieur à 20n ● ● En comparaison du premier terme, les autres sont négligeables n) C est donc de l'ordre de O(2 Laurent Tichit - Licence GTSBD 14 Exemple ● Somme desn premiers entiers : – version 1 : res <- 0 1+ res <- n*(n+1)/2 1+3 Complexité : 5 → O(1) Laurent Tichit - Licence GTSBD 15 Exemple - 2 – version 2 res <- 0 1+ i <- 0 1+ Tant que i<=n (n+1)* res = res+i (2+ i <- i+1 2) ● Complexité : 4n + 6 → O(n) Laurent Tichit - Licence GTSBD 16 Exercice ● ● Que calcule la fonction mystère (x est un réel, n un entier positif) fonction mystère (x, n) { r <- 1 ; pour i allant de 1 à n faire { r <- r * x ; } retourner r ; } Calculez sa complexité (pire des cas) Laurent Tichit - Licence GTSBD 17 Exercice ● ● Que calcule la fonction mystère2 (x est un réel, n un entier positif) fonction mystère2 (x, n) { si n = 0 alors retourner 1 ; sinon { r <- mystère2(x, n/2) ; # division entière !! r <- r * r ; si n est impair alors { r <- r * x ; } retourner r ; } } Calculez sa complexité (pire des cas) Laurent Tichit - Licence GTSBD 18 Complexités d'algos classiques ● http://bigocheatsheet.com/ ● http://en.wikipedia.org/wiki/Sorting_algorithm Laurent Tichit - Licence GTSBD 19