. Ecole Nationale Polytechnique Département Génie Industriel Année Universitaire 2011/2012 Algorithmique et Programmation Les structures de données Les Files Introduction Une File ressemble fortement à une liste Fonctionnement : Le premier entré est le premier sorti La file est dite FIFO (First In First Out). Analogie avec une file d attente "premier arrivé, premier servi» Plan du cours Les structures de données linéaires I. Les structures de données Listes II. Les structures de données Piles III. Les structures de données Files Les structures de données Files 1. Introduction 2. Définition du TDA FILE 3. Représentation contiguë Représentation à l aide d un simple tableau Représentation à l aide d un tableau circulaire: Interface et implémentation du TDA 4. Représentation l aide d un liste chainée 5. File particulière (File d attente avec priorité) 6. Conclusion Il y a file «d attente», chaque fois où l'offre est inférieure à la demande. Théorie des files d'attente : étude des solutions optimales de gestion des files d attente Exemple d application pratique : Ordonnancement du traitement des achats d un magasin. Attente des clients aux guichets. Décollage ou à l atterrissage des avions Gestion des réseaux téléphoniques Spouler (File d attente) d une imprimante. Opérations : Insérer = Enfiler, Supprimer = Défiler ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 1 ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 2
Définition du TDA FILE Type File (P) utilise Booléen (B), Elément (E), Entier(N) Opérations Créer : ( ) F Creer(F) : Création d une file vide Enfiler : F x E F Empiler (F,e) : Ajoute un élément à la fin Défiler : F F Défiler (F) : Enlève l élément au début Valeur : F E Valeur (F) renvoie l élément du début Estvide : F B Estvide (F) : test si la file est vide Taille : F N Taille (F) : Nombre d éléments de la file Les opérations Défiler et Valeur ne sont définies que si la file n est pas vide Défiler(F) Estvide(F)=Faux. Valeur(F) Estvide(F)=Faux. Axiomes Soient «e» un élément et «F» une file, «F0» une file vide EstVide(F0)=Vrai EstVide(Enfiler(F,e))=Faux défiler(enfiler(f,e))= enfiler(défiler(f),e) valeur(enfiler(f,e))= valeur(f) valeur(enfiler(f0,e))= e Ces définitions et propriétés sont indépendantes de toute représentation. Représentation contiguë Plusieurs implémentations sont possibles Représentation à l aide d un simple tableau: Une file est [un pointeur sur ]une structure à deux champs : un tableau surdimensionné à taille fixe (NMax), qui contient les éléments de la file. un entier indiquant le nombre d éléments dans la file. Operations L'ajout d'un élément se fera à la suite du dernier élément du tableau. Le retrait d'un élément de la file se fera en enlevant le premier élément du tableau. Il faudra donc décaler les autres éléments vers le début de la file. Complexité des opérations Enfiler : O(1),.Défiler O(n) Représentation à l aide d un tableau circulaire: On utilise un tableau surdimensionné pour sauvegarder les éléments de la file. On utilise deux variables tête et fin o Tête contient l indice du premier élément de la file. o Fin marque la position où ajouter le prochain élément. Le contenu de la file va la case d indice Tête à la case qui précède la case d indice Fin. ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 3 ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 4
Remarques : Progressivement, les deux indices sont croissants. : on incrémente Fin après ajout et on incrémente début après suppression. Si la valeur «fin» de la file atteint la capacité max du tableau, on effectue les ajouts à partir du début du tableau. Les indices tête et fin progressent modulo la taille NMax du tableau. Implémentation des opérations du TDA FileTab #define NMax 100 typedef struct int N, Tete, Fin ; TElement Tab[NMax]; FileTab; Le tableau d une file est un tableau circulaire, que l on parcourt en incrémentant un indice modulo NMax, typedef FileTab * TFileTab ; La file est vide si Tête = Fin Difficulté pour distinguer entre file vide et file pleine Solution 1: On sacrifie une case pour distinguer le cas d une file vide de celui d une file pleine. Une file est "pleine" s il reste une seule case non occupée dans le tableau. (Fin + 1) modulo (NMax) = début Solution 2: Une variable supplémentaire, qui contient le nombre d éléments contenus dans la file. ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 5 Interface du TDA TFileTab TFileTab Creer (); void detruire(tfiletab F); bool EstVide(TFileTab F); bool EstPleine(TFileTab F); TElement Valeur(TFileTab F); TFileTab Enfiler (TFileTab F, TElement e); TFileTab Défiler (TFileTab F); int taille(tfiletab File); Primitives de base du TDA FileTab Creer (); TFileTab F ; F=( TFileTab ) malloc(1*sizeof(filetab )); If (F==NULL) printf(" \nproblème mémoire"); exit(-1) ; F-> Tete= 0 ; F-> Fin= 0 ; F-> N= 0 ; // File vide return(f); ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 6
bool estvide (TFileTab F) return ( F->N==0); bool estvide (TFileTab F) return ( F->N==NMax); //bool estvide () return (tete==fin ); //bool estpleine () // return ( ((fin+1) % NMax) == tete ) TFileTab Enfiler (TFileTab F, TElement e); if ( EstPleine(F) printf(" \n File Pleine ");return(f); F->Tab[fin] = e; Fin=(Fin+1) % NMax; Return(F); TFileTab Defiler(TFileTab F); if (EstVide(F) printf(" \n File Vide "); Else Tete = (Tete + 1) % NMax; Return (F); TElement Valeur(TFileTab F) if (EstVide(F) printf(" \n File Vide ");Exit(-1); TElement x = F->Tab[Tete]; Return (e); Représentation chainée d une File Représentation à l aide d un liste : L implémentation est conceptuellement simple. Les éléments de la file sont dans une liste, Pour garantir des opérations en temps constant : On utilise une référence sur la dernière cellule de liste. On supprime au début de la liste, On ajoute à la fin de la liste. Int Taille(TFileTab F) Return ( );?????? void detruire(tfiletab F); Free()?????? ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 7 ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 8
File particulière (File d attente avec priorité) Dans une file d attente avec priorité Chaque élément e a une priorité dans la file : p(e). Les éléments sont comparés par leurs priorités : e1 < e2 signifie : p(e1) > p(e2) Operations Le retrait se fait toujours du début. Tout nouvel élément est inséré, dans la file, selon sa priorité. o L insertion ne se fait pas toujours à la fin. o Un élément prioritaire prendra la tête de la file même s il arrive le dernier. Conclusion La file ressemble fortement à une liste + FIFO (Fist In, First Out) : Premier arrivé, premier servi. On peut ajouter un élément "à la fin" de la file, si la file n est pas pleine/(possibilité d allocation mémoire) Le seul élément de la file auquel on peut avoir accès est le plus ancien élément qui y a été placé (donc en tête) Implémentation -Réalisation par tableau ou liste. -Pour garantir des opérations en temps constant, on conserve un pointeur (un indice) sur le début et sur la fin. Applications : La file est une structure de données très fréquente dans les programmes. Exemples : Système d exploitation, Temps-réel etc. o Implémentation L implémentation de ces files d attente peut être par tableaux ou listes. L implémentation la plus efficace et la plus utilisée utilise des arbres particuliers : les TAS*. (*) Un TAS est un arbre binaire tel que le contenu de chaque nœud soit supérieur ou égal à celui de ses fils.. ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 9 ENP /2011/2012/G.I /1 Année / Chap4 : S2D, Les Files 10