Adloun

algorithmique (école d'ingénieur) · Chapitre 12 · Application directe du cours

Premier jour de panne

Recherche séquentielle, dichotomique, arrière · niveau 2

Énoncé

Une fonction boolean ok(int jour) indique si un logiciel fonctionnait à une date donnée. On sait que ok(0) est vrai, que ok(N) est faux, et qu'une fois la panne apparue elle persiste. Écrire une fonction qui retourne le premier jour de panne en appelant ok au plus fois. Quel est l'invariant ? Combien d'appels pour ?

Corrigé

C'est une dichotomie sur les jours, avec l'invariant

Il est vrai pour , . Si , on interroge le jour du milieu () : si ok(m) est vrai, est vrai, sinon l'est. À l'arrêt : le jour fonctionnait, le jour suivant non. Le premier jour de panne est .


static int premierJourPanne(int N) {
    int g = 0, d = N;
    // I(g,d) : ok(g) est vrai et ok(d) est faux
    while (d - g > 1) {
        int m = g + (d - g) / 2;      // g < m < d
        if (ok(m)) g = m; else d = m;
    }
    return d;                         // ok(d-1) vrai, ok(d) faux
}

L'écart passe de à au plus à chaque appel : il faut au plus appels, soit pour .


panne au jour 1 : trouve 1 en 9 appels (N=1000)
panne au jour 37 : trouve 37 en 10 appels (N=1000)
panne au jour 999 : trouve 999 en 10 appels (N=1000)
panne au jour 1000 : trouve 1000 en 10 appels (N=1000)

Cette méthode est celle de la commande git bisect, qui retrouve la version d'un logiciel qui a introduit une erreur.

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 →