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.