algorithmique (école d'ingénieur) · Chapitre 12 · Application directe du cours
La dichotomie qui boucle
Recherche séquentielle, dichotomique, arrière · niveau 1 (application)
Énoncé
Un étudiant a écrit la recherche suivante.
static int recherche(int[] T, int x) {
int g = 0, d = T.length;
while (g < d) {
int m = (g + d) / 2;
if (T[m] < x) g = m;
else d = m;
}
return g;
}
- Exécuter
recherche(S, 3)avec . Que se passe-t-il ? - Pour quelles valeurs de la fonction termine-t-elle ?
- Corriger la fonction en partant de l'invariant « et ».
Corrigé
- Pour : , , donc ; puis , ; puis , ; puis , donc … et ne change plus. La fonction ne termine pas.
nom : S
valeurs : 1 3 3 3 6 8 11 15
griser : 1..7
colorier : 0
pointeurs : g=0 m=0 d=1
legende : T[0] = 1 < 3 : g = m = 0, rien ne change et la boucle tourne
- Le défaut apparaît dès que et : alors et l'affectation ne change rien. La fonction termine seulement si cette situation n'arrive jamais, c'est-à-dire si l'on n'avance jamais : pour . Le programme le confirme (on coupe la boucle au bout de tours et on retourne ) :
fausse(S, 3) = -999
fausse(S, 0) = 0
fausse(S, 7) = -999
- Avec l'invariant « et », si alors : il faut écrire
g = m + 1. On retrouve exactementpremierIndice, dont la zone diminue strictement à chaque tour.
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.