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