Adloun

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

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 →