algorithmique (école d'ingénieur) · Chapitre 13 · Exercice de TD
Point fixe
Diviser pour régner · niveau 2
Énoncé
contient des entiers distincts triés par ordre croissant. Écrire une fonction en qui retourne un indice tel que s'il en existe un, et sinon. (Indication : étudier la suite .)
Corrigé
Les valeurs sont des entiers distincts et croissants : . La suite est donc croissante au sens large, et l'on cherche un zéro de cette suite : c'est une dichotomie.
static int pointFixe(int[] T) {
int g = 0, d = T.length;
// I(g,d) : T[i] < i pour i dans [0:g], T[i] > i pour i dans [d:n]
while (g < d) {
int m = g + (d - g) / 2;
if (T[m] == m) return m;
if (T[m] < m) g = m + 1; // T[i] - i <= T[m] - m < 0 pour i <= m
else d = m; // T[i] - i >= T[m] - m > 0 pour i >= m
}
return -1; // [g:d] vide : aucun point fixe
}
13.8 : 3 -1 0
(pour , et .)
nom : T
valeurs : -4 -1 1 3 7 9
vert : 3
pointeurs : g=0 m=3 d=6
zone : 0..2 T[i] < i
zone : 4..5 T[i] > i
legende : T[i] - i croît : -4, -2, -1, 0, 3, 4 ; m = 3 est un point fixe
Sans l'hypothèse « distincts », la suite n'est plus monotone et la dichotomie ne marche plus : pour , elle vaut .
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.