Adloun

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 exactement premierIndice, dont la zone diminue strictement à chaque tour.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →