4 Aalyse d algorithmes IFT015 Miklós Csűrös 9 septembre 016 4.1 Complexité d algorithmes O veut compredre l efficacité d u algorithme pour ue tâche quelcoque : o caractérise les ressources (temps, mémoire) écessaires pour l exécutio. usage de mémoire ou «complexité d espace» (space complexity) : c est le mémoire de travail écessaire à part de stocker l etrée même. temps d exécutio ou «complexité de temps» (time complexity) : c est le temps d exécutio das u modèle formel de calcul. 4. Notatio asymptotique Typiquemet, la complexité est caractérisée e otatio asymptotique, comme ue foctio de la taille de l etrée. Ceci permet de compredre et de prédire le comportemet de l algorithme. O utilisera «presque tout» das u ses bie défii : «presque tout» veut dire qu il y a juste u ombre fii (même aucue) d exceptios. (fr) (fr) Défiitio 4.1. Soit f et g deux foctios sur les ombres etiers telles que f(), g() > 0 pour presque tout. [grad O] f = O(g) si et seulemet si [ssi] c > 0: tel que f() g() c pour presque tout. [grad Omega] f = Ω(g) ssi ou c > 0: tel que f() g() c pour presque tout (doc g = O(f)) [Theta] f = Θ(g) ssi f = O(g) et g = O(f), ou c, c > 0 tels que y y=f()/g() À l'exceptio d'u ombre fii de poits, c f()/g() c' c' c [petit o] f = o(g) ssi lim f()/g() = 0, ou c > 0, f() g() c pour presque tout ) f() [tilde] f g ssi lim g() (1 = 1, ou f() = ± o(1) g() Modèles équivalets. La otatio asymptototique permet d éocer des résultats qui e dépedet pas de l implatatio cocrète d u algorithme. E particulier, la taille de l etrée peut être mesurée e bits, octets, ou d autres mesures covéiets (ombre d élémets das ue collectio), il faut juste assurer qu ue etrée de taille t peut être represetée sur Θ(t) bits. E plus, les istructio d u modèle de calcul s exécutet e Θ(1) sur u autre modèle de puissace équivalete (p.e., CPUs moderes sot équivalets à ue machie 4.1
RAM). Par coséquece, si o trouve qu u algorithme pred O() sur u tableau de taille, le résultat reste valide das des implatatios, idépedammet de CPU, lagage de programmatio, ou ecodage du tableau. T Exceptios à f() c g() T=c g() T=f() Il existe des défiitios équivaletes : par exemple, f() = O(g()) si et seulemet s il existe c > 0 et N 0 tels que f() c g() pour tout N. E gééral, ue propositio P() vaut pour presque tout, ssi il existe N < tel que P() vaut pour tout N. N 4..1 Règles d arithmétique Les equatios suivates sot valides avec O, Θ, Ω, et o. c f = O(f) O(f) + O(g) }{{} = O(f + g) }{{} pour tout h = O(f) et h = O(g) il existe h = O(f + g) t.q. h + h = h O(f) O(g) = O(f g) (4.1a) (4.1b) (4.1c) 4.. Quelques foctios otables Logarithmes. lg x = log x et l x = log e x {x > 0} log(xy) = log x + log y; log(x a ) = a log x lg = ; = lg ; log a = lg = Θ(lg ) lg a ; alg = lg a Das la otatio asymptotique, o e motre pas la base du logarithme parce qu avec ue base différete, o chage seulemet la facteur costate (log a f = c log b f avec c = log a b = 1/ log b a) : au lieu de O(log 10 ) ou O(l ), o écrit simplemet O(log ). Nombre harmoique. H = 1 + 1 + 1 3 + 1 l + γ = ( 1 + o(1) ) l = Θ(log ) où γ = lim (H l ) = 0.577 est la costate d Euler. ( ) Nombres Fiboacci. F () = 5 1 + o(1) φ = Θ(φ ) avec φ = (1 + 5)/. (fr) 4.
Factorielle.! = 1. Approximatio de Stirlig :! = ( 1 + o(1) ) π( e ) = Θ ( +1/ e ). Même si par itutio semble domier l expressio, o doit reteir tout exposat de das u terme quad o simplifie vers Θ. Par cotre, k=1 l k = l(!) = ( 1 + o(1) ) l, doc log(!) = Θ( log ). 4.3 Détermier le temps de calcul Algorithme sas récurrece. O peut exploiter les règles d arithmétique directemet das l aalyse du pseudocode. Pour établir le temps de calcul f, o examie le code et additioe le coût de chaque istructio. O sépare f par ses termes (règle (4.1b)), et o igore les facteurs costates (règle (4.1a)). Exemple 4.1. O pred l exemple de rechercher le maximum das u tableau. x[0.. 1] MAX-ITER M1 iitialiser max M for i 0,..., 1 do M3 if x[i] > max the max x[i] M4 retur max Le temps de calcul pour u tableau de taille est T () = + + + = O(). Exemple 4.. L algorithme d Euclide (v. 1.6, Note 1) est importat das des applicatios cryptographiques, où o calcule avec des etiers de grade taille (par exemple, 048 bits). La taille de l etrée est doc mesurée das le ombre de bits pour représeter les paramètres : lg a + lg b. GCD(a, b) // {b a} E1 while (b = 0) E c a mod b E3 a b; b c E4 retur a m(a,b) O(log b) Il faut cosidérer le coût de divisio etière ( mod ) : Lige E pred m(a, b) = O ( (log a)(log b) ) temps. Théorème 1. motre que le ombre d itératios est boré par O(log b) (o cherche le ombre Fiboacci F (k) b < F (k+1) ; doc k = log φ b + = O(log b)). Par coséquece, l algorithme d Euclide s exécute e T (a, b) = + O(log b) ( ) O(log a log b) + = O(log b log a) temps, doc e temps polyomial das la taille de l etrée, même pour des etiers très grads. Algorithme récursif. o cherche sa solutio. O commece par exprimer le temps de calcul par ue équatio de récurrece, et Exemple 4.3. O pred l exemple de rechercher le maximum das u tableau. MAX-REC x[0.. 1],i) // appel iitiel avec i =0 R1 if i = the retur R else R3 m MAX-REC x, i +1 R4 if x[i] >mthe retur x[i] R5 else retur m T(0)= T( j-1) 4.3
Soit T (j) le temps de calcul pour exécuter MAX-REC(x[0.. 1], j). O a la récurrece { si j = 0 T (j) = T (j 1) + si j > 0 (4.) Pour démotrer que la solutio de la récurrece est T (j) = O(j), o utilise ue preuve par iductio. Par Équatio (4.), il existe a tel que T (j) T (j 1)+a pour tout j > 0. Soit c = T (0)+a. Hypothèse d iductio : T (j) c j pour u j > 0. Cas de base : l hypothèse d iductio vaut pour j = 1. Cas iductif : T (j) T (j 1) + a c(j 1) + a cj (car c = T (0) + a > a). O coclut que T (j) cj pour tout j > 0, d où T (j) = O(j). Substitutio de variables. Exemple 4.4. O pred l exemple du calcul de puissaces. O veut calculer x où 0 est u etier o-égatif et x R. La clé à ue solutio efficace est la récurrece suivate 1 { = 0} x = x / x / { > 0, est pair} x x / x / { > 0, est impair} P1 Algo POWER(x, ) P if = 0 the retur 1 P3 else ( P4 y POWER x, P5 P6 ) // (calcule x, etier) if mod = 0 the retur y y else retur x y y Ceci mèe à la récurrece T () = T ( ) + pour > 0. O trouve la solutio par substitutio de variables : o regarde le ombre de bits das la représetatio biaire de. Si o déote ce ombre par b, o a la récurrece T (b) = T (b 1)+ avec la solutio T (b) = O(b) (v. Exemple 4.3). Or, b = lg(+1) = O(log ), doc T () = T ( O(log ) ) = O(log ), doc reste liéaire das la taille b même pour des etiers très grads. 4.4 Aspects pratiques La otatio asymptotique classique (O, Θ, Ω) est préferée das la descriptio théorique de l efficacité d algorithmes et de structures de doées. Si u algorithme est de O( ), o sait que même das le pire cas, il va predre u temps quadratique das la taille du problème. Mais e pratique, o voudrait prédire le comportemet de l algorithme sur des etrées typiques (et o pas seulemet le pire cas). O voudrait aussi savoir u peu plus sur les costates cachées par O, pour pouvoir choisir etre deux algorithmes de O( ). Par exemple, le tri rapide (quicksort) pred O( ) das le pire cas, mais il est e gééral préférable au tri par fusio (mergesort) qui est de Θ( log ) parce que quicksort pred Θ( log ) pour presque toute etrée, et les costates cachées sot plus petites qu e mergesort. 4.4.1 Temps de calcul comme coût Afi de développer ue caractérisatio d utilité pratique, o procède comme suit. 1. Développer u modèle de l etrée et défiir la otio de la «taille» de l etrée. Le modèle doit permettre la géératio de doées à l etrée pour mesurer la performace d ue implatatio sur l ordiateur.. Idetifier la partie du code le plus fréquemmet exécutée (qui domie la croissace du temps de calcul). Pour u algorithme itératif, cette partie est à l itérieur de la boucle le plus profodemet imbriquée. 4.4
3. Défiir u modèle de coût pour le temps de calcul. E particulier, o veut écrire le temps de calcul avec le coût d opératios typiques das le cotexte du problème. Exemples d opératio typique : comparaiso de deux élémets lors du tri d u fichier, accès à ue cellule das u tableau, ou ue opératio arithmétique (algorithme d Euclid, expoetiatio). 4. Détermier la fréquece d exécuter les opératios typiques e foctio de la taille de l etrée. Exemple. O pred l exemple de chercher le maximum das u tableau par itératio sur les élémets (Exemple 4.1). (1) O mesure la taille de l etrée par le ombre de ses élémets et o assume que les élémets sot das u ordre quelcoque (= permutatio au hasard, uiformemet distribuée). () La boucle itérieure cotiet la comparaiso «if x[i] > max the max x[i]». (3) O caractérise le temps de calcul par la fréquece de comparaisos (x[i] > max). (4) La boucle s exécute ( 1) fois quad > 0. E coclusio, l algorithme fait C() comparaisos arithmétiques pour u tableau de taille. 4.4. Mesurer et prédire le temps de calcul L avatage de la otatio tilde est qu elle exprime u hypothèse scietifique sur le comportemet de l algorithme qu o peut tester empiriquemet. E particulier, o peut implater l algorithme, géérer des etrées de tailles différetes, et mesurer le temps ou explicitemet compter la fréquece d exécutio d opératio typiques. Mesurer le temps de calcul. Le temps d exécutio peut être mesuré : das le code (Java) :... log T0 = System.curretTimeMillis(); // temps de début... log dt = System.curretTimeMillis()-T0; // temps (ms) dépassé das le shell (Liux/Uix) % time java -cp Mojar.jar mabelle.applicatio 0.83u 0.06s 0:00.35 85.7% 0+0k 0+53io 0pf+0w temps CPU («user time») temps CPU («kerel time») temps d'exécutio (secods) temps réel («wallclock time») utilisatio du CPU ou bie das u eviroemet de développemet de logiciel (Netbeas, Eclipse). Coceptio d expérieces. Das ue étude empirique, o veut performer plusieurs mesures. (1) O répète l expériece pour etrées différetes de même taille. La moyee motre le comportemet typique, et les répétitios permettet de compredre la dispersio statistique du temps de calcul. () O répète l expériece pour etrées de taille différete. Il est particulièremet utile de cosidérer des tailles multipliées par la même facteur ( ou 10). Si o a l hypothèse que le temps de calcul est T () a b, avec des costates quelcoques a, b > 0, o a T () T () a()b a b = b. (4.3) 4.5
E fait, Equatio (4.3) permet de déduire b par régressio liéaire même si o e le sait pas. O a log T () a + b log, et doc o peut détermier b par la pete das u répère log-log. À gauche : temps d éxécutio d u algorithme avec T (N) an 3. Les mesures servet aussi à prédire (par extrapolatio) le temps de calcul de l implatatio examiée pour des etrées de grade taille. 4.4.3 Usage de mémoire e Java L usage de mémoire par u programme Java peut varier avec la plate-forme, mais e gééral, o peut assumer 4 octets pour it et float, 8 octets pour log et double, aisi que pour les objets (adressage 64-bit). Tableau avec élémets : a + t octets où a = 16..4 est la taile de l e-tête et t est la taille d u élémet (référece ou type primitif). boolea byte char short it log float double référece 1 1 4 8 4 8 8 (adresse mémoire sur 64 bits) it =1000; Object x = ew MoObjet(); it[] T = ew it[]; Pile (stack) de variables locales x T valeur référece référece overhead (ifo sur classe, sycroisatio, ramasse-miette) variables d'istace arrodi à 8k octets etète Tas (heap) d'allocatio d'objets 16-4 octets 16 octets Object Iteger Node<Object> taille e octets (Java SE 1.6.0_51, 64 bits, MacOS) 4 4 4 40 paddig t octets 4.6