TD — Séance 2 — Analyse algorithmique
Compter, borner, mesurer : le coût d’un algorithme
Appliquer à la main, sur des fragments et des données nouvelles, les outils de la séance : compter les opérations d’un fragment, compter les tours d’une boucle, prouver une borne asymptotique, classer des fonctions par leur croissance, dérouler une recherche dichotomique, résoudre une récurrence et interpréter des durées mesurées. Chaque réponse se donne sous la forme demandée (tableau, valeur, inégalité, classe) et se justifie en une ou deux phrases.
Conventions. Les opérations se comptent comme dans le cours : une affectation, une comparaison ou un accès t[i] vaut 1 ; s = s + i, i++, i += 2 et c = c + 1 valent 2 (une addition, une affectation) ; le test d’une boucle est évalué une fois de plus que la boucle ne fait de tours. La déclaration de \(n\) et l’affichage restent hors du compte. log2 désigne le logarithme en base 2, et \(\lceil x\rceil\) le plus petit entier supérieur ou égal à \(x\). La recherche dichotomique est celle du cours, écrite ici avec une boucle : tant que \(lo\leq hi\), elle examine la case \(mid=lo+(hi-lo)/2\) (division entière), rend \(mid\) si t[mid] \(=x\), continue sur \([mid+1, hi]\) si t[mid] \(<x\), sur \([lo, mid-1]\) sinon, et rend \(-1\) quand \(lo>hi\).
Exercice 1 : compter deux fragments
Fragment A
int s = 0;
for (int i = 0; i < n; i += 2) {
s = s + i;
}Fragment B
int c = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
c = c + 1;
}
}Pour le fragment A, remplir le tableau pour \(n=6\) et \(n=7\), puis donner \(f(n)\) pour \(n\) pair et pour \(n\) impair, et sa classe \(\Theta\).
instruction exécutions, \(n=6\) opérations, \(n=6\) exécutions, \(n=7\) opérations, \(n=7\) s = 0i = 0i < ns = s + ii += 2total Pour le fragment B, donner le nombre d’exécutions de chaque instruction en fonction de \(n\), puis \(f(n)\) et sa classe \(\Theta\) ; vérifier pour \(n=6\) en complétant le tableau.
c = 0i = 0i < ni++j = 0j < ic = c + 1j++total exécutions opér., \(n=6\) Que vaut la variable
cà la fin du fragment B pour \(n=6\) ? Par combien \(f\) est-elle multipliée quand \(n\) passe de 1 000 à 2 000 ? Comparer à \(2^2\).
Exercice 2 : compter les tours
Pour chaque fragment, donner le nombre de tours du corps (le nombre d’exécutions de t++) pour les valeurs de \(n\) indiquées, puis la classe \(\Theta\) de ce nombre en fonction de \(n\).
| fragment | tours | classe | |
|---|---|---|---|
| (a) | for (int i = 1; i < n; i = i * 2) t++; |
\(n=64\) : \(n=100\) : \(n=1\,000\) : | |
| (b) | for (int i = 1; i * i <= n; i++) t++; |
\(n=50\) : \(n=1\,000\) : | |
| (c) | for (int i = 0; i < n; i++) |
\(n=16\) : \(n=20\) : | |
for (int j = 1; j < n; j = j * 2) t++; |
|||
| (d) | trois boucles imbriquées i, j, k, chacune de 0 à \(n-1\) |
\(n=10\) : | |
| (e) | deux boucles successives, chacune de 0 à \(n-1\) | \(n=10\) : |
Pour (a), écrire les valeurs successives de i pour \(n=100\). Pour (c), comparer la classe obtenue à \(\Theta(n)\) et à \(\Theta(n^2)\).
Exercice 3 : prouver une borne
Soit \(f(n)=4n^2+30n+70\).
Montrer que \(f(n)\in\mathcal{O}(n^2)\) avec \(n_0=1\), en exhibant une constante \(c\) et en rédigeant l’inégalité.
Pour \(c=6\) puis \(c=5\), déterminer le plus petit \(n_0\) tel que \(f(n)\leq c\,n^2\) pour tout \(n\geq n_0\) ; vérifier l’inégalité en \(n_0-1\) et en \(n_0\).
\(c\) plus petit \(n_0\) \(f(n_0-1)\) \(c\,(n_0-1)^2\) \(f(n_0)\) \(c\,n_0^2\) 6 5 Existe-t-il un \(n_0\) pour \(c=4\) ? Montrer que \(f(n)\in\Omega(n^2)\), puis conclure sur \(\Theta\).
Montrer par l’absurde que \(n^3\notin\mathcal{O}(n^2)\).
Exercice 4 : classer des fonctions
Ranger les neuf fonctions suivantes de la plus lente à la plus rapide en croissance (pour \(n\) grand) : \[n\log_2 n, 1\,000, n^2/10, \sqrt n, 2^n, 3n+100, n!, \log_2 n, n^{1{,}5}.\]
À partir de quelle valeur de \(n\) la fonction \(n^2/10\) devient-elle strictement supérieure à \(3n+100\) ? Que vaut chacune des deux en \(n=50\) ?
Le plus petit \(n_0\) tel que \(2^n>n^3\) pour tout \(n\geq n_0\) ? Donner \(2^n\) et \(n^3\) en \(n_0-1\) et en \(n_0\). L’inégalité est-elle vraie en \(n=1\) ? Ce résultat change-t-il la réponse ?
Vrai ou faux ? Justifier chaque réponse en une ligne.
affirmation V / F justification 1 \(3^n\in\mathcal{O}(2^n)\) 2 \(\log_2 n\in\Theta(\log_{10} n)\) 3 \(n^2+1\,000n\in\Omega(n^3)\) 4 un algorithme en \(\Theta(n^2)\) est plus lent qu’un algorithme en \(\Theta(n)\), pour tout \(n\)
Exercice 5 : la dichotomie sur quinze valeurs
Le tableau trié t contient 15 valeurs, aux indices 0 à 14 :
| indice | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
t |
11 | 17 | 24 | 29 | 35 | 42 | 48 | 53 | 61 | 66 | 72 | 79 | 85 | 90 | 97 |
Dérouler la dichotomie pour \(x=66\), puis pour \(x=40\) : une ligne par tour de boucle, et une dernière ligne pour le test final quand \(x\) est absent.
\(x\) \(lo\) \(hi\) \(mid\) t[mid]décision 66 40 Combien de cases chaque recherche examine-t-elle ? Combien en examinerait la recherche séquentielle pour les mêmes valeurs ?
Pour chacune des 15 valeurs présentes, combien de cases la dichotomie examine-t-elle ? Donner le nombre de valeurs trouvées en 1, 2, 3 et 4 cases, et en déduire le coût moyen d’une recherche réussie, en supposant chaque valeur cherchée avec la même probabilité.
Combien de cases la dichotomie examine-t-elle au plus pour \(n=15\) ? pour \(n=16\) ? Donner la formule générale.
Ajouter la valeur 50 au tableau en le gardant trié : combien d’éléments faut-il décaler ? Quel est le coût d’une insertion au pire cas, en fonction de \(n\) ?
Exercice 6 : récurrences
Pour chaque récurrence, donner \(a\), \(b\), \(\alpha=\log_b a\), le cas du théorème maître qui s’applique (en vérifiant la condition de régularité pour le cas 3), et la classe de \(T(n)\) ; écrire « hors du théorème » si aucun cas ne s’applique, et résoudre alors la récurrence en la déroulant.
récurrence \(a\) \(b\) \(\alpha\) cas \(T(n)\) 1 \(T(n)=8T(n/2)+\Theta(n^2)\) 2 \(T(n)=T(n/2)+\Theta(n)\) 3 \(T(n)=2T(n/4)+\Theta(\sqrt n)\) 4 \(T(n)=3T(n/4)+\Theta(n^2)\) 5 \(T(n)=T(n-1)+\Theta(1)\) Pour \(T(n)=3T(n/2)+n\) et \(T(1)=1\), avec \(n=16\), remplir le tableau des coûts par niveau de l’arbre des appels, puis vérifier le total en calculant \(T(16)\) par la récurrence.
niveau \(j\) 0 1 2 3 4 total nombre d’appels taille de chaque appel coût du niveau Quel niveau coûte le plus ? Quel cas du théorème maître cela illustre-t-il ? Par combien \(T\) devrait-il être multiplié quand \(n\) double, pour \(n\) grand ?
Exercice 7 : lire une expérience de doublement
Deux méthodes Java ont été chronométrées sur la machine du cours (médiane de 5 exécutions, après chauffe), sur des tableaux d’entiers tirés au hasard. La méthode A compte les triplets d’indices \(i<j<k\) dont les valeurs ont une somme nulle, par trois boucles imbriquées ; la méthode B trie une copie du tableau (Arrays.sort(a.clone()) : la copie est comprise dans la durée).
| méthode A (triplets) | méthode B (Arrays.sort) |
||
|---|---|---|---|
| \(n\) | \(T(n)\), ms | \(n\) | \(T(n)\), ms |
| 250 | 0,67 | 250 000 | 17,97 |
| 500 | 4,90 | 500 000 | 32,40 |
| 1 000 | 45,06 | 1 000 000 | 77,22 |
| 2 000 | 341,22 | 2 000 000 | 166,15 |
| 4 000 000 | 366,55 |
- Calculer chaque rapport \(T(2n)/T(n)\) et son logarithme en base 2.
- En déduire l’exposant \(b\) du modèle \(T(n)\approx a\,n^b\) pour chaque méthode. Le nombre de triplets examinés par A vaut \(\binom{n}{3}=n(n-1)(n-2)/6\) : l’exposant mesuré est-il compatible ?
- Les rapports de B sont voisins de 2. Calculer \(\dfrac{2n\log_2(2n)}{n\log_2 n}\) pour \(n=10^6\). Ces mesures permettent-elles de distinguer un coût en \(n\) d’un coût en \(n\log n\) ?
- Prévoir la durée de A pour \(n=4\,000\) et celle de B pour \(n=8\,000\,000\). Quelle taille \(n\) la méthode A peut-elle traiter en une minute, d’après le modèle ?
- Pourquoi une durée de moins d’une milliseconde (première ligne de A) donne-t-elle un rapport peu fiable ? Le rapport de A le plus éloigné de 8 est-il celui-là ? Citer deux autres causes d’écart entre un rapport mesuré et \(2^b\).
Pour cette séance
Le cours
Les slides
À lire en ligne
À télécharger
- Code de départ du TP (ZIP, 7 Ko)