Menu
Coddy logo textTech

Queue (file)

Dernière mise à jour

Une file a deux extrémités actives. Les nouvelles valeurs rejoignent la queue de la file, et les valeurs sortent par la tête : celle qui a attendu le plus longtemps est donc servie en premier. C'est cela, FIFO, et c'est exactement le comportement d'une file d'attente à un guichet : se placer au bout et être servi à l'avant, voilà ce qui rend l'attente équitable. Lancez la lecture ci-dessus et regardez les valeurs entrer d'un côté et sortir de l'autre.

Comme chaque extrémité est suivie par son propre indice ou pointeur, les deux opérations sont en O(1) et aucune ne décale le reste des données. C'est pourquoi les files se trouvent sous tout ce qui traite le travail dans l'ordre d'arrivée : travaux d'impression, files de tâches et de messages, tampons de requêtes, et le parcours en largeur, qui visite un graphe niveau par niveau précisément parce qu'il garde sa frontière dans une file. Déplacez l'extrémité de retrait vers l'arrière et vous obtenez un Stack (pile).

Complexité en temps et en espace

Pour une file fondée sur un tampon circulaire ou sur une liste chaînée, les deux implémentations classiques :

OpérationComplexitéRemarques
EnfilerO(1)Écrire en queue et avancer l'indice de queue.
DéfilerO(1)Lire en tête et avancer l'indice de tête, sans aucun décalage.
Peek (tête)O(1)Lit la valeur en tête sans la retirer.
RechercheO(n)Ce n'est pas le rôle d'une file : il faut la vider pour regarder dedans.
EspaceO(n)Un emplacement par valeur en attente.

Étape par étape

ÉtapeCe qui se passe
1La file démarre vide, la tête et la queue pointant sur le même emplacement.
2Enfiler écrit la valeur en queue, puis avance la queue d'un cran.
3Chaque nouvel enfilement se place derrière les valeurs déjà en attente.
4Défiler lit la valeur en tête, puis avance la tête d'un cran.
5La valeur renvoyée est toujours celle qui a attendu le plus longtemps.
6Quand la tête rejoint la queue, la file est de nouveau vide, et continuer à défiler est une erreur.

Exemple détaillé

Enfilement de 3, 7, 5 puis vidage de la file :

OpérationFile (de la tête à la queue)Renvoie
enqueue(3)[3]rien
enqueue(7)[3, 7]rien
enqueue(5)[3, 7, 5]rien
dequeue()[7, 5]3, la valeur la plus ancienne
dequeue()[5]7
dequeue()[]5, la plus récente, en dernier

Quand utiliser une file

À utiliser quandÀ éviter quand
Le travail doit être traité dans l'ordre d'arrivée : files de tâches, tampons de requêtes, spouleurs d'impressionVous voulez d'abord l'élément le plus récent, ce qui est un Stack (pile)
Vous explorez niveau par niveau, comme le fait le parcours en largeurLes éléments doivent être servis par priorité plutôt que par ordre d'arrivée, où un tas convient
Un producteur et un consommateur avancent à des vitesses différentes et ont besoin d'un tampon entre euxVous devez chercher ou indexer au milieu des données
Vous voulez une insertion et un retrait O(1) sans décaler les élémentsVous l'implémenteriez en décalant un tableau à chaque défilement, ce qui la rend O(n)

Code de Queue

Une implémentation propre et exécutable de Queue en Python, JavaScript, Java, C++, C. Choisissez un langage, copiez le code ou ouvrez-le préchargé dans le Playground Coddy.

Code de Queue en Python

Python
1from collections import deque2
3queue = deque()4
5# Enqueue three values at the rear6for value in [3, 7, 5]:7    queue.append(value)8    print(f"enqueue {value} -> {list(queue)}")9
10# Dequeue them from the front: first in, first out11while queue:12    value = queue.popleft()13    print(f"dequeue {value} -> {list(queue)}")14
15print("empty:", len(queue) == 0)
Exécutez ce code dans le Playground Python

FAQ sur la file

Que signifie FIFO ?
First in, first out, premier entré, premier sorti : la valeur qui a attendu le plus longtemps est la prochaine servie. La file d'attente à un guichet en est l'image de tous les jours. Un Stack (pile) suit la discipline inverse, LIFO.
Quelle est la différence entre une file et une pile ?
Uniquement l'extrémité par laquelle vous retirez. Les deux ajoutent en queue en O(1) ; une file retire par la tête (FIFO), une pile retire par l'extrémité où elle a ajouté (LIFO). Pour le reste, leurs tableaux de complexité sont identiques.
Quelles sont les principales opérations d'une file ?
enqueue ajoute une valeur en queue, dequeue retire et renvoie la valeur en tête, peek (ou front) lit la tête sans la retirer, et is_empty indique s'il reste quelque chose en attente. Les quatre sont en O(1).
Pourquoi défiler est-il lent si j'utilise un simple tableau ?
Parce que retirer l'indice 0 d'un tableau décale tous les éléments restants vers la gauche, ce qui rend chaque défilement O(n). Les vraies implémentations l'évitent avec un tampon circulaire qui avance un indice de tête, ou avec une liste chaînée munie d'un pointeur de tête. Le collections.deque de Python et l'ArrayDeque de Java le font pour vous, alors que list.pop(0) non.
Qu'est-ce qu'une file circulaire ?
Une file dans un tableau de taille fixe où les indices de tête et de queue reviennent à 0 lorsqu'ils dépassent la fin. Elle réutilise les emplacements libérés par les défilements, si bien qu'une file de capacité n continue de fonctionner indéfiniment au lieu de sortir du tableau.
Où les files sont-elles utilisées dans les vrais programmes ?
Les files de tâches et de messages entre services, les spouleurs d'impression et de travaux, les tampons de requêtes des serveurs web, les tampons de clavier et d'événements, les chaînes producteur-consommateur, et le parcours en largeur, où c'est la file qui fait avancer le parcours niveau par niveau.
Coddy programming languages illustration

Maîtrisez les algorithmes avec Coddy

COMMENCER