Approche naïve
function fois(m, n : integer) : integer; begin if (n = 0) then fois := 0 else if (n = 1) then fois := m else fois := fois(m, n - 1) + m; end;Exercice 1.1 : Calculer la complexité en nombre d'additions de cette fonction.
Approche ``Diviser pour régner''
function produit(m, n : integer) : integer; var f : integer; begin if (n = 0) then produit := 0 else if (n = 1) then produit := m else begin f := produit (m, n div 2); if ((n mod 2) = 0) then produit := f + f else produit := f + f + m end; end;Afin de calculer la complexité en nombre d'additions de la fonction produit, nous allons encadrer par deux suites et (i.e ) de la forme . Exercice 1.2 : Définir les deux suites et .
Programme Pascal associé :
type tableau = array [1..N] of integer; procedure Trier(var t : tableau; i, j : integer); begin if (i < j) then begin Decouper(t, i, j, k); Trier(t, i, k - 1); Trier(t, k + 1, j); end; end;
La procédure Decouper garantit, qu'après exécution, pour le tableau , l'élément de rang vérifie : . La complexité en temps de Decouper est exactement égale à la taille du tableau t, soit pour notre exemple. Les performances du tri rapide dépendent directement de la manière dont le découpage est réalisé.
Exercice 2.1 : Supposons que ce pire des cas survienne à chaque étape de l'algorithme, déterminer
la complexité de la procedure Trier.
NB : On utilisera une relation de récurrence de la forme
.
Exercice 2.2 : Supposons que le meilleur des cas survienne à chaque étape de l'algorithme, déterminer
la complexité de la procedure Trier.
NB : On utilisera une relation de récurrence de la forme
.