• Aucun résultat trouvé

TD d’algorithmique avanc´ee Corrig´e du TD 4 : recherche de l’´el´ement majoritaire

N/A
N/A
Protected

Academic year: 2022

Partager "TD d’algorithmique avanc´ee Corrig´e du TD 4 : recherche de l’´el´ement majoritaire"

Copied!
4
0
0

Texte intégral

(1)

TD d’algorithmique avanc´ee

Corrig´e du TD 4 : recherche de l’´el´ement majoritaire

Jean-Michel Dischler et Fr´ ed´ eric Vivien

Nous nous int´eressons `a un tableau Aden´el´ements,n´etant suppos´e ˆetre une puissance de deux. Nous supposons ´egalement que la seule op´eration `a notre disposition nous permet de v´erifier si deux ´el´ements sont ou non ´egaux. Un ´el´ement xdeA est dit majoritaire si et seulement si Acontient strictement plus den/2 occurrences dex. Nous nous int´eresserons `a la complexit´e au pire.

Algorithme na¨ıf

1. ´Ecrivez un algorithme qui calcule le nombre d’occurrences d’une valeurxpr´esentes entre les indices i et j d’un tableauA.

Occurrences(x,A,i,j) compteur ←0

pourk←i`aj faire

siA[k] =xalorscompteur ←compteur+ 1 renvoyercompteur

2. Quelle est la complexit´e de cet algorithme ?

La boucle ex´ecutej−i+ 1 it´erations. La complexit´e de cet algorithme est donc enΘ(j−i).

3. Au moyen de l’algorithme pr´ec´edent, ´ecrivez un algorithme Majoritairequi v´erifie si un tableau A contient un ´el´ement majoritaire.

Majoritaire(A)

pouri←1`a longueur(A)/2 faire

siOccurrences(A[i],A,i, longueur(A))>longueur(A)/2 alors renvoyerVrai renvoyerFaux

4. Quelle est la complexit´e de cet algorithme ?

Dans le pire cas, la boucle effectue n/2 it´erations, chacune de ces it´erations effectuant un appel `a Occurrences sur un tableau de taillen−i (ivariant de 1 `an) donc de coˆutΘ(n−i). Le coˆut total de l’algorithme est donc enΘ(n2).

Premier algorithme « diviser pour r´ egner »

1. Proposez un algorithme Majoritaire construit suivant le paradigme « diviser pour r´egner ». Cet algorithme divisera en deux le tableau A sur lequel il travaille. Il renverra le couple (Vrai, x) si le tableau A contient un ´el´ement majoritaire (x´etant cet ´el´ement) et renverra le couple (Faux, 0) si le tableauA ne contient pas d’´el´ement majoritaire.

Majoritaire(A,i,j)

sii=j alors renvoyer(Vrai,A[i]) (rx,x)←Majoritaire(A,i, i+j21) (ry,y)←Majoritaire(A, i+j+12 ,j)

sirx =Fauxetry =Fauxalors renvoyer(Faux, 0)

1

(2)

sirx =Vraiet ry =Vrai alors six=y

alors renvoyer(Vrai,x) sinon

cx←Occurrences(x,A,i, j) cy←Occurrences(y,A,i, j) sicx> j2i+1

alors renvoyer(Vrai, x) sinon sicy >j2i+1

alors renvoyer(Vrai,y) sinon renvoyer(Faux, 0) sinon sirx =Vrai

alors siOccurrences(x,A,i, j)> j2i+1 alors renvoyer(Vrai,x)

sinon renvoyer (Faux, 0)

sinon siOccurrences(y,A,i, j)> j2i+1 alors renvoyer(Vrai,y)

sinon renvoyer (Faux, 0)

Justifications

Les deux seuls cas qui ne sont peut-ˆetre pas imm´ediats sont les suivants :

(a) rx= Fauxetry = Faux: dans ce cas il n’y a pas d’´el´ement qui soit majoritaire dans la premi`ere moiti´e du tableau, ni d’´el´ement qui soit majoritaire dans la deuxi`eme moiti´e du tableau. Si le table contient n ´el´ements, le nombre d’occurrences d’un ´el´ement quelconque dans la premi`ere moiti´e du tableau est donc inf´erieur ou ´egal `a n22 —la premi`ere moiti´e ayant n2 ´el´ements— et il en va de mˆeme pour le deuxi`eme moiti´e. Donc le nombre d’occurences d’un ´el´ement quelconque dans le tableau est inf´erieur `a n2 et le tableau ne contient pas d’´el´ement majoritaire.

(b) rx= Vraietry = Vraiavecx=y : dans ce casxest pr´esent au moins1 +n4 fois dans chacune des deux parties —qui sont de taille n2— et donc au moins2 +n2 fois dans le tableau.

2. Quelle est la complexit´e de cet algorithme ?

La complexit´e de cet algorithme est d´efinie par la relation de r´ecurrence :

T(n) = 2Tn 2

+ Θ(n).

En effet, la phase de combinaison n´ecessite, dans le pire des cas, la recherche du nombre d’occurences de deux ´el´ements dans le tableau, ce qui a un coˆut de n, toutes les autres op´erations ´etant de coˆut constant (Θ(1)).

Nous avons donc ici :a= 2,b= 2etf(n) = Θ(n) == Θ(nlog22). Nous sommes donc dans le cas 2 du th´eor`eme et donc :

T(n) = Θ(nlogn).

Deuxi` eme algorithme « diviser pour r´ egner »

1. ´Ecrivez un algorithme construit suivant le paradigme « diviser pour r´egner », prenant en entr´ee un tableauA —qu’il divisera en deux— et poss´edant la propri´et´e suivante :

– soit cet algorithme nous garantit que le tableauAne contient pas d’´el´ement majoritaire ;

– soit cet algorithme nous renvoie un ´el´ementxet un entiercx> n/2 tels quexapparaisseau plus cx fois dansA et que tout autre ´el´ement deA apparaisseau plus n−cx fois dansA.

PseudoMajoritaire(A,i,j)

sii=j alors renvoyer(Vrai,A[i], 1)

2

(3)

(rx,x,cx)←Majoritaire(A,i, i+j21) (ry,y,cy)←Majoritaire(A, i+j+12 ,j)

sirx =Fauxetry =Fauxalors renvoyer(Faux, 0, 0)

sirx =Vraiet ry =Fauxalors renvoyer(Vrai,x,cx+ji+14 ) sirx =Fauxetry =Vraialors renvoyer(Vrai,y,cy+ji+14 ) sirx =Vraiet ry =Vrai

alors six=y

alors renvoyer(Vrai,x,cx+cy) sinon sicx=cy

alors renvoyer(Faux, 0, 0) sinon sicx> cy

alors renvoyer(Vrai, x, j2i+1+cx−cy) sinon renvoyer(Vrai,y, j2i+1+cy−cx)

Justifications

Nous consid´erons un par un les diff´erents cas de figure :

– rx = Faux et ry = Faux. Aucun ´el´ement n’apparaˆıt strictement plus de n4 fois dans la premi`ere (resp. la deuxi`eme) moiti´e du tableauA. Donc un ´el´ement quelconque de A apparaˆıt au plus n4 fois dans chacune des deux moiti´es, et donc n2 fois en tout dans A. Donc A ne contient pas d’´el´ement majoritaire.

– rx= Vraietry =Faux. Un ´el´ement quelconque deAapparaˆıt doncau plus n4 fois dans la deuxi`eme moiti´e de A. Nous avons deux cas `a consid´erer :

– xapparaˆıt donc au plus cx+n4 fois dansA.

– Un ´el´ement autre que xapparaˆıtau plus n2−cxfois dans la premi`ere moiti´e deA. Par cons´equent un tel ´el´ement apparaˆıt au plus n2 −cx

+n4 =3n4 −cx=n− cx+n4

fois dans A.

D’o`u le r´esultat.

– ry = Vraietrx = Faux : ce cas est sym´etrique du pr´ec´edent.

– rx = Vraietry = Vrai :

– x=y.xest pr´esent au plus cx+cy fois dansA. De plus, tout autre ´el´ement est pr´esent au plus

n

2 −cx fois dans la premi`ere moiti´e deA et n2 −cy fois dans la deuxi`eme moiti´e, soit en tout au plusn−(cx+cy)fois dansA.

– x 6= y et cx = cy. x est pr´esent au plus cx fois dans la premi`ere moiti´e et n2 −cy = n2 −cx

fois dans la deuxi`eme moiti´e, soit n2 fois en tout et x n’est pas un ´el´ement majoritaire de A.

Sym´etriquement, il en va de mˆeme dey. Tout autre ´el´ement ne peut ˆetre un ´el´ement majoritaire (voir le tout premier cas).

– x6= y et cx > cy. Alors x est pr´esent au plus cx fois dans la premi`ere moiti´e de A et n2 −cy

fois dans la deuxi`eme moiti´e, soit au plus n2 +cx−cy fois dans A, et ce nombre est strictement sup´erieur `a n2 carcx> cy.y est pr´esent au plus n2 +cy−cx=n−(n2 +cx−cy)fois dans A.

Tout autre ´el´ement est pr´esent au plus n2 −cx

+ n2 −cy

=n−cx−cy = n2 −cx+n2 −cy

n

2 −cx+cy (car cy> n4) =n− n2 +cx−cy . 2. Quelle est la complexit´e de cet algorithme ?

En dehors des appels r´ecursifs, tous les traitements ont un coˆut constant : Θ(1). La complexit´e de l’algorithme est donc donn´ee par la relation de r´ecurrence :

T(n) = 2Tn 2

+ Θ(1).

Nous nous trouvons donc ici dans le cas 1) du th´eor`eme (avec = 1) et la complexit´e de l’algorithme est donc :

T(n) = Θ(n).

3

(4)

3. `A partir de l’algorithme pr´ec´edent, ´ecrivez un algorithme Majoritaire qui v´erifie si un tableau A contient un ´el´ement majoritaire.

Majoritaire(A)

(r´eponse,x,cx)←PseudoMajoritaire(A, 1,longueur(A)) sir´eponse =Faux

alors renvoyerFaux

sinon siOccurrences(x,A, 1,longueur(A))> longueur2 (A) alors renvoyerVrai

sinon renvoyerFaux

4. Quelle est la complexit´e de cet algorithme ?

La complexit´e de cet algorithme est enΘ(n)car c’est la complexit´e de l’appel `a l’algorithme Pseudo- Majoritaire et celle de l’appel `a l’algorithme Occurrences.

4

Références

Documents relatifs

L’ajout d’un seul sommet pour cr´ eer par r´ ecurrence un graphe ` a 9 sommets semble v´ erifier la propri´ et´ e du lemme des poign´ ees de mains mais on a l’impression

R´ ecrivez votre algorithme de recherche du maximum sous la forme d’un tournoi (de tennis, de foot, de p´ etanque ou de tout autre sport)2. Il n’est pas n´ ecessaire de

Nous voulons maintenant un algorithme Union(A, B) qui nous renvoie l’union des deux ensembles qui lui sont pass´ es en argument.. (a) Cas des ensembles non tri´ es

L’algorithme Intersection est appel´ e longueur (B) fois, chacun de ces appels effectuant un appel ` a Recherche sur A, dont le coˆ ut au pire est en longueur(A)?. Quelle est

Nous supposons ´ egalement que la seule op´ eration ` a notre disposition nous permet de v´ erifier si deux ´ el´ ements sont ou non ´ egaux.. Au moyen de l’algorithme pr´

Le probl` eme est le mˆ eme que le pr´ ec´ edent, sauf qu’ici le voleur peut ne prendre qu’une fraction d’un objet et n’est plus oblig´ e de prendre l’objet tout entier

Etude du signal cr´ eneau de p´ eriode T 0 , de valeur moyenne nulle variant en 1 et -1 : (Par d´ ecalage de l’origine, il est possible de se placer dans le cas d’un signal cr´

Q 1.1 Ecrivez une fonction RechSeq qui, ´ etant donn´ ee une plage de cellules et un ´ el´ ement x, retourne vrai si x est pr´ esent dans la plage, et faux sinon.. On cherche `