• Aucun résultat trouvé

TP 5: files de priorité

N/A
N/A
Protected

Academic year: 2022

Partager "TP 5: files de priorité"

Copied!
3
0
0

Texte intégral

(1)

TP 5: files de priorité

Le 3 juin 2014

Le but de ce TP est de réaliser trois implantations différentes de files de priorité et de les utiliser pour implanter un algorithme de tri.

Pour cela, on se donne une interfacefileprio.mli:

(* Le type des files de priorité, paramétré par le type des éléments. *) type ’a t;;

(* [cree n c x] crée une nouvelle file de priorité de taille maximale [n] utilisant la fonction de comparaison [c]. [x] est une valeur de type [’a] inutilisée par la suite mais permettant d’initialiser la structure de données.

*)

value cree : int -> (’a -> ’a -> int) -> ’a -> ’a t;;

(* [ajoute file x] ajoute l’élément [x] dans la file de priorité [x]. *) value ajoute : ’a t -> ’a -> unit;;

(* [retire_max file] retire l’élément [x] de priorité maximale dans [file] et le retourne. *) value retire_max : ’a t -> ’a;;

(* [est_vide file] vérifie si la file est vide *) value est_vide : ’a t -> bool;;

On a défini danstri.mlune fonction de tri qui utilise le modulefileprio:

(* trie un tableau [t] d’élements par ordre croissant (pour l’ordre naturel pour Caml) en utilisant une file de priorité.

Pour cela, on crée une file de priorité, on y met tous les éléments du tableau puis on récupère les éléments.

*)

let trie t =

let n = vect_length t in if n <> 0 then

let file = fileprio__cree n (fun x y -> compare x y) t.(0) in begin

for i=0 to n-1 do

fileprio__ajoute file t.(i);

done;

for i=n-1 downto 0 do

t.(i) <- fileprio__retire_max file;

done end

;;

(* trie_gen : (’a -> ’a -> int) -> ’a vect -> unit

[trie c t] trie un tableau [t] d’éléments par ordre croissant pour l’ordre donné par la fonction [c] : [c x y] doit rendre une valeur strictement positive si [x>y], strictement négative si [x<y] et

1

(2)

zéro si [x=y].

En fait, c’est une généralisation immédiate de [trie], qui pourrait s’écrire [t -> tri_gen compare t].

*)

let trie_gen c t =

let n = vect_length t in if n <> 0 then

let file = fileprio__cree n (fun x y -> compare x y) t.(0) in begin

for i=0 to n-1 do

fileprio__ajoute file t.(i);

done;

for i=n-1 downto 0 do

t.(i) <- fileprio__retire_max file;

done end

;;

1 Préliminaires : utilisation de make

Regarder le fichier Makefile (l’ouvrir avec emacs).

2 Implantation par un tableau non trié

Donner une première implantation du modulefileprio, c’est-à-dire écrire un fichierfileprio.mlcontenant les définitions des fonctions données dans l’interfacefileprio.mli(que vous ne devez pas toucher), en respectant les consignes suivantes :

— Une file de priorité est un enregistrement contenant un tableau (vect) de taille fixe, du nombre d’éléments effecti- vement utilisés dans ce tableau, et de la fonction de comparaison utilisée pour comparer deux-à-deux des éléments.

— Pour tester si une file est vide, il suffit de tester si le nombre d’éléments utilisés est nul.

— Les éléments effectivement utilisés dans le tableau sont en début de tableau.

— Pour insérer un nouvel élément, on le met à la fin de la partie utilisée et on incrémente le champ représentant la longueur utilisée dans le tableau.

— Pour retirer le maximum du tableau, on cherche sa position (dans la partie utilisée), on l’échange avec le dernier élément effectivement utilisé, on décrémente le champ représentant le nombre d’éléments utilisés et on renvoie la valeur du maximum.

3 Utilisation pour trier

Utiliser le fichiertri.mlfourni (en ajoutant des jeux de tests) pour vérifier que votre file de priorité fonctionne cor- rectement.

Quelle est la complexité de ces fonctions de tri ?

4 Implantation par un tableau trié

Implanter de nouveau le modulefilepriomais cette fois-ci en respectant les consignes suivantes :

— Une file de priorité est un enregistrement contenant un tableau (vect) de taille fixe, du nombre d’éléments effecti- vement utilisés dans ce tableau, et de la fonction de comparaison utilisée pour comparer deux-à-deux des éléments.

— Pour tester si une file est vide, il suffit de tester si le nombre d’éléments utilisés est nul.

— Les éléments effectivement utilisés dans le tableau sont en début de tableau et sont triés par ordre croissant.

— Pour mettre un nouvel élément dans le tableau, on se débrouille pour l’insérer dans le tableau de façon à avoir toujours les éléments utilisés triés par ordre croissant après l’insertion.

— Pour retirer le maximum du tableau, on retourne tout simplement le dernier élément de la partie utilisée (et on décrémente la taille).

2

(3)

5 Utilisation pour trier

Essayer cette nouvelle implantation des files de priorité.

Quelle est la complexité de ces fonctions de tri ?

6 Implantation par un tas

Voir la définition destas binairessur wikipédia et utiliser un tas pour implanterfileprio. Remarquer que l’implan- tation peut se faire comme précédemment avec un enregistrement contenant un tableau, la taille effectivement utilisée et la fonction de comparaison. (Mais cette fois-ci le tableau sert à représenter un arbre binaire quasi-complet ; voir aussi l’articleArbre binaire, partieMéthode pour stocker des arbres binaires).

7 Utilisation pour trier

Essayer cette nouvelle implantation des files de priorité.

Quelle est la complexité de ces fonctions de tri ?

3

Références

Documents relatifs

Cette op´ eration permet de diminuer la cl´ e d’un ´ el´ ement pr´ esent dans la file.. Nous allons donc pr´ esenter ce mod` ele en d´ etail, mais nous commen¸cons par pr´

[r]

COMPÉTENCE : MOBILISER LE LANGAGE ORAL : ACQUÉRIR UNE CONSCIENCE PHONOLOGIQUE : MANIPULER DES SYLLABES : Dénombrer le nombre de syllabes des mots.. CONSIGNE : Découpe et colle

[r]

Voici les niveaux de priorité sur les opérateurs du plus fort au plus faible

• Un tas avec clés gère des données avec priorités : – les données sont dans le tableau (ici tas) – les priorités sont dans un deuxième tableau

• La sous-couche p peut contenir au maximum 6 électrons Exemple : Atome de soufre S (Z= 16) 16 électrons à répartir.. Thème 1 : CONSTITUTION ET TRANSFORMATIONS DE LA MATIÈRE

⇒ Arbre binaire quasi complet de profondeur n : toutes les feuilles sont de profondeur n ou n-1 ; à la profondeur n-1, les nœuds non feuille sont à gauche (les