Adloun

Problème — Élément majoritaire

Exercice de TD · niveau 3 (difficile) · NSI (terminale), chapitre 6 — Diviser pour régner

Énoncé

Problème — Élément majoritaire.

Un élément est dit majoritaire dans un tableau de taille s'il y apparaît strictement plus de fois. Concevoir un algorithme « diviser pour régner » qui détermine s'il existe un élément majoritaire, et lequel.

Corrigé

on coupe le tableau en deux moitiés. Si un élément est majoritaire dans le tableau entier, il l'est nécessairement dans au moins l'une des deux moitiés. On résout donc récursivement à gauche et à droite, puis on vérifie par comptage lequel des deux candidats est réellement majoritaire sur l'ensemble.


def compte(tab, x, g, d):
    return sum(1 for k in range(g, d + 1) if tab[k] == x)

def majoritaire(tab, g, d):
    if g == d:                       # cas de base
        return tab[g]
    m = (g + d) // 2
    cand_g = majoritaire(tab, g, m)
    cand_d = majoritaire(tab, m + 1, d)
    if cand_g == cand_d:
        return cand_g
    # on compare les comptages des deux candidats
    taille = d - g + 1
    if compte(tab, cand_g, g, d) > taille // 2:
        return cand_g
    if compte(tab, cand_d, g, d) > taille // 2:
        return cand_d
    return None                      # pas de majoritaire

def element_majoritaire(tab):
    return majoritaire(tab, 0, len(tab) - 1)

La relation de récurrence donne une complexité en , meilleure que l'approche naïve en qui compterait chaque élément.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.