algorithmique (école d'ingénieur) · Chapitre 12 · Application directe du cours
Dernière occurrence et nombre d'occurrences
Recherche séquentielle, dichotomique, arrière · niveau 2
Énoncé
Écrire une fonction int dernierIndice(int[] T, int x) qui retourne, en , le plus petit indice tel que toutes les valeurs de sont strictement supérieures à ( est trié par ordre croissant). On donnera l'invariant. En déduire une fonction qui compte les occurrences de dans en .
Corrigé
On recopie premierIndice en remplaçant « » par « ». L'invariant est
Il est vrai pour , (deux sous-tableaux vides). Si , comme est trié, : est vrai. Sinon : est vrai. À l'arrêt, et .
static int dernierIndice(int[] T, int x) { int n = T.length;
int g = 0, d = n;
// I(g,d) : T[0:g] <= x et T[d:n] > x
while (g < d) {
int m = g + (d - g) / 2; // g <= m < d
if (T[m] <= x) g = m + 1; // T[0:m+1] <= x : I(m+1,d)
else d = m; // T[m:n] > x : I(g,m)
}
return g; // T[0:g] <= x < T[g:n]
}
static int nbOccurrences(int[] T, int x) {
return dernierIndice(T, x) - premierIndice(T, x);
}
Les occurrences de forment le sous-tableau : leur nombre est la différence des deux indices. Avec :
dernierIndice(S,3)=4 nbOcc(3)=3 nbOcc(7)=0 nbOcc(15)=1 nbOcc(0)=0
nom : S
valeurs : 1 3 3 3 6 8 11 15
colorier : 1..3
zone : 0..0 < 3
zone : 1..3 = 3
zone : 4..7 > 3
legende : premierIndice = 1, dernierIndice = 4 : 4 - 1 = 3 occurrences
Deux dichotomies : , alors qu'un comptage séquentiel est en .
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.