algorithmique (école d'ingénieur) · Chapitre 12 · Exercice de TD
Recherche avec sentinelle
Recherche séquentielle, dichotomique, arrière · niveau 1 (application)
Énoncé
Dans la recherche séquentielle, chaque tour de boucle fait deux tests : « la zone n'est-elle pas vide ? » et « la case contient-elle ? ». On suppose que le tableau a une case supplémentaire , libre. En y plaçant (la sentinelle), montrer qu'on peut écrire une boucle à un seul test. Donner l'invariant, le programme et justifier sa terminaison.
Corrigé
On place en case : est alors certainement dans , et la boucle « tant que » s'arrête au plus tard en . Le test « » devient inutile dans la boucle.
Invariant : « n'est pas dans ». Il est vrai pour ; si , il reste vrai pour . À l'arrêt : si , c'est la première occurrence de ; si , on n'a trouvé que la sentinelle, et n'est pas dans .
static int rechercheSentinelle(int[] T, int n, int x) { // T a n+1 cases
T[n] = x; // la sentinelle : x est dans T[0:n+1]
int i = 0;
// I(i) : x n'est pas dans T[0:i]
while (T[i] != x) i++; // s'arrête au plus tard en n
return i < n ? i : -1;
}
nom : T
valeurs : _ _ _ _ _ _ _ x
indices : 0 1 2 3 4 5 6 n
griser : 0..2
colorier : n
pointeurs : i=3
zone : 0..2 x absent
legende : la sentinelle x en case n arrête la boucle au plus tard en i = n
Terminaison : est un entier positif qui décroît à chaque tour. La complexité reste , mais chaque tour ne fait plus qu'une comparaison au lieu de deux.
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.