Nour-Eddine Oussous, Éric Wegrzynowski Analyse des boucles Pour Analyse des boucles Tant Que Analyse de schémas récursifs 1 : factorielle : Tours de Hanoï Principe général 1er octobre 008 Coût d une boucle pour Dans la boucle pour i v a r i a n t de a à b f a i r e ACTION(i ) f i n pour si f (i) désigne le coût de l exécution de ACTION(i), alors le coût de la boucle est c = f (i) Tri par insertion (algo) Données : un tableau A[1..n] d entiers But : trier le tableau A par ordre croissant Var. locales : i pour i v a r i a n t de à n f a i r e i n s e r e r (A,i ) f i n pour
Le coût de l algorithme dépend 1. de la taille n du tableau. du contenu du tableau 3. du coût des opérations élémentaires (échanges, comparaisons, accès) Nous nous intéressons 1. au nombre d échanges d éléments du tableau e(a, n),. au nombre de comparaisons d éléments du tableau c(a, n) En désignant par e (A, i) c (A, i) les nombres d échanges de comparaisons dans l action inserer(a,i), on a e(a, n) = c(a, n) = e (A, i) c (A, i) Comme on a vu que on a 0 = n 1 = 0 e(a, n) 0 e (A, i) i 1 1 c (A, i) i 1 n 1 i 1 = i = 1 c(a, n) n 1 i 1 = i = Tri par insertion (conclusion) Encadrements obtenus : 0 e(a, n) Θ(n) = n 1 c(a, n) Bornes des encadrements atteintes = Θ(n ) = Θ(n ) borne inférieure atteinte pour un tableau déjà trié borne supérieure atteinte pour un tableau trié dans l ordre inverse
s de sommes i = i = 1 = n n(n + 1) n(n + 1)(n + 1) 6 = Θ(n ) = Θ(n 3 ) Lien entre sommes intégrales Soient a b deux entiers. Soit f : [a, b] R une fonction croissante (resp. décroissante) continue sur [a, b]. Alors ( resp. b 1 f (i) +1 f (i) b a b a f (x)dx f (x)dx f (i) (1) +1 b 1 f (i) ) () Plus généralement pour k N, i k = Θ(n k+1 ) Si q 1 q i = qn+1 1 q 1 = Θ(q n ) Coût d une boucle tant que Dans la boucle en notant tant que C(x ) f a i r e ACTION(x ) f i n tant que x 0 la valeur initiale de la donnée x, x 1, x,..., x k les valeurs qu elle prend successivement à chaque étape, x k+1 la première valeur de la donnée pour laquelle C(x k+1 ) n est pas satisfaite, g(x i ) le coût de la condition C(x i ), f (x i ) le coût de l action ACTION(x i ), le coût de la boucle est c = k k+1 f (x i ) + g(x i ) Multiplication de deux entiers Le problème Données : a b deux entiers naturels But : calculer a b Plusieurs algorithmes variant selon les opérations élémentaires disponibles : 1. multiplication disponible : solution triviale. seule l addition des entiers est disponible : solution avec boucle pour (exercice) 3. addition division par deux des entiers disponibles.
Méthode égyptienne Calcul du produit de a = 67 par b = 1. t u v 67 1 0 134 10 67 68 5 67 536 335 107 1 335 1407 1407 opération en cours Les nombres à multiplier u 1 t := t + t, u := u/ u = 1 terminé suppression des lignes où u est pair somme des valeurs restantes dans la colonne t utilisation d une variable v pour le calcul de la somme u impair v := v + t 67 1 = 1407 Seules opérations utilisées :+ Multiplication égyptienne : algo Données : a b deux entiers naturels, b > 0 But : calculer a b Variables locales : t, u, v mult (a,b ) : t := a ; u : = b ; v : = 0 ; {t u + v = a b } tant que u > 1 f a i r e s i u i m p a i r a l o r s v := v + t ; f i n s i ; t := t + t ; u := u ; {t u + v = a b } f i n tant que {t u + v = a b, u = 1 } r e t o u n e r t + v ; on s intéresse au nombre d additions effectuées ce coût ne dépend que de b c(b) = nombre d additions pour multiplier par b À chaque étape du tant que une ou deux additions selon la parité de u meilleur des cas : 1 addition à chaque étape. C est le cas si b est une puissance de : b = p. Dans ce cas c(b) = p + 1 pire des cas : additions à chaque étape. C est le cas si b est une puissance de moins un : b = p 1. Dans ce cas c(b) = (p 1) + 1= p 1
1 : factorielle Dans tous les cas, si p 1 b p 1 on a p c(b) p 1 En tenant compte du fait que p = Θ(log (b)), on a c(b) = Θ(p) = Θ(log (b)) c algorithme est logarithmique en fonction de la valeur de b ou bien linéaire en fonction de la taille p de b f a c t (n) : s i n = 0 a l o r s f a c t := 1 sinon f a c t := n f a c t (n 1) f i n s i coût recherché = nbre de multiplications dépend de n c(n) = nbre de mult pour calculer n! Cas de base Cas récursif c(0) = 0 n 1 c(n) = 1 + c(n 1) c(n) = n rithme linéaire en la valeur de n rithme exponentiel en la taille de n : Tours de Hanoï Principe général H(n,D,A,I ) : s i n = 1 a l o r s d e p l a c e r de D v e r s A sinon H(n 1,D,I,A) ; d e p l a c e r de D v e r s A ; H(n 1,I,A,D ) ; f i n s i coût recherché = nbre de déplacements dépend de n c(n) = nbre de déplacements Cas de base Cas récursif c(1) = 1 n 1 c(n) = 1 + c(n 1) c(n) = n 1 rithme exponentiel en la valeur de n Schéma d analyse récursive Le coût d un algorithme récursif peut toujours s exprimer sous forme d une équation de récurrence. la résolution des équations de récurrence peut s avérer parfois délicate mais peut toujours être programmée