A Heap
is the nodes of the pairing heap.
Each node have two pointers: child
going to the first child of this node,
and sibling
goes to the next sibling of this tree.
So it actually encodes a forest where each node has children
node.child
, node.child.sibling
, node.child.sibling.sibling
, etc.
Each edge in this forest denotes a le a b
relation that has been checked, so
the root is smaller than everything else under it.
- nil: {α : Type u} → Batteries.PairingHeapImp.Heap α
An empty forest, which has depth
0
. - node: {α : Type u} → α → Batteries.PairingHeapImp.Heap α → Batteries.PairingHeapImp.Heap α → Batteries.PairingHeapImp.Heap α
A forest consists of a root
a
, a forestchild
elements greater thana
, and another forestsibling
.
Instances For
Equations
- Batteries.PairingHeapImp.instReprHeap = { reprPrec := Batteries.PairingHeapImp.reprHeap✝ }
O(n)
. The number of elements in the heap.
Equations
- Batteries.PairingHeapImp.Heap.nil.size = 0
- (Batteries.PairingHeapImp.Heap.node a a_1 a_2).size = a_1.size + 1 + a_2.size
Instances For
A node containing a single element a
.
Equations
- Batteries.PairingHeapImp.Heap.singleton a = Batteries.PairingHeapImp.Heap.node a Batteries.PairingHeapImp.Heap.nil Batteries.PairingHeapImp.Heap.nil
Instances For
O(1)
. Is the heap empty?
Instances For
O(1)
. Merge two heaps. Ignore siblings.
Equations
- One or more equations did not get rendered due to their size.
- Batteries.PairingHeapImp.Heap.merge le Batteries.PairingHeapImp.Heap.nil Batteries.PairingHeapImp.Heap.nil = Batteries.PairingHeapImp.Heap.nil
Instances For
Auxiliary for Heap.deleteMin
: merge the forest in pairs.
Equations
- One or more equations did not get rendered due to their size.
- Batteries.PairingHeapImp.Heap.combine le x = x
Instances For
O(1)
. Get the smallest element in the heap, including the passed in value a
.
Equations
- Batteries.PairingHeapImp.Heap.headD a Batteries.PairingHeapImp.Heap.nil = a
- Batteries.PairingHeapImp.Heap.headD a (Batteries.PairingHeapImp.Heap.node a_1 a_2 a_3) = a_1
Instances For
O(1)
. Get the smallest element in the heap, if it has an element.
Equations
- Batteries.PairingHeapImp.Heap.nil.head? = none
- (Batteries.PairingHeapImp.Heap.node a a_1 a_2).head? = some a
Instances For
Amortized O(log n)
. Find and remove the the minimum element from the heap.
Equations
- Batteries.PairingHeapImp.Heap.deleteMin le Batteries.PairingHeapImp.Heap.nil = none
- Batteries.PairingHeapImp.Heap.deleteMin le (Batteries.PairingHeapImp.Heap.node a a_1 a_2) = some (a, Batteries.PairingHeapImp.Heap.combine le a_1)
Instances For
Amortized O(log n)
. Get the tail of the pairing heap after removing the minimum element.
Equations
- Batteries.PairingHeapImp.Heap.tail? le h = Option.map (fun (x : α × Batteries.PairingHeapImp.Heap α) => x.snd) (Batteries.PairingHeapImp.Heap.deleteMin le h)
Instances For
Amortized O(log n)
. Remove the minimum element of the heap.
Equations
- Batteries.PairingHeapImp.Heap.tail le h = (Batteries.PairingHeapImp.Heap.tail? le h).getD Batteries.PairingHeapImp.Heap.nil
Instances For
A predicate says there is no more than one tree.
- nil: ∀ {α : Type u_1}, Batteries.PairingHeapImp.Heap.nil.NoSibling
An empty heap is no more than one tree.
- node: ∀ {α : Type u_1} (a : α) (c : Batteries.PairingHeapImp.Heap α),
(Batteries.PairingHeapImp.Heap.node a c Batteries.PairingHeapImp.Heap.nil).NoSibling
Or there is exactly one tree.
Instances For
O(n log n)
. Monadic fold over the elements of a heap in increasing order,
by repeatedly pulling the minimum element out of the heap.
Equations
- One or more equations did not get rendered due to their size.
Instances For
O(n log n)
. Fold over the elements of a heap in increasing order,
by repeatedly pulling the minimum element out of the heap.
Equations
- Batteries.PairingHeapImp.Heap.fold le s init f = (Batteries.PairingHeapImp.Heap.foldM le s init f).run
Instances For
O(n log n)
. Convert the heap to an array in increasing order.
Equations
- Batteries.PairingHeapImp.Heap.toArray le s = Batteries.PairingHeapImp.Heap.fold le s #[] Array.push
Instances For
O(n log n)
. Convert the heap to a list in increasing order.
Equations
- Batteries.PairingHeapImp.Heap.toList le s = (Batteries.PairingHeapImp.Heap.toArray le s).toList
Instances For
O(n)
. Fold a monadic function over the tree structure to accumulate a value.
Equations
- One or more equations did not get rendered due to their size.
- Batteries.PairingHeapImp.Heap.foldTreeM nil join Batteries.PairingHeapImp.Heap.nil = pure nil
Instances For
O(n)
. Fold a function over the tree structure to accumulate a value.
Equations
- Batteries.PairingHeapImp.Heap.foldTree nil join s = (Batteries.PairingHeapImp.Heap.foldTreeM nil join s).run
Instances For
O(n)
. Convert the heap to a list in arbitrary order.
Equations
Instances For
O(n)
. Convert the heap to an array in arbitrary order.
Equations
- s.toArrayUnordered = Batteries.PairingHeapImp.Heap.foldTree id (fun (a : α) (c s : Array α → Array α) (r : Array α) => s (c (r.push a))) s #[]
Instances For
The well formedness predicate for a heap node. It asserts that:
- If
a
is added at the top to make the forest into a tree, the resulting tree is ale
-min-heap (ifle
is well-behaved)
Equations
- One or more equations did not get rendered due to their size.
- Batteries.PairingHeapImp.Heap.NodeWF le a Batteries.PairingHeapImp.Heap.nil = True
Instances For
The well formedness predicate for a pairing heap. It asserts that:
- There is no more than one tree.
- It is a
le
-min-heap (ifle
is well-behaved)
- nil: ∀ {α : Type u_1} {le : α → α → Bool}, Batteries.PairingHeapImp.Heap.WF le Batteries.PairingHeapImp.Heap.nil
It is an empty heap.
- node: ∀ {α : Type u_1} {le : α → α → Bool} {a : α} {c : Batteries.PairingHeapImp.Heap α},
Batteries.PairingHeapImp.Heap.NodeWF le a c →
Batteries.PairingHeapImp.Heap.WF le (Batteries.PairingHeapImp.Heap.node a c Batteries.PairingHeapImp.Heap.nil)
There is exactly one tree and it is a
le
-min-heap.
Instances For
A pairing heap is a data structure which supports the following primary operations:
insert : α → PairingHeap α → PairingHeap α
: add an element to the heapdeleteMin : PairingHeap α → Option (α × PairingHeap α)
: remove the minimum element from the heapmerge : PairingHeap α → PairingHeap α → PairingHeap α
: combine two heaps
The first two operations are known as a "priority queue", so this could be called
a "mergeable priority queue". The standard choice for a priority queue is a binary heap,
which supports insert
and deleteMin
in O(log n)
, but merge
is O(n)
.
With a PairingHeap
, insert
and merge
are O(1)
, deleteMin
is amortized O(log n)
.
Note that deleteMin
may be O(n)
in a single operation. So if you need an efficient
persistent priority queue, you should use other data structures with better worst-case time.
Equations
- Batteries.PairingHeap α le = { h : Batteries.PairingHeapImp.Heap α // Batteries.PairingHeapImp.Heap.WF le h }
Instances For
O(1)
. Make a new empty pairing heap.
Equations
- Batteries.mkPairingHeap α le = ⟨Batteries.PairingHeapImp.Heap.nil, ⋯⟩
Instances For
O(1)
. Make a new empty pairing heap.
Equations
- Batteries.PairingHeap.empty = Batteries.mkPairingHeap α le
Instances For
Equations
- Batteries.PairingHeap.instInhabited = { default := Batteries.PairingHeap.empty }
O(1)
. Is the heap empty?
Equations
- b.isEmpty = b.val.isEmpty
Instances For
O(n)
. The number of elements in the heap.
Equations
- b.size = b.val.size
Instances For
O(1)
. Make a new heap containing a
.
Equations
Instances For
O(1)
. Merge the contents of two heaps.
Equations
- Batteries.PairingHeap.merge ⟨b₁, h₁⟩ ⟨b₂, h₂⟩ = ⟨Batteries.PairingHeapImp.Heap.merge le b₁ b₂, ⋯⟩
Instances For
O(1)
. Add element a
to the given heap h
.
Equations
- Batteries.PairingHeap.insert a h = (Batteries.PairingHeap.singleton a).merge h
Instances For
O(n log n)
. Construct a heap from a list by inserting all the elements.
Equations
- Batteries.PairingHeap.ofList le as = List.foldl (flip Batteries.PairingHeap.insert) Batteries.PairingHeap.empty as
Instances For
O(n log n)
. Construct a heap from a list by inserting all the elements.
Equations
- Batteries.PairingHeap.ofArray le as = Array.foldl (flip Batteries.PairingHeap.insert) Batteries.PairingHeap.empty as
Instances For
Amortized O(log n)
. Remove and return the minimum element from the heap.
Equations
- b.deleteMin = match eq : Batteries.PairingHeapImp.Heap.deleteMin le b.val with | none => none | some (a, tl) => some (a, ⟨tl, ⋯⟩)
Instances For
O(1)
. Returns the smallest element in the heap, or none
if the heap is empty.
Equations
- b.head? = b.val.head?
Instances For
O(1)
. Returns the smallest element in the heap, or panics if the heap is empty.
Equations
- b.head! = b.head?.get!
Instances For
O(1)
. Returns the smallest element in the heap, or default
if the heap is empty.
Equations
- b.headI = b.head?.getD default
Instances For
Amortized O(log n)
. Removes the smallest element from the heap, or none
if the heap is empty.
Equations
- b.tail? = match eq : Batteries.PairingHeapImp.Heap.tail? le b.val with | none => none | some tl => some ⟨tl, ⋯⟩
Instances For
Amortized O(log n)
. Removes the smallest element from the heap, if possible.
Equations
- b.tail = ⟨Batteries.PairingHeapImp.Heap.tail le b.val, ⋯⟩
Instances For
O(n log n)
. Convert the heap to a list in increasing order.
Equations
- b.toList = Batteries.PairingHeapImp.Heap.toList le b.val
Instances For
O(n log n)
. Convert the heap to an array in increasing order.
Equations
- b.toArray = Batteries.PairingHeapImp.Heap.toArray le b.val
Instances For
O(n)
. Convert the heap to a list in arbitrary order.
Equations
- b.toListUnordered = b.val.toListUnordered
Instances For
O(n)
. Convert the heap to an array in arbitrary order.
Equations
- b.toArrayUnordered = b.val.toArrayUnordered