algorithmique (école d'ingénieur) · Chapitre 13 · Exercice de TD
Maximum par moitiés, minimum et maximum
Diviser pour régner · niveau 2
Énoncé
- Écrire une fonction récursive
int max(int[] T, int i, int j)qui retourne le maximum de (non vide) en coupant l'intervalle en deux. Combien de comparaisons fait-elle ? - Écrire une fonction qui retourne à la fois le minimum et le maximum d'un tableau en environ comparaisons, au lieu des comparaisons de deux parcours séparés. (Indication : traiter les valeurs deux par deux.)
Corrigé
-
static int max(int[] T, int i, int j) { // T[i:j] non vide
if (j - i == 1) return T[i];
int k = (i + j) / 2; // i < k < j : deux moitiés non vides
int a = max(T, i, k), b = max(T, k, j);
return a >= b ? a : b; // une comparaison
}
Le nombre de comparaisons vérifie et , d'où (récurrence immédiate) : autant qu'un parcours séquentiel. Sur un tableau de valeurs, le programme compte comparaisons.
- On prend les valeurs par paires : une comparaison les ordonne, puis le plus petit défie le minimum et le plus grand défie le maximum. Trois comparaisons pour deux valeurs, au lieu de quatre.
static int[] minMax(int[] T) { int n = T.length;
int mn, mx, k;
if (n % 2 == 0) {
if (T[0] < T[1]) { mn = T[0]; mx = T[1]; } else { mn = T[1]; mx = T[0]; }
k = 2;
} else { mn = mx = T[0]; k = 1; }
// I(k) : mn et mx sont le min et le max de T[0:k], et n - k est pair
while (k < n) {
int a = T[k], b = T[k + 1];
if (a > b) { int t = a; a = b; b = t; } // a <= b
if (a < mn) mn = a;
if (b > mx) mx = b;
k = k + 2;
}
return new int[] {mn, mx};
}
n=10 : minMax correct=true, 13 comparaisons (3n/2 = 15)
n=1000 : minMax correct=true, 1498 comparaisons (3n/2 = 1500)
n=1001 : minMax correct=true, 1500 comparaisons (3n/2 = 1501)
On fait comparaisons, contre pour deux parcours séparés.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.