Adloun

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

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 →