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 ?