Adloun

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

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 →