Unisciel algoprog – Recherche de l’´el´ement majoritaire [dr06] 3
Au moyen de l’algorithme pr´ec´edent,
´
Ecrivez une fonction majoritaire1(A) qui teste et renvoie Vrai si une Sequence A
contient un ´el´ement majoritaire, Faux sinon.
Quelle est sa complexit´e au pire ?
2.2 Premier algorithme Diviser Pour R´egner
Ce probl`eme d´efinit un premier algorithme Diviser Pour R´egner. Cet algorithme divisera
en deux la Sequence A sur lequel il travaille. Il renverra :
•Le couple (Vrai,x) si Acontient un ´el´ement majoritaire (x´etant cet ´el´ement).
•Le couple (Faux,0) sinon (Ane contient pas d’´el´ement majoritaire).
´
Ecrivez une fonction r´ecursive majoritaire2Rec(A,g,h) qui effectue ce travail entre les
indices get hd’une Sequence A.
Orientation
•Si g=h : l’´el´ement majoritaire est A[g].
•Sinon appelez r´ecursivement votre fonction sur la partie gauche (r´esultat (rx,x))
et sur la partie droite (r´esultat (ry,y)).
•Analysez les bool´eens rx et ry puis les valeurs xet y.
D´eduisez une fonction majoritaire2(A) construit selon le paradigme «diviser pour
r´egner ».
Montrez que votre algorithme est correct.
Quelle est sa complexit´e au pire ?
2.3 Deuxi`eme algorithme Diviser Pour R´egner
Ce probl`eme d´efinit un deuxi`eme algorithme Diviser Pour R´egner.
´
Ecrivez une fonction pseudoMajoritaire(A) construit selon le paradigme «diviser pour
r´egner », prenant en entr´ee une Sequence A, qu’elle divisera en deux, et qui renvoie :
•Soit le triplet (Faux,0,0) qui garantit que Ane contient pas d’´el´ement majoritaire.
•Soit le triplet (Vrai,x,cx) o`u xest un ´el´ement de Aet cx> n/2un entier, tels
que xapparaisse au plus cxfois dans Aet que tout autre ´el´ement de Aapparaisse
au plus n−cxfois dans A.