Exercice noté #5

Vous devez ranger des valeurs générées aléatoirement dans un tableau trié en ordre décroissant, sans jamais trier votre tableau. Le tableau résultant doit vous permettre de calculer efficacement les valeurs les plus fréquentes dans vun tableau tableau. Vous devez pour cela remettre un fichier ex-note5.js qui contient (au moins) les deux fonctions qui sont décrites ci-après. Vous avez le droit d'utiliser du code vu en cours (en fait la réponse à la première fonction a déjà été vue en cours).

Create

Écrire une fonction create(nbTest, min, max, doPrint) qui retourne un tableau trié en ordre décroissant de nbTest valeurs entières tirées aléatoirement entre min et max. L'argument doPrint s'il est vrai provoque l'affichage de la construction du tableau. L'affichage produit doit respecter celui de l'exemple qui vous est donnée plus bas (les valeurs peuvent bien sûr changer puisque les valeurs sont générées aléatoirement). Voici quelques exemples d'appels de votre fonction et leur résultat. Notez que les valeurs sont générées aléatoirement et que deux appels identiques peuvent donner des résultats différents, comme c'est le cas des deux premiers appels.

// affiche un tableau trie de 20 valeurs aleatoires entre 1 et 10
print(create(20,1,10));
10,10,10,9,8,7,7,6,6,6,5,5,5,3,3,2,1,1,1,1

// affiche un tableau trie de 20 valeurs aleatoires entre 1 et 10
print(create(20,1,10));
10,10,10,9,8,8,8,7,7,6,6,4,3,3,3,3,2,2,1,1

// affiche un tableau trie de 30 valeurs aleatoires entre 1 et 20
print(create(30,1,20));
9,19,19,19,19,18,17,16,16,16,16,16,14,10,10,10,9,9,8,8,7,6,4,4,3,3,2,2,1,1

// affiche un tableau trie de 30 valeurs aleatoires entre 5 et 100
print(create(30,5,100));
100,98,96,95,89,88,88,85,78,75,73,69,69,68,67,62,62,60,58,48,42,39,36,35,31,29,28,21,9,9

// affiche un tableau trie de 20 valeurs aleatoires entre 1 et 10 et affiche la contruction du tableau
print(create(20,1,10,true));
valeur aléatoire: 7 tab: 7
valeur aléatoire: 9 tab: 9,7
valeur aléatoire: 10 tab: 10,9,7
valeur aléatoire: 1 tab: 10,9,7,1
valeur aléatoire: 2 tab: 10,9,7,2,1
valeur aléatoire: 7 tab: 10,9,7,7,2,1
valeur aléatoire: 2 tab: 10,9,7,7,2,2,1
valeur aléatoire: 7 tab: 10,9,7,7,7,2,2,1
valeur aléatoire: 1 tab: 10,9,7,7,7,2,2,1,1
valeur aléatoire: 9 tab: 10,9,9,7,7,7,2,2,1,1
valeur aléatoire: 8 tab: 10,9,9,8,7,7,7,2,2,1,1
valeur aléatoire: 7 tab: 10,9,9,8,7,7,7,7,2,2,1,1
valeur aléatoire: 5 tab: 10,9,9,8,7,7,7,7,5,2,2,1,1
valeur aléatoire: 1 tab: 10,9,9,8,7,7,7,7,5,2,2,1,1,1
valeur aléatoire: 2 tab: 10,9,9,8,7,7,7,7,5,2,2,2,1,1,1
valeur aléatoire: 6 tab: 10,9,9,8,7,7,7,7,6,5,2,2,2,1,1,1
valeur aléatoire: 5 tab: 10,9,9,8,7,7,7,7,6,5,5,2,2,2,1,1,1
valeur aléatoire: 1 tab: 10,9,9,8,7,7,7,7,6,5,5,2,2,2,1,1,1,1
valeur aléatoire: 3 tab: 10,9,9,8,7,7,7,7,6,5,5,3,2,2,2,1,1,1,1
valeur aléatoire: 6 tab: 10,9,9,8,7,7,7,7,6,6,5,5,3,2,2,2,1,1,1,1
10,9,9,8,7,7,7,7,6,6,5,5,3,2,2,2,1,1,1,1

Vous ne devez pas utiliser de fonction de tri, que ce soit une fonction disponible ou une de votre cru. Votre fonction ne doit en particulier pas stocker les valeurs aléatoires dans un tableau qui sera par la suite trié, mais doit s'assurer que le tableau est maintenu trié en ajoutant chaque valeur tirée aléatoirement à sa bonne place au fur et à mesure. Ceci est illustré dans le dernier appel ci-dessus.

Frequence

Écrire une fonction frequence(t,n) qui prend en argument un tableau de valeurs entières triées en ordre décroissant, ainsi qu'un entier n et qui retourne un tableau des n valeurs les plus fréquentes dans t accompagnées de leur fréquence dans le tableau passé en argument. Dans l'exemple qui suit, le tableau retourné par frequence(t,3) indique que les 3 valeurs les plus fréquentes dans t sont (dans cet ordre) la valeur 1 avec 4 apparitions, la valeur 7 qui apparaît également 4 fois, suivi de la valeur 2 qui apparaît 3 fois. (Il se peut qu'à fréquence égale d'autres valeurs soient retenues par votre fonction).

var t = create(20,1,10);
print('t',t);
print('f',frequence(t,3));

t 10,9,9,8,7,7,7,7,6,6,5,5,3,2,2,2,1,1,1,1
f 1,4,7,4,2,3

Vous devez essayer de ne pas utiliser un tableau intermédiaire qui compterait la fréquence de toutes les valeurs du tableau passé en argument mais devez essayer de ne garder que les n valeurs dans le tableau les plus fréquentes et seulement celles-ci (possiblement avec un tableau). Par exemple, dans l'appel qui suit, seules les valeurs 7,3,18,14 et 11 devraient être stockées (et possiblement leur fréquence) sans qu'aucun tableau n'ai mémorisé les 16 valeurs différentes du tableau de 20 éléments passé à la fonction.

var t = create(30,1,20);
print('t',t);
print('f',frequence(t,5));
t 20,20,19,18,18,18,16,15,14,14,13,13,12,11,11,9,7,7,7,7,6,5,5,4,4,3,3,3,1,1
f 7,4,3,3,18,3,14,2,11,2

Notation: Cet exercice est noté sur 6 points (3 points par question). Le nom du programme à remettre est ex-note5.js et la remise doit se faire par studium.