Exploration exhaustive et retour sur trace
Cours · informatique (MP2I/MPI), chapitre 14 · MP2I et MPI · le début du chapitre, la suite sur Adloun
14.1 Quand on ne sait rien de mieux
Les quatre chapitres qui suivent celui-ci — diviser pour régner, gloutons, programmation dynamique — sont des méthodes : elles exploitent une structure du problème pour éviter d'en examiner toutes les solutions. Ce chapitre traite du cas où l'on n'a pas cette chance : il faut les examiner.
Le programme donne à ces chapitres un objectif commun, et il est ambitieux : « donner des outils de conception d'algorithmes et parvenir à ce que les étudiants puissent, dans une situation simple, sélectionner une stratégie pertinente par eux-mêmes et la mettre en œuvre de façon autonome ».
14.2 La force brute
Énumérer toutes les solutions candidates, tester chacune, garder celles qui conviennent. C'est toujours correct, et c'est presque toujours trop lent.
| Ce qu'on énumère | Nombre | ||
|---|---|---|---|
| Les sous-ensembles de objets | |||
| Les permutations de objets | |||
| Les mots de longueur sur |
À un milliard d'opérations par seconde, la première ligne passe d'un millième de seconde à dix-huit minutes quand double ; la deuxième était déjà hors de portée à . Retenez cet écart : il justifie à lui seul tout le reste du livre.
Un sous-ensemble de se code par un entier de bits : le bit vaut si l'élément est pris.
/* Énumère les 2^n sous-ensembles de {0, ..., n-1}. Précondition : 0 <= n < 31. */
for (int masque = 0; masque < (1 << n); masque = masque + 1) {
for (int i = 0; i < n; i = i + 1) {
if ((masque >> i) % 2 == 1) { /* l'élément i est dans ce sous-ensemble */ }
}
}
Deux boucles, aucune récursion, aucune structure : c'est la manière la plus courte d'être exhaustif sur les parties d'un ensemble. Le coût est .
Exercices du chapitre
- Ordonner avant de parcourir : deux nombres de somme donnée corrigé
- Ce que chaque test d'élagage rapporte corrigé
- Énumérer les permutations d'un mot à lettres répétées corrigé
- L'ordre des choix change tout corrigé
- Le même sous-problème, vingt-deux millions de fois corrigé
- Problème — Colorier un graphe, et casser les symétries corrigé