Voici un algorithme si stupide que personne apparemment n'a encore pensé à l'implémenter:
Créer un tableau d'entiers, allant de 0 à 16 (par exemple).
Trier le tableau dans l'ordre croissant, à l'aide de la fonction de comparaison des entiers (c'est ici que l'algorithme est particulièrement stupide puisque le tableau est déjà trié).
Afficher le résultat.
Essayer le script suivant en cliquant sur le bouton:
Si vous utilisez un navigateur autre que Chrome, il y a de fortes chances que l'affichage
soit trié de 0 à 16, comme on s'y attend. Mais sous Chrome, l'affichage est plus surprenant...
Le point de départ a été une activité faite avec alcoffeethmique sur l’approximation normale d’une loi binomiale. Le cours sur la loi normale ayant déjà été fait, les élèves étaient familiarisés avec la forme de la célèbre courbe en cloche. Il s’agissait donc de leur faire représenter graphiquement des lois binomiales de paramètre N croissant (avec p voisin de 0,5) jusqu’à ce que la forme de cloche leur paraisse évidente [1]. Pour cela, la version d’alcoffeethmique ci-dessous a été utilisée :
L’algorithme utilisé pour représenter graphiquement une loi binomiale avec alcoffeethmique est celui-ci :
N = 8
p = 0.4
loi = (binomiale N, p, k for k in [0..N])
diagrammeBatonsTrie loi, 1
Rédigé ainsi, il suffit de modifier la première ligne pour avoir d’autres valeurs de N (mais il faut ajuster le dernier paramètre à la quatrième ligne pour que le graphique soit bien dimensionné). On peut décrire l’algorithme ainsi :
On affecte la variable N à 8 (taille de l’échantillon).
On affecte la variable p à 0,4 (probabilité de succès).
On crée un tableau loi contenant les probabilités que le nombre de succès soit k pour toutes valeur de k allant de 0 à N.
On dessine le diagramme en bâtons de la loi binomiale, en triant les valeurs de k au passage (ceci est nécessaire au cas où ces valeurs n’auraient pas été introduites dans l’ordre croissant).
On obtient alors le diagramme en bâtons suivant :
Mais pas toujours : Le graphique ci-dessus a été obtenu avec le navigateur Mozilla Firefox. Mais le même alcoffeethmique avec le même script produit sous Google Chrome un graphique visiblement assez différent :
Comme alcoffeethmique est programmé en CoffeeScript, il est relativement aisé de chercher dans son code source comment sont dessinés les diagrammes en bâtons :
diagrammeBatonsTrie = (dico, ech=400) ->
nombreBatons = (x for x of dico when x<Infinity).length
dicotrie=(parseFloat x for x of dico when x<Infinity).sort (x,y)-> x>y
effaceDessin()
dessineSegment 20, 440, 620, 440, 'black'
abscisse = 40-600/nombreBatons
for x in dicotrie
abscisse += 600/nombreBatons
hauteur = 400/ech*dico[x]
dessineRectangle abscisse, 440-hauteur, 5, hauteur, 'blue'
dessineTexte x.toString().replace(".",","), abscisse, 460, 'black'
C’est donc la troisième ligne qui effectue le tri croissant selon les valeurs du caractère, qui est responsable du mélange des bâtons. Elle crée, à partir de la liste dico des valeurs du caractère, une sous-liste formée par les seuls éléments qui soient à la fois numériques et finis [2]
Question : Comment Google Chrome trie-t-il les nombres ?
D’où vient cette relation d’ordre étrange ? Des Bermudes [3] ?
En effet le phénomène est parfaitement reproductible et le tri obtenu dépend visiblement de la taille du tableau à trier.
La variante suivante du script en haut de page, donne un tri correct par Chrome :
N = 16
tableau = [0..N]
tableau.sort()
alert tableau
Ainsi, par défaut, Chrome trie les nombres dans l’ordre croissant. Mais si on lui demande explicitement de le faire, il ne le fait plus... Et un autre problème surgit alors : cette fois-ci, c’est Firefox qui donne un résultat surprenant :
0,1,10,11,12,13,14,15,16,2,3,4,5,6,7,8,9
Au secours, ils sont tous fous !!! Non, en fait il y a une logique dans l’ordre choisi par Firefox : c’est l’ordre lexicographique. Et c’est parce que les informations dans une page html sont essentiellement textuelles, que les développeurs de chez Mozilla ont fait ce choix. Il est donc nécessaire, hors Google Chrome, de préciser que les nombres doivent être rangés dans l’ordre croissant et non dans l’ordre lexicographique, en fournissant à sort (trier) la relation d’ordre choisie :
Cet aspect de la fonction sort (tri de JavaScript est, du point de vue mathématique, une porte ouverte vers un univers vaste d’exercices de statistiques : les notions de médiane et de quartiles ne dépendant que du tri, ces notions peuvent très bien s’étendre à d’autres relations d’ordre que l’ordre naturel des nombres. Par exemple, avec l’ordre alphabétique, la notion de mot médian d’un dictionnaire a du sens et même un sens assez concret...
Safari utiliserait un algorithme de tri par sélection, inefficace sur de grands tableaux puisque le temps de tri d’un tableau de taille n est proportionnel à n² ;
Firefox aurait plutôt opté pour le tri fusion, proportionnel à n ln(n) ;
Chrome fait plus compliqué : Selon la taille du tableau et la nature de ses éléments, il choisit entre
Quant à Internet Explorer, comme ce n’est pas un logiciel libre, on ne peut pas savoir comment il trie les éléments ; on peut cependant supposer que c’est le tri rapide, puisque son auteur Charles Antony Richard Hoare travaille chez Microsoft qui est propriétaire de Internet Explorer.
En fait, il n’est (heureusement) pas nécessaire de détecter la nature du navigateur et appliquer un algorithme différent selon le navigateur. Il suffit, au lieu d’une fonction booléenne comme relation d’ordre
(x,y) ->
x>y
d’appliquer une fonction numérique
(x,y) ->
x-y
Ce qui a pour effet de réconcilier les navigateurs, Firefox continuant à interpréter la relation d’ordre comme booléenne (un nombre positif étant assimilé à true) et Chrome acceptant enfin de ranger les nombres dans l’ordre croissant. La modification [4] sera faite dans la prochaine version d’alcoffeethmique...
Ainsi, on peut tester en haut de cette page la version universelle du tri d’entiers déjà triés :
Celle-ci donne l’ordre croissant quel que soit le navigateur, même dans le triangle des Bermudes...
Cependant, même si on sait comment faire pour que Chrome trie les nombres dans l’ordre correct, tout ceci n’explique pas comment il trie les entiers avec la version en haut de cette page. Et comme Chrome n’est pas un logiciel libre, on ne peut pas consulter son code source pour voir comment est effectué ce tri mystérieux venu d’ailleurs...
Pour essayer d’en savoir plus, on peut faire quelques expériences, ce qui permet d’émettre des conjectures :
Si la taille du tableau est inférieure à 10, les entiers sont triés dans l’ordre croissant, comme on peut le vérifier cas par cas ; exemple pour N=9 :
Par contre dès N=10, l’ordre naturel n’est plus respecté :
Pour N supérieur à 9, la médiane est déplacée avant le minimum du tableau ; on le voit pour N=10 ci-dessus mais aussi pour les valeurs suivantes : N=11 :
Mais aussi N=12 :
On voit qu’à partir de N=12, la situation devient plus compliquée que le déplacement de la médiane en première position. Mais en continuant on émet d’autres conjectures :
Le premier élément reste en seconde position juste après la médiane ; on l’a déjà vu ci-dessus mais effectivement cela semble rester le cas, avec N=13 :
Puis avec N=16 :
Il y a toujours deux éléments insérés entre 0 et 1 : l’élément suivant la médiane, et l’élément 2. Regarder les graphiques ci-dessus, mais aussi pour N=20 :
ou N=32 :
Pour N supérieur à 15, le 5 est placé avant le 3 et le 4, et précédé d’un autre élément plus grand que lui. Là encore, on le voit au-dessus, mais aussi par exemple pour N=64 :
Quant à l’élément placé avant le 5, on peut tenter de conjecturer comment il dépend de N avec ce tableau :
N
élément avant le 5
16
11
20
13
25
14
32
19
40
23
64
35
100
53
Édifiant, non ?
Il y a sans doute bien d’autres conjectures à émettre. Et on peut même espérer qu’avec beaucoup d’entre elles, on puisse se faire une idée sur l’algorithme de tri utilisé.
Un groupe de MATh.en.JEANS en culottes courtes y arrivera-t-il avant les développeurs de chez Google en bermudas ?
[1] En plus, une semaine avant Pâques, ça aide à reconnaître une forme de cloche...
[2] Si x n’est pas un nombre, le test x<Infinity échoue et x n’est pas retenu ; il en est évidemment de même si x est, par un hasard malencontreux, infini.
[3] Lieu du siège social de Google, qui développe Chrome, et qui est anglais ; d’où le titre de l’article...
[4] Solution découverte par Florian Tobé, mais elle avait déjà été faite dans le code source de DGPad qui avait connu un problème similaire.
Commentaires
lundi 28 avril 2014
à 04h31
- par Seb
Intéressant. Du coup quand on a de vrais traitements à faire sur des données, le mieux est encore d’utiliser un vrai langage de programmation (python ;-) ) à la place de javascript et d’un obscur navigateur web :)
Dans un site très personnel, Olivier Sicard nous offres quelques « délires » de mathématiques, algorithmique et programmation. Entre autres pépites, on découvrira le Rubix-Tore, la loi normale asymétrique, la théorie du choix social et le dessin à l’aide des séries de Fourier.
Après Elwyn Berlekamp l’année dernière, c’est au tour du centenaire Richard Guy et de l’immense John Conway. Ce document de Richard Guy (une mise en garde contre le raisonnement inductif) montre bien le style unique de son auteur, en plus d’être une mine de ressources pour des exercices. Conway, outre son jeu de la vie, a créé des dizaines de jeux, dont Sprouts, très populaire dès le CP.
On sait bien que Nicolas Bourbaki n’était pas le nom d’une personne mais le pseudonyme d’un groupe. L’équivalent en informatique théorique est Claude Livercy, auteur de la théorie des programmes. Roger Mohr était un des membres de Claude Livercy.
Quand les chercheurs mettent au point des modèles d’optimisation et de recherche de plus court chemin qui s’inspirent du comportement de masse de colonies de fourmis...
À écouter : Sur les Épaules de Darwin, émission diffusée sur France Inter samedi 31 août 2013.
Les RMLLd se dérouleront pour la 2e fois à Saint-Joseph du 22 au 25 août.
C’est une opportunité pour les élèves qui suivent la spécialité ISN et les passionnés d’informatique.
Commentaires