Files - Éric Beaudry
Transcription
Files - Éric Beaudry
Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices INF3105 – Files (queue / deque) Éric Beaudry Université du Québec à Montréal (UQAM) 2016A Éric Beaudry (UQAM) INF3105 - Files 2016A 1 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Sommaire 1 Introduction 2 Implémentation tableau ciculaire 3 Implémentation liste (cellules) 4 Exercices File avec liste de cellules Éric Beaudry (UQAM) INF3105 - Files 2016A 2 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Les files Structure de données simple, similaire à la pile. Analogie : file d’attente dans une cafétéria. Modèle FIFO : first-in-first-out (premier arrivé, premier servi). Éric Beaudry (UQAM) INF3105 - Files 2016A 3 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Exemples d’applications File d’impression. Buffers (mémoire tampon) dans les protocoles réseaux. Traitement des événements dans un sytème GUI. Etc. Éric Beaudry (UQAM) INF3105 - Files 2016A 4 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Interface abstraite d’une file standard enfiler(e) defiler() tete() taille() vide() enqueue(e) dequeue() front() size() empty() Éric Beaudry (UQAM) Ajoute e à la queue de la file. Enlève l’élément à la tête de la file. Retourne l’élément à la tête. Retourne le nombre d’éléments dans la file. Retourne vrai si la file est vide, sinon faux. INF3105 - Files 2016A 5 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Interface standard C++ d’une file template <class T> class File { public: File(); ~File(); int taille() const; // optionnel bool vide() const; void vider() const; const T& tete() const; // retourne sans enlever l’element en tete void enfiler(const T& e); // Au choix, l’une des fonctions suivantes : T defiler(); // retourne et enleve l’element a la tete void defiler(); // enleve l’element a la tete void defiler(T& e); // copie l’element a la tete dans sortie et l’enleve }; Éric Beaudry (UQAM) INF3105 - Files 2016A 6 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Représentation C++ d’une file Fichier entête partiel file.h template <class T> class FileCirculaire{ public: FileCirculaire(int capacite=100}; ~FileCirculaire(); int taille() const; bool vide() const; const T& tete() const; void enfiler(const T& e); T defiler(); private: T∗ elements; int capacite; // capacite de elements int f; // index sur la tete (front) int r; // index sur la cellule suivant la queue (rear) int n; // nombre d’elements dans la file }; Éric Beaudry (UQAM) INF3105 - Files 2016A 7 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Représentation d’une file ciculaire elements f=2 n=8 r 0 f elements ... f=8 n=N-3 0 Éric Beaudry (UQAM) r f INF3105 - Files N-1 r=5 ... N-1 r=11 2016A 8 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Constructeur Version 1 template <class T> FileCirculaire<T>::FileCirculaire(int _capacity) { capacite = _capacity; elements = new T[capacite]; f = r = 0; n = 0; } Version 2 template <class T> FileCirculaire<T>::FileCirculaire(int _capacity) : elements(new T[initCap]), capacite(_capacity), f(0), r(0), n(0) { } Éric Beaudry (UQAM) INF3105 - Files 2016A 9 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Destructeur template <class T> FileCirculaire<T>::~FileCirculaire() { delete[] elements; //elements = NULL; // optionnel } Éric Beaudry (UQAM) INF3105 - Files 2016A 10 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Fonctions (1) template <class T> int FileCirculaire<T>::taille() const { return n; } template <class T> bool FileCirculaire<T>::vide() const { return n == 0; } template <class T> const T& FileCirculaire<T>::tete() const { assert(!vide()); return elements[f]; } Éric Beaudry (UQAM) INF3105 - Files 2016A 11 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Fonctions (2) template <class T>void FileCirculaire<T>::enfiler(const T& element) { assert(taille()<capacite); // On peut aussi reallouer le tableau dynamiquement elements[r] = element; r = (r+1) % capacite; n++; } template <class T> void FileCirculaire<T>::defiler() { assert(!vide()); f = (f+1) % capacite; n−−; } Éric Beaudry (UQAM) INF3105 - Files 2016A 12 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Analyse des opérations Opération Complexité enfiler(e) defiler() tete() taille() vide() O(1) O(1) O(1) O(1) O(1) Remarques similaire à la pile Si on permet la réallocation du tableau, voir enfiler n’est pas toujours O(1). Voir pile. Lorsque le nombre d’éléments est difficile à estimer à l’avance, la perte d’espace (au pire n/2) est difficile à éviter. Éric Beaudry (UQAM) INF3105 - Files 2016A 13 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Représentation naïve (intuitive) d’une file liste avec des cellules tete queue 1 Éric Beaudry (UQAM) 2 3 INF3105 - Files 4 2016A 14 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Représentation naïve (intuitive) d’une file en C++ template <class T> class FileNaive{ public: File(); ~File(); bool vide() const; const T& tete() const; void enfiler(const T&); void defiler(); private: class Cellule{ public: Cellule(const T& c, Cellule∗ s) : contenu(c), suivante(s) T contenu; Cellule∗ suivante; }; Cellule∗ queue; Cellule∗ tete }; Éric Beaudry (UQAM) INF3105 - Files 2016A 15 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Représentation d’une file liste avec des cellules queue 1 Éric Beaudry (UQAM) 2 3 INF3105 - Files 4 2016A 16 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Représentation C++ d’une file template <class T> class File{ public: File(); ~File(); bool vide() const; void vider() const; const T& tete() const; void enfiler(const T&); void defiler(); private: class Cellule{ public: Cellule(const T& c, Cellule∗ s=NULL) : contenu(d), suivante(s) // ou {contenu=c;} T contenu; Cellule∗ suivante; }; Cellule∗ queue; }; Éric Beaudry (UQAM) INF3105 - Files 2016A 17 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Constructeur Version 1 template <class T> File<T>::File() { queue = NULL; } Version 2 template <class T> File<T>::File() : queue(NULL) { } Éric Beaudry (UQAM) INF3105 - Files 2016A 18 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Destructeur Version 1 template <class T> File<T>::~File() { while(!vide()) defiler(); } Version 2 template <class T> File<T>::~File() { vider(); } Éric Beaudry (UQAM) INF3105 - Files 2016A 19 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Fonctions vide() et tete() template <class T> bool File<T>::vide() const { return queue==NULL; } template <class T> const T& File<T>::tete() const { assert(queue!=NULL); return queue−>suivante−>contenu; } Éric Beaudry (UQAM) INF3105 - Files 2016A 20 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Enfiler template <class T> void File<T>::enfiler(const T& element) { if(queue==NULL){ queue = new Cellule(element); queue−>suivante = queue; }else queue = queue−>suivante = new Cellule(e, queue−>suivante); } Éric Beaudry (UQAM) INF3105 - Files 2016A 21 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Defiler template <class T> void File<T>::defiler() { Cellule∗ c = queue−>suivante; //T e = c−>contenu; if(queue==c) queue = NULL; else queue−> suivante = c−>suivante; delete c; // return e; } Éric Beaudry (UQAM) INF3105 - Files 2016A 22 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Vider Version 1 template <class T> void File<T>::vider() { while(!vide()) defiler(); } Version 2 template <class T> void File<T>::vider() { Cellule∗ fin = queue; while(queue!=NULL){ Cellule∗ suivante = queue−>suivante; if(suivante==fin) suivante = NULL; delete queue; queue = suivante; } } Éric Beaudry (UQAM) INF3105 - Files 2016A 23 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Analyse des opérations Opération Complexité enfiler(e) defiler() tete() taille() vide() O(1) O(1) O(1) O(1) O(1) Remarques Hypothèse requise : allocation et désallocation de mémoire (opérateurs new et delete) en temps constant, i.e. O(1). Cela dépend de l’allocateur de mémoire (compilateur + système d’exploitation). Espace mémoire : on a besoin d’un pointeur par cellule. Négligeable quand les objets sont gros. Éric Beaudry (UQAM) INF3105 - Files 2016A 24 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Opérateur == template <class T> bool File<T>::operator==(const File<T>& autre) const { }; Éric Beaudry (UQAM) INF3105 - Files 2016A 25 / 26 Introduction Implémentation tableau ciculaire Implémentation liste (cellules) Exercices Opérateur = template <class T> File<T>& File<T>::operator=(const File<T>& autre) { return ∗this; }; Éric Beaudry (UQAM) INF3105 - Files 2016A 26 / 26