En informatique, une file de priorité est un type abstrait élémentaire sur laquelle on peut effectuer trois opérations[1] :

  • enfiler un élément ;
  • défiler l'élément ayant la plus grande clé ;
  • tester si la file de priorité est vide ou pas.

Ainsi, elle permet d'implémenter efficacement des planificateurs de tâches, où un accès rapide aux tâches d'importance maximale est souhaité.

Par exemple, on la retrouve dans les ordonnanceurs des systèmes d'exploitation, notamment le noyau Linux[2].

On ajoute parfois à cette liste l'opération « augmenter/diminuer la clé d'un élément », utilisée par exemple dans l'algorithme de Dijkstra.

Implémentations

modifier

Une implémentation simple de la file de priorité consiste à utiliser une liste chaînée non triée. Dans ce cas, la complexité de l'insertion serait O(1) mais celle de l'extraction du plus grand élément serait linéaire en la taille de la structure, causée par la recherche de l'élément de clé maximale. Cette solution est donc inefficace.

D'autres implémentations permettent de réaliser toutes les opérations efficacement, c'est-à-dire en O(1) ou O(log n) (éventuellement en complexité amortie). La principale est le tas, lui-même implémenté via un tableau. D'autres améliorations, plus difficiles à implémenter, existent, telles que le tas binomial et le tas de Fibonacci.

La file de priorité est déjà implémentée dans plusieurs langages de programmation :

  1. En Python, le module heapq[3] implémente la file de priorité.
  2. En C++, la STL fournit une implémentation nommée priority_queue[4]. Ce type de file se base sur un des conteneurs présents dans la STL (liste, vecteur, etc.) et manipule des objets d'un type défini par l'utilisateur. Il est nécessaire de fournir une fonction de comparaison qui permettra à la bibliothèque d'ordonner la file.
  3. En Java, c'est la classe PriorityQueue[5] qui implémente la file de priorité.

Tri par file de priorité

modifier

Un tri par file de priorité est un algorithme de tri utilisant comme unique support une implémentation de file de priorité et donc seulement ses trois opérations classiques : enfiler, défiler et tester le vide[6].

Beaucoup d'algorithmes de tri classiques sont des tris par file de priorité. On y retrouve naturellement tous les tris par tas comme le tri par tas binaire ou le smoothsort. Mais aussi des tris plus classiques comme le tri par insertion et le tri par sélection.

Enfin, de façon moins connue, avec des files de priorités implémentées par des arbres binaires de recherche on retrouve le tri arborescent et son cas particulier le tri rapide.

Utilisations notables

modifier

Les algorithmes suivants doivent leur efficacité à la structure de tas :

La file de priorité peut notamment être utilisée comme optimisation de l'algorithme algorithme A* en facilitant l'accès au meilleur nœud stocké dans la liste des nœuds ouverts (open list).

Références

modifier

📚 Artikel Terkait di Wikipedia

Tas (informatique)

Les tas sont représentés en machine par des tableaux et la méthode priority_queue permet l'utilisation directe de la structure dans une file de priorité

Collection (type de données)

retire l'élément supérieur. Article détaillé : Queue (abstract data type). Article détaillé : Priority queue. Dans une file de priorité, les traces de l'élément

Problème de plus court chemin

 47–74 (DOI 10.1016/s0304-3975(03)00402-x) Mikkel Thorup, « Integer priority queues with decrease key in constant time and the single source shortest paths

Bibliothèque standard du C++

tableau associatif et une multimap. <queue> Fournit une classe patron std::queue, une file, et std::priority_queue. <set> Fournit les classes patron std::set

Tas binomial

l’édition] (en) J. Vuillemin, « A data structure for manipulating priority queues », dans Communications of the ACM 21(1978), 309-314. (en) Une simulation

Tri par file de priorité

(consulté le 16 octobre 2024) Mikkel Thorup, « Equivalence between priority queues and sorting », J. ACM, vol. 54, no 6,‎ 1er décembre 2007, p. 28–es

Arbre de Van Emde Boas

R. Kaas et E. Zijlstra, « Design and implementation of an efficient priority queue », Mathematical Systems Theory, vol. 10,‎ 1976, p. 99–127 (DOI 10.1007/BF01683268l

Jean Vuillemin

1975, p. 6–11. Vuillemin, Jean, « A Data Structure for Manipulating Priority Queues », Communications of the ACM, vol. 21, no 4, 1978, p. 309–314. Vuillemin