• Aucun résultat trouvé

2 Tri flash

N/A
N/A
Protected

Academic year: 2022

Partager "2 Tri flash"

Copied!
2
0
0

Texte intégral

(1)

TP 4: tri flash

Judicaël Courant

Le 27 avril 2016

1 Tri par insertion, version impérative

Q0 Écrire une fonctionswap : ’a vect -> int -> int -> unitéchangeant deux éléments d’in- dices donnés dans un tableau donné.

Q1 Écrire une fonctiontri insertion : ’a vect -> unittriant en place le tableau qui lui est passé en argument en utilisant l’algorithme du tri par insertion. On commencera par l’écrire en utilisant une fonction auxiliaire pour l’insertion puis on l’écrira en utilisant deux boucles imbriquées.

Q2Quelle est la complexité temporelle de cette fonction dans le cas le pire ? (on supposera que la complexité en moyenne est la même)

Q3 Écrire une fonctionmk_rand_vect : int -> float vecttelle quemk_rand_vect nretourne un tableau de flottants tirés uniformément au hasard dans l’intervalle[0,1000[.

Q4 En mesurant à la main les temps d’exécution, essayer de déterminer expérimentalement la complexité de votre fonction tri insertion : ’a vect -> unit. On essaiera de donner le temps d’exécution en fonction de la taillendu tableau sous la formeαnβ, oùβ est une constante sans dimension etαune constante exprimée en secondes, et on cherchera à calculer ces constantes.

2 Tri flash

Le tri flash est un tri qui ne permet de trier que des nombres (dans cet énoncé, nous prendrons des flottants). La version originale trie un tableau en place mais nous en donnons ici une version plus simple qui retourne un nouveau tableau.

Étant donné un tableautdenréels, on se donne un entierN (on prendraN =d0.42ne+ 1et on construit N intervalles de même largeur [a0, b0[, . . . , [aN−1, bN−1[, tels que a0 soit la plus petite valeur du tableaut,aN−1soit la plus grande et pour touti∈[[0, N−1[[,bi =ai+1. Chaque élément xprésent dans le tableautappartient alors à un et un seul de ces intervalles. Pouri∈[[0, N[[, on appelleclasse numéro i l’intervalleIi.

Pour décrire les classes, il suffit de connaître trois informations : les valeurs minimum et maxi- mum du tableau et le nombre de classes. On peut décrire ces informations par le type enregistre- ment suivant :

t y p e d e s c r _ c l a s s e s = {

nb : int ; (* n o m b r e de c l a s s e s *)

cbaCette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.

1

(2)

Option informatique MPSI La Martinière Monplaisir 2015-2016

v m i n : f l o a t ; (* e x t r é mit é g a u c h e de la p l u s p e t i t e c l a s s e *) v m a x : f l o a t ; (* e x t r é mit é g a u c h e de la p l u s g r a n d e *)

}

Q5 Écrire une fonctionminmax : ’a vect -> ’a * ’a retournant le couple(vm, vM) constitué respectivement du minimum et du maximum des éléments du tableau passé en argument.

Q6Écrire une fonction calcule_classes : float vect -> descr_classescalculant la descrip- tion des classes du tableau qui lui est passé en argument. Cette fonction devra s’exécuter en temps linéaire en la taille du tableau.

Q7 Écrire une fonction classe : descr_classes -> float -> int qui calcule le numéro de la classe d’une valeur. On fera en sorte que son temps de calcul soit indépendant du nombre de classes.

Q8 Écrire une fonctioneffectifs : float vect -> descr_classes -> int vect telle que, sit est tableau et qune description des classes det,(effectifs t q) retourne un tableauede taille q.nb, tel que pour tout indiceidanse,e.(i)donne le nombre d’éléments du tableautappartenant à la classe numéro i.

Vous ferez en sorte queeffectifss’exécute dans le cas le pire en tempsO(max(n, q.nb))oùn est la taille de t.

Pour trier un tableau t, on crée un tableau u de même taille que t (initialisé avec des valeurs arbitraires) destiné à recevoir les valeurs de t triées. On calcule un tableau e des effectifs desN classes du tableau avec les fonctions précédentes. On place alors les éléments de la classe 0 dans lese.(0)premières cases de u, les éléments de la classe1dans lese.(1)suivantes, . . . , les éléments de la classe N −1 dans les e.(N −1) dernières. Le tableau u est alors «vaguement trié» (les e.(0)premiers éléments sont lese.(0), plus petits, lese.(1)suivants sont plus grands que lese.(0) premiers, etc.).

On peut remarquer que les élements de la classe0sont stockés dansu à partir de l’indice0, les éléments de la classe1à partir de l’indicee.(0), ceux de la classe2à partir de l’indicee.(0) +e.(1), etc.

Q9Écrire une fonctiondebut_classes : int vect -> int vectprenant en argument le tableau des effectifs eet retournant un tableaudde même taille donnant les indices des débuts de classes dans ce tableau u :d.(0) = 0,d.(1) =e.(0),d.(2) =e.(0) +e.(1), etc.

Q10Écrire une fonctionrepartis, de typefloat vect -> descr classes -> int vect ->

float vecttelle que sitest un tableau de flottants,qune description de sesN classes, supposées d’effectifs e0, . . . , eN−1 et d le tableau des indices des débuts des classes (comme calculé par la fonction précédente), alors repartis t q d construit un tableau u de même taille que t puis répartit dansu les éléments detde façon à ce que les éléments de la classe0 detsoient mis dans les e0 premières cases de u, ceux de la classe1 dans lese1 suivantes, . . . , ceux de la classeN −1 dans les eN−1 dernières. La fonction retourne alors le tableauu.

Vous ferez en sorte que votre fonction s’exécute en temps linéaire en la taille det. (On autorise la fonction repartisà modifier le tableau d.)

Le tri flash consiste simplement à combiner les fonctions qui précédent pour calculer un tableau u dans lequel les éléments de tont été répartis par classes (par la fonction précédente), à trier le tableau u par insertion puis à le retourner.

Q11Écrire une fonction flash : float vect -> float vecteffectuant ce tri.

Q12 Il peut sembler inutile de faire tout ce travail avant de faire un tri par insertion naïf.

Comparer expérimentalement les performances du tri flash et du tri par insertion. Qu’observe-t- on ? Expliquez.

2

Références

Documents relatifs

Dans un espace euclidien, la notion de produit scalaire nous permet de d´ efinir une distance sur E, de parler de longueurs, et de d´ efinir une structure g´ eom´ etrique..

Dans un espace euclidien, la notion de produit scalaire nous permet de d´ efinir une distance sur E, de parler de longueurs, et de d´ efinir une structure g´ eom´ etrique..

Dans un espace euclidien, la notion de produit scalaire nous permet de d´ efinir une distance sur E, de parler de longueurs, et de d´ efinir une structure g´ eom´ etrique..

L.C : Occurrences et associations classiques : Caractéristique des micaschistes et gneiss du métamorphisme régional (faciès amphibolite, granulite, éclogite...) dans des

[r]

Ce qu’il faut trouver pour repr´ esenter un sous-espace vectoriel : comme un Ker : un syst` eme d’´ equations. comme un Vect : un syst` eme de g´ en´ erateurs comme un Ker lib´

Exercice 4 : Écrire une fonction de signature range : (int*int*int) -> int vect telle que range (deb,fin,pas) retourne un tableau correspondant à l'objet range(deb,fin,pas)

Écrire une fonction de signature couleurs_voisins : int list vect -> int vect -> int -> int list telle que l’appel à couleurs_voisins aretes couleurs i renvoie la liste