Recherche de l`élément majoritaire [dr06] - Exercice

publicité
Recherche de l’élément majoritaire [dr06] - Exercice
Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner
Unisciel
algoprog
Version 24 octobre 2016
Table des matières
1 Énoncé
2
2 Algorithmique, Programmation
2.1 Algorithme naı̈f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Premier algorithme Diviser Pour Régner . . . . . . . . . . . . . . . . . .
2.3 Deuxième algorithme Diviser Pour Régner . . . . . . . . . . . . . . . . .
2
2
3
3
alg - Recherche de l’élément majoritaire (TD)
Mots-Clés Diviser pour régner Requis Axiomatique impérative, Récursivité des actions, Complexité des algorithmes Difficulté • • ◦ (1 h 30) Objectif
Cet exercice s’intéresse à la complexité au pire de la recherche d’un élément majoritaire
dans une séquence tabulaire.
1
Unisciel algoprog – Recherche de l’élément majoritaire [dr06]
1
2
Énoncé
Soit une séquence tabulaire A de n éléments, n étant supposé être une puissance de deux.
On suppose les définitions et opérations suivantes :
Constante MAXELEMS <-...
Type Element
| ...
FinType
Type Sequence
| elems : Element [ MAXELEMS ]
| taille : Entier
FinType
Fonction ieme ( DR A : Sequence ; k : Entier ) : Element
Début
| Retourner ( A.elems [ k ] )
Fin
Action fixerIeme ( DR A : Sequence ; k : Entier ; valeur : Element )
Début
| A.elems [ k ] <- valeur
Fin
Nous supposons également que la seule opération à notre disposition, notée =, nous
permet de vérifier si deux Element sont ou non égaux.
Définition
Un élément x de A est dit majoritaire si et seulement si A contient strictement plus
de n/2 occurrences de x.
Problème
Nous nous intéresserons à la complexité au pire de l’opération majoritaire(A) qui
teste et renvoie Vrai si une Sequence A contient un élément majoritaire, Faux sinon.
2
2.1
Algorithmique, Programmation
Algorithme naı̈f
L’algorithme naı̈f calcule le nombre d’occurrences de chaque élément de la séquence.
Écrivez une fonction occurrences(A,x,g,h) qui calcule et renvoie le nombre d’occurrences d’une valeur x présentes entre les indices g et h d’une Sequence A.
Quelle est sa complexité au pire ?
Unisciel algoprog – Recherche de l’élément majoritaire [dr06]
3
Au moyen de l’algorithme précédent,
Écrivez une fonction majoritaire1(A) qui teste et renvoie Vrai si une Sequence A
contient un élément majoritaire, Faux sinon.
Quelle est sa complexité au pire ?
2.2
Premier algorithme Diviser Pour Régner
Ce problème définit un premier algorithme Diviser Pour Régner. Cet algorithme divisera
en deux la Sequence A sur lequel il travaille. Il renverra :
• Le couple (Vrai,x) si A contient un élément majoritaire (x étant cet élément).
• Le couple (Faux,0) sinon (A ne contient pas d’élément majoritaire).
Écrivez une fonction récursive majoritaire2Rec(A,g,h) qui effectue ce travail entre les
indices g et h d’une Sequence A.
Orientation
• Si g=h : l’élément majoritaire est A[g].
• Sinon appelez récursivement votre fonction sur la partie gauche (résultat (rx,x))
et sur la partie droite (résultat (ry,y)).
• Analysez les booléens rx et ry puis les valeurs x et y.
Déduisez une fonction majoritaire2(A) construit selon le paradigme « diviser pour
régner ».
Montrez que votre algorithme est correct.
Quelle est sa complexité au pire ?
2.3
Deuxième algorithme Diviser Pour Régner
Ce problème définit un deuxième algorithme Diviser Pour Régner.
Écrivez une fonction pseudoMajoritaire(A) construit selon le paradigme « diviser pour
régner », prenant en entrée une Sequence A, qu’elle divisera en deux, et qui renvoie :
• Soit le triplet (Faux,0,0) qui garantit que A ne contient pas d’élément majoritaire.
• Soit le triplet (Vrai,x,cx) où x est un élément de A et cx > n/2 un entier, tels
que x apparaisse au plus cx fois dans A et que tout autre élément de A apparaisse
au plus n − cx fois dans A.
Unisciel algoprog – Recherche de l’élément majoritaire [dr06]
4
Orientation
Comme dans le problème précédent, écrivez une fonction récursive
pseudoMajoritaireRec(A,g,h) qui effectue ce travail entre les indices g et h d’une
Sequence A et traitez les différents cas.
Montrez que votre algorithme est correct.
Quelle est sa complexité au pire ?
À partir de l’algorithme précédent,
Déduisez une fonction majoritaire3(A) qui teste et renvoie Vrai si une Sequence A
contient un élément majoritaire, Faux sinon.
Quelle est sa complexité au pire ?
Téléchargement