Vous êtes sur la page 1sur 5

Deuxième plus grand élément [re05] - Exercice

Karine Zampieri, Stéphane Rivière

Unisciel algoprog Version 21 mai 2018

Table des matières


1 Deuxième plus grand élément / pgdeuxieme 2
1.1 Rappel : Représentation et opérations . . . . . . . . . . . . . . . . . . . . 2
1.2 Algorithme naı̈f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Algorithme du tournoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Références générales 5

Java - Deuxième plus grand élément (Solution)


Mots-Clés Algorithmes de recherche 
Requis Axiomatique impérative (sauf Fichiers), Complexité des algorithmes 
Fichiers UtilsRech 
Difficulté • ◦ ◦ (30 min) 

Objectif
Cet exercice recherche le deuxième plus grand élément d’un multi-ensemble représenté
par une structure tabulaire. Nous supposerons que l’ensemble considéré ne contient pas
deux fois la même valeur et qu’il contient au moins deux éléments.

1
Unisciel algoprog – Recherche du deuxième plus grand élément [re05] 2

1 Deuxième plus grand élément / pgdeuxieme

1.1 Rappel : Représentation et opérations

Soient la définition et les opérations de base sur une Sequence :

Soient la définition et les opérations définies sur une Sequence :


class Sequence{
final int MAXELEMS = ...; // Taille maximale de la Sequence
public int taille; // nombre d’éléments dans la Sequence
...
public int ieme(A,k); // Valeur du k-ième élément de la Sequence A
public void fixerIeme(A,k,valeur); // Fixe la valeur du k-ième élément de A à valeur
public void afficherSeq(A); // Affiche la Sequence A
public void saisirSeq(A); // Saisie une Sequence dans A
public void permuterSeq(A,j,k); // Permute les éléments en position j et k de A
}

Téléchargez le fichier suivant et mettez-le dans votre dossier.


Java @[Sequence.java]

1.2 Algorithme naı̈f

En utilisant un algorithme simple de recherche,

Écrivez une fonction deuxieme1(A) qui recherche et renvoie le deuxième plus grand Element
d’une Sequence A.

Validez votre fonction avec la solution.

Solution Java @[pgdeuxieme.java]


static int deuxieme1(/*const*/Sequence A){
int imax1 = 0;
for (int k = 1; k < A.taille; ++k){
if (A.ieme(imax1) < A.ieme(k)){
imax1 = k;
}
}
int imax2 = (imax1 == 0 ? 1 : 0);
for (int k = 0; k < A.taille; ++k){
Unisciel algoprog – Recherche du deuxième plus grand élément [re05] 3

if (k != imax1 && A.ieme(imax2) < A.ieme(k)){


imax2 = k;
}
}
return (A.ieme(imax2));
}

Quelle est sa complexité en nombre de comparaisons ?

Solution simple
La recherche du maximum coûte n−1 comparaisons. La boucle qui recherche le deuxième
plus grand élément une fois que le maximum a été trouvé effectue n − 2 comparaisons.
D’où un coût total de 2n − 3 comparaisons.

1.3 Algorithme du tournoi

Ce problème décrit un algorithme plus efficace.

Récrivez votre algorithme de recherche du maximum sous la forme d’un tournoi (de
tennis, de foot, de pétanque ou de tout autre sport). Il n’est pas nécessaire de formaliser
l’algorithme ici, une figure explicative sera amplement suffisante.

Solution simple
Les comparaisons sont organisées comme dans un tournoi :
• Dans une première phase, les valeurs sont comparées par paires. Dans chaque paire,
il y a bien sûr un plus grand élément (le « vainqueur ») et un plus petit élément
(le « vaincu »).
• Dans la deuxième phase, les valeurs qui étaient plus grand élément de leur paire à
la phase précédente sont comparées entres elles deux à deux.
• On répète ce processus jusqu’au moment où il n’y a plus qu’un plus grand élément.
Ce procédé est illustré par la figure suivante :

9 D

5 9 C

3 5 8 9 B

3 1 2 5 6 8 9 4 A

Figure 1 – Méthode du tournoi pour la détermination du maximum : A : les éléments sont comparés par paires ; B : les
plus grands éléments de la phase A sont comparés entre eux, par paires ; C : les éléments « vainqueurs » à la phase B sont
comparés entre eux ; D : il ne reste plus qu’un élément, c’est l’élément maximal.
Unisciel algoprog – Recherche du deuxième plus grand élément [re05] 4

Dans combien de comparaisons, le deuxième plus grand élément de l’ensemble a-t-il été
trouvé être le plus petit des deux éléments comparés ?

Solution simple
Le deuxième plus grand n’est plus petit que devant le plus grand élément. Il n’a donc
« perdu » que dans une comparaison, celle avec le plus grand élément.

Proposez un nouvel algorithme de recherche du deuxième plus grand élément. Ici égale-
ment une figure explicative sera suffisante.

Solution simple
Le deuxième plus grand élément est donc un des éléments qui ont été battus par le plus
grand élément. L’algorithme a lieu en deux phases :
1. On recherche tout d’abord le plus grand élément selon la méthode du tournoi.
2. On obtient le deuxième plus grand élément en recherchant l’élément maximal parmi
ceux qui ont été éliminés du tournoi lors d’une comparaison avec l’élément maximal.
Ce procédé est illustré par la figure suivante :
9

5 9

3 5 8 9

3 1 2 5 6 8 9 4

Figure 2 – Le deuxième plus grand élément a nécessairement été battu par le plus grand élément (et que par lui). Il figure
donc parmi les éléments comparés à l’élément maximal. Ces éléments apparaissent ici sur fond noir.

Quelle est sa complexité en nombre de comparaisons ?

Solution simple
La recherche de l’élément maximal coûte n−1 comparaisons, comme d’habitude. Ensuite
la recherche du deuxième plus grand élément nous coûte m − 1 comparaisons, où m est
le nombre d’éléments à qui l’élément maximal a été comparé. Dans le pire cas (c.-à-d.
quand n n’est pas une puissance de deux, la complexité peut varier d’une comparaison
suivant la place initiale dans l’arbre du maximum), m est égal à la hauteur de l’arbre
moins 1 (un arbre réduit à sa racine étant de hauteur un). Or un arbre binaire presque
parfait à n feuilles est de hauteur dlg ne. D’où la complexité :

T (n) = n + dlg ne − 2

Remarque
Cet algorithme est optimal.
Unisciel algoprog – Recherche du deuxième plus grand élément [re05] 5

2 Références générales
Comprend 

Vous aimerez peut-être aussi