algorithmique (école d'ingénieur) · Chapitre 13 · Application directe du cours
Élément majoritaire
Diviser pour régner · niveau 3 (difficile)
Énoncé
Une valeur est majoritaire dans si elle y apparaît strictement plus de fois. Les seules opérations permises sur les valeurs sont les tests d'égalité (pas de tri, pas de comparaison ).
- Montrer qu'une valeur majoritaire de est majoritaire dans l'une au moins des deux moitiés et .
- En déduire un algorithme diviser pour régner qui retourne la valeur majoritaire si elle existe, et en donner la complexité.
Corrigé
- Soit majoritaire dans , de taille , et , ses nombres d'occurrences dans les moitiés de tailles et . Si n'était majoritaire dans aucune, on aurait et , donc : ne serait pas majoritaire dans . Contradiction.
- Il n'y a donc que deux candidats : les majoritaires (éventuels) des deux moitiés. Pour chacun, on compte ses occurrences dans .
static Integer majoritaire(int[] T, int i, int j) { // T[i:j] non vide
if (j - i == 1) return T[i];
int k = (i + j) / 2;
Integer g = majoritaire(T, i, k), d = majoritaire(T, k, j);
if (g != null && compter(T, i, j, g) * 2 > j - i) return g;
if (d != null && compter(T, i, j, d) * 2 > j - i) return d;
return null; // pas de majoritaire
}
static int compter(int[] T, int i, int j, int x) { int c = 0;
for (int a = i; a < j; a++) if (T[a] == x) c++;
return c;
}
13.10 : 2 null 4
(pour , et .) Deux appels sur des moitiés et deux comptages en : , soit . Il existe un algorithme séquentiel en (vote de Boyer et Moore), écrit à partir d'un invariant astucieux.
nom : T
valeurs : 2 7 2 2 5 2 7
colorier : 0 2 3 5
pointeurs : k=3
zone : 0..2 majoritaire : 2
zone : 3..6 pas de majoritaire
legende : seul candidat 2 : 4 occurrences sur 7, et 4 × 2 > 7100 % 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.