Pqueue(3)

πŸ’– Pqueue(3) β€” priority queues, bestie πŸ’–

okay so this is the Pqueue page from the OCaml library, manual section 3 β€” and it's literally all about priority queues, no cap. πŸ’…


πŸŽ€ NAME πŸŽ€

Pqueue β€” priority queues. That's the whole name section, periodt. ✨

πŸ“¦ Module

Module Pqueue

✨ Documentation ✨

Module Pqueue : sig end

Priority queues. 🫢

The Pqueue module implements a data structure of priority queues, given a totally ordered type for elements. This is a mutable data structure. Both min- and max-priority queues are provided. πŸ’–

The implementation uses a heap stored in a dynamic array, and is therefore reasonably efficient: accessing the minimum (resp. maximum) element takes constant time, and insertion and removal take time logarithmic in the size of the priority queue. Note that of_array runs in linear time (and thus must be preferred to repeated insertions with add). ⚑

It is fine to have several elements with the same priority. Nothing is guaranteed regarding the order in which they will be popped. However, it is guaranteed that the element returned by min_elt (or get_min_elt) is the one that is removed from the priority queue by pop_min (or remove_min). This is important in many algorithms, (e.g. when peeking at several priority queues and then selecting one to remove from). πŸ‘‘

Since 5.4 ✨

  • module type OrderedType = sig end β€” input signature of the functors Pqueue.MakeMin and Pqueue.MakeMax. πŸŽ€
  • module type Min = sig end β€” output signature of the functor Pqueue.MakeMin. πŸ’–
  • module MakeMin : (E : OrderedType) -> sig end β€” functor building an implementation of the min-priority queue structure given a totally ordered type for elements. 🌸
  • module type Max = sig end β€” output signature of the functor Pqueue.MakeMax. πŸ’œ
  • module MakeMax : (E : OrderedType) -> sig end β€” functor building an implementation of the max-priority queue structure given a totally ordered type for elements. πŸ¦‹

🌈 Polymorphic priority queues 🌈

The following, more complex functors create polymorphic queues of type 'a t, just like other polymorphic containers (lists, arrays...). They require a notion of "polymorphic elements" 'a elt that can be compared without depending on the values of 'a. 🧚

One usage scenario is when the user wants to pass priorities separately from the value stored in the queue. This is done by using pairs priority * 'a as elements. πŸ“

module Prio : OrderedType = ...

module PrioQueue = Pqueue.MakeMinPoly(struct
  type 'a t = Prio.t * 'a
  let compare (p1, _) (p2, _) = Prio.compare p1 p2
end)

(* for example, we now have: *)
PrioQueue.add: 'a PrioQueue.t -> Prio.t * 'a -> unit
PrioQueue.min_elt: 'a PrioQueue.t -> (Prio.t * 'a) option
  • module type OrderedPolyType = sig end β€” input signature of the functors Pqueue.MakeMinPoly and Pqueue.MakeMaxPoly. πŸ’«
  • module type MinPoly = sig end β€” output signature of the functor Pqueue.MakeMinPoly. 🌟
  • module MakeMinPoly : (E : OrderedPolyType) -> sig end β€” functor building an implementation of min-priority queues given a totally ordered type for the elements. πŸŽ€
  • module type MaxPoly = sig end β€” output signature of the functor Pqueue.MakeMaxPoly. πŸ’œ
  • module MakeMaxPoly : (E : OrderedPolyType) -> sig end β€” functor building an implementation of max-priority queues given a totally ordered type for the elements. πŸ”₯

πŸ’œβœ¨ this page's footer credits OCamldoc, dated 2026-06-22 β€” source/version and date, bestie, periodt. βœ¨πŸ’œ

πŸ“¦ where this page comes from