A731. Le classement des billes ***** Problème suggéré par Augustin Genoud
Jules possède des billes d’apparence identique. Il sait qu’elles sont toutes de masses légèrement différentes. Il aimerait les classer, dans l’ordre, de la plus lourde à la plus légère. Pour cela, il ne dispose que d’une petite balance à plateaux sur laquelle il ne peut mettre qu’une bille de chaque côté. Chaque utilisation de la balance constitue un test.
Q1 Combien de tests doit-il effectuer, au minimum, pour classer 5 billes, dans le pire des cas et en appliquant la meilleure stratégie ? [***]
Q2 Combien de tests doit-il effectuer, au minimum, pour classer 8 billes, dans le pire des cas et en appliquant la meilleure stratégie ? [****]
Q3 Pour les plus courageux : combien de billes, au maximum, peut-il classer en 34 tests, dans le pire des cas et en appliquant la meilleure stratégie ? [*****]
PROPOSITION Th Eveilleau
Première tentative avec l’algorithme quicksort (un des meilleurs dans mes anciens (trop anciens) souvenirs, ci-dessous.
Le quicksort…
Les billes sont donc comparées deux à deux. On considère le tableau constitué des masses inconnues des billes.
Un test indique simplement si une bille est plus grande ou plus petite que l’autre.
Ce problème revient à utiliser l’algorithme de tri le plus rapide d’un tableau de nombres.
Un test correspond à une comparaison simple de deux nombres.
On choisit l’algorithme par dichotomie réputé comme le plus rapide. (*)
STRATÉGIE : on choisit une bille quelconque comme PIVOT, nptée en noir.
Ensuite on place à sa droite toutes les billes plus légères.
De même on place à sa gauche toutes les billes plus lourdes.
Le pivot se trouve ainsi correctement placé à chaque étape. On recommence de façon récursive, avec les nouveaux tas de gauche et de droite jusqu’à la dernière bille, jusqu’à ce tas ne contienne qu’une bille au maximum.
Q1
Maximum : 10 tests.
Exemple
En noir et en gras le pivot,
en rouge ce qui est plus lourd et vat à gauche, en vert ce qui est plus léger et va à droite,
en bleu et en gras ce qui est bien placé définitivement.
On prévoit un nombre de cases plus grand que le nombre de billes pour pouvoir les placer correctement à gauche ou à droite d’une bille choisie arbitrairement comme pivot : à droite les plus petits, à gauche les plus grands.
Les billes notées en vert ou rouge seront comparées à la bille pivot notée en noir.
Il est évident qu’on ne connaît pas les masses a priori. Elles sont notées pour que l’on puisse comprendre l’évolution et les résultats des tests. Je choisis, peu importe, comme PIVOT, la bille la plus à droite de la liste.
7, 6, 8, 5, 9 Pivot 9.
9, 7, 6, 8, 5 4 tests : comparaison de 4 billes avec le pivot 9.
Nouvelle liste à étudier : 7, 6, 8, 5
Nouveau Pivot : 5
9, 7, 6, 8, 5
3 tests : comparaison avec le pivot 5.
Nouvelle liste à étudier : 7, 6, 8 Nouveau Pivot : 8
9 , 8,
7, 6,5
2 tests : comparaison avec le pivot 8.Nouvelle liste à étudier : 7, 6
Nouveau Pivot : 6
9, 8, 7, 6, 5
1 test : comparaison avec le pivot 6.
9, 8, 7, 6, 5 Tout est en ordre avec 10 comparaisons.
Exemple n°2
5, 9, 6, 7,
8
donnant un résultat de 7 comparaisons sur la balance.5, 9, 6, 7,
8
Pivot 8. 9, 8, 5, 6, 7
4 tests : comparaison de 4 billes avec le pivot 8.
Nouvelle liste à étudier : 5, 6, 7 Nouveau Pivot : 7
9, 8, 7,
5, 62 tests : comparaison avec le pivot 7.
Nouvelles listes à étudier : 5, 6 ET 9 (terminé) Nouveau Pivot : 6
9, 8, 7, 6,
5 1 test : comparaison avec le pivot 6.Nouvelle liste à étudier : 5 (terminé)
9, 8, 7, 6, 5
Tout est en ordre avec 7 comparaisons.Exemple n°3
8, 9, 7, 6,
5
donnant un résultat de 10 comparaisons sur la balance. Pivot 5 .
8, 9, 7, 6,
5
4 tests : comparaison de 4 billes avec le pivot 5.Nouvelle liste à étudier : 8, 9, 7, 6 Nouveau Pivot : 6
8, 9, 7,
6,
5
3 tests : comparaison avec le pivot 6.Nouvelle liste à étudier : 8, 9, 7 Nouveau Pivot : 7
8, 9, 7,
6,
5
2 tests : comparaison avec le pivot 8.Nouvelle liste à étudier : 8, 9, Nouveau Pivot : 9
9, 8, 7, 6, 5
1 test : comparaison avec le pivot 6.
9, 8, 7, 6, 5
Tout est en ordre avec 10 comparaisons.Maximum : 4+3+2+1=10
Pour 6 billes, nous aurons un maximum de 15.
Exemple avec la liste 5,6,7,4,8,9 donnant 15 tests.
Pivot 9
5, 6, 7, 4, 8, 9 5 tests.
Pivot 8 9, 8 , 5, 6, 7, 4 4 tests.
Pivot 4 9, 8, 5, 6, 7, 4 3 tests.
Pivot 7
9, 8 , 7 , 5, 6, 4 2 tests.
Pivot 6
9, 8, 7 , 6, 5, 4 1 test.
9, 8, 7, 6, 5 Tout est en ordre avec 15 comparaisons.
Pour 7 billes, nous aurons un maximum de 21.
Q2
Maximum : Pour 8 billes, nous aurons un maximum de 28 tests.
C’est : 7+6+5+4+3+2+1=7*8/2=28
De façon générale pour n billes, le maximum est n(n-1)/2
Q3
Réponse : avec 9 billes, on trouve un maximum de 36 tests avec une bonne stratégie.
36 = 8+7+6+5+4+3+2+1=8*9/2
On doit donc se contenter de
8 billes. Bien entendu selon les cas, il y aura moins de tests mais on demande lemaximum…
On ne peut donc aller au-delà.
Pour 10 billes, on trouve 45 tests.
9+8+7+6+5+4+3+2+1=45
(*)
Parmi les trois algorithmes de tri classiques : tri à bulles, tri par insertion et tri par dichotomie, le plus rapide est l’algorithme par dichotomie appelé aussi QUICKSORT.
Le nombre moyen d’opérations est O(n*log2(n) ), le maximum est O(n²).
Voici l’algorithme récursif utilisé.
var n_it=0;
function tri_rapide(tab) { var lg=tab.length;
//Terminé si longueur du tableau est 1 if (lg<2) {
return tab;
} var tab_inf:Array=new Array();
var tab_sup:Array=new Array();
//On prend pour pivot le dernier élément, c'est un exemple //On pourrait prendre n'importe quel élément
var ind_pivot=lg-1;
var pivot=tab[ind_pivot];
for (var i=0; i<lg; i++) {
//Seulement si l’élément n’est pas le pivot if (i!=ind_pivot) {
var v=tab[i];
n_it=n_it+1;
if (v<pivot) {
tab_inf.push(v);
} else {
tab_sup.push(v);
} }
}
return (tri_rapide(tab_sup).concat([pivot])).concat(tri_rapide(tab_inf));
}
//////////////////////////////
trace(tri_rapide([9,6,8,7,5]));
trace("nombre de tests "+n_it);
Il s’avère que je n’obtiens pas et de loin les performances attendues car selon l'OEIS http://oeis.org/A036604
Les résultats sont bien meilleurs avec la séquence précédente : .pour 3 billes 3 pesées. (OK)
.pour 4 billes 5 pesées.
Q1
Pour 5 billes 7 pesées.
(J’en ai 10 avec le quicksort)..pour 6 billes 13 pesées.
Q1
Pour 8 billes 16 pesées.
(J’en ai 28 avec le quicksort)..pour 9 billes 19 pesées.
.pour 10 billes 22 pesées.
.pour 11 billes 26 pesées.
.pour 12 billes 30 pesées.
Q1