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
- 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.