A HeapNode
is one of the internal nodes of the binomial heap.
It is always a perfect binary tree, with the depth of the tree stored in the Heap
.
However the interpretation of the two pointers is different: we view the child
as 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.BinomialHeap.Imp.HeapNode α
An empty forest, which has depth
0
. - node: {α : Type u} →
α →
Batteries.BinomialHeap.Imp.HeapNode α →
Batteries.BinomialHeap.Imp.HeapNode α → Batteries.BinomialHeap.Imp.HeapNode α
A forest of rank
r + 1
consists of a roota
, a forestchild
of rankr
elements greater thana
, and another forestsibling
of rankr
.
Instances For
Equations
- Batteries.BinomialHeap.Imp.instReprHeapNode = { reprPrec := Batteries.BinomialHeap.Imp.reprHeapNode✝ }
The "real size" of the node, counting up how many values of type α
are stored.
This is O(n)
and is intended mainly for specification purposes.
For a well formed HeapNode
the size is always 2^n - 1
where n
is the depth.
Equations
- Batteries.BinomialHeap.Imp.HeapNode.nil.realSize = 0
- (Batteries.BinomialHeap.Imp.HeapNode.node a a_1 a_2).realSize = a_1.realSize + 1 + a_2.realSize
Instances For
A node containing a single element a
.
Equations
- Batteries.BinomialHeap.Imp.HeapNode.singleton a = Batteries.BinomialHeap.Imp.HeapNode.node a Batteries.BinomialHeap.Imp.HeapNode.nil Batteries.BinomialHeap.Imp.HeapNode.nil
Instances For
O(log n)
. The rank, or the number of trees in the forest.
It is also the depth of the forest.
Equations
- Batteries.BinomialHeap.Imp.HeapNode.nil.rank = 0
- (Batteries.BinomialHeap.Imp.HeapNode.node a a_1 a_2).rank = a_2.rank + 1
Instances For
A Heap
is the top level structure in a binomial heap.
It consists of a forest of HeapNode
s with strictly increasing ranks.
- nil: {α : Type u} → Batteries.BinomialHeap.Imp.Heap α
An empty heap.
- cons: {α : Type u} → Nat → α → Batteries.BinomialHeap.Imp.HeapNode α → Batteries.BinomialHeap.Imp.Heap α → Batteries.BinomialHeap.Imp.Heap α
Instances For
Equations
- Batteries.BinomialHeap.Imp.instReprHeap = { reprPrec := Batteries.BinomialHeap.Imp.reprHeap✝ }
O(n)
. The "real size" of the heap, counting up how many values of type α
are stored.
This is intended mainly for specification purposes.
Prefer Heap.size
, which is the same for well formed heaps.
Equations
- Batteries.BinomialHeap.Imp.Heap.nil.realSize = 0
- (Batteries.BinomialHeap.Imp.Heap.cons a a_1 a_2 a_3).realSize = a_2.realSize + 1 + a_3.realSize
Instances For
O(log n)
. The number of elements in the heap.
Equations
- Batteries.BinomialHeap.Imp.Heap.nil.size = 0
- (Batteries.BinomialHeap.Imp.Heap.cons a a_1 a_2 a_3).size = 1 <<< a + a_3.size
Instances For
O(1)
. Is the heap empty?
Instances For
O(1)
. The heap containing a single value a
.
Equations
- Batteries.BinomialHeap.Imp.Heap.singleton a = Batteries.BinomialHeap.Imp.Heap.cons 0 a Batteries.BinomialHeap.Imp.HeapNode.nil Batteries.BinomialHeap.Imp.Heap.nil
Instances For
O(1)
. Auxiliary for Heap.merge
: Is the minimum rank in Heap
strictly larger than n
?
Equations
- Batteries.BinomialHeap.Imp.Heap.nil.rankGT x = True
- (Batteries.BinomialHeap.Imp.Heap.cons r val node next).rankGT x = (x < r)
Instances For
Equations
- Batteries.BinomialHeap.Imp.instDecidableRankGT = inferInstanceAs (Decidable True)
- Batteries.BinomialHeap.Imp.instDecidableRankGT = inferInstanceAs (Decidable (n < a))
O(log n)
. The number of trees in the forest.
Equations
- Batteries.BinomialHeap.Imp.Heap.nil.length = 0
- (Batteries.BinomialHeap.Imp.Heap.cons a a_1 a_2 a_3).length = a_3.length + 1
Instances For
O(1)
. Auxiliary for Heap.merge
: combines two heap nodes of the same rank
into one with the next larger rank.
Equations
- Batteries.BinomialHeap.Imp.combine le a₁ a₂ n₁ n₂ = if le a₁ a₂ = true then (a₁, Batteries.BinomialHeap.Imp.HeapNode.node a₂ n₂ n₁) else (a₂, Batteries.BinomialHeap.Imp.HeapNode.node a₁ n₁ n₂)
Instances For
Merge two forests of binomial trees. The forests are assumed to be ordered
by rank and merge
maintains this invariant.
Equations
- One or more equations did not get rendered due to their size.
- Batteries.BinomialHeap.Imp.Heap.merge le Batteries.BinomialHeap.Imp.Heap.nil x = x
- Batteries.BinomialHeap.Imp.Heap.merge le x Batteries.BinomialHeap.Imp.Heap.nil = x
Instances For
O(log n)
. Convert a HeapNode
to a Heap
by reversing the order of the nodes
along the sibling
spine.
Equations
- s.toHeap = Batteries.BinomialHeap.Imp.HeapNode.toHeap.go s s.rank Batteries.BinomialHeap.Imp.Heap.nil
Instances For
Computes s.toHeap ++ res
tail-recursively, assuming n = s.rank
.
Equations
- One or more equations did not get rendered due to their size.
- Batteries.BinomialHeap.Imp.HeapNode.toHeap.go Batteries.BinomialHeap.Imp.HeapNode.nil x✝ x = x
Instances For
O(log n)
. Get the smallest element in the heap, including the passed in value a
.
Equations
- Batteries.BinomialHeap.Imp.Heap.headD le a Batteries.BinomialHeap.Imp.Heap.nil = a
- Batteries.BinomialHeap.Imp.Heap.headD le a (Batteries.BinomialHeap.Imp.Heap.cons a_1 a_2 a_3 a_4) = Batteries.BinomialHeap.Imp.Heap.headD le (if le a a_2 = true then a else a_2) a_4
Instances For
O(log n)
. Get the smallest element in the heap, if it has an element.
Equations
- Batteries.BinomialHeap.Imp.Heap.head? le Batteries.BinomialHeap.Imp.Heap.nil = none
- Batteries.BinomialHeap.Imp.Heap.head? le (Batteries.BinomialHeap.Imp.Heap.cons a a_1 a_2 a_3) = some (Batteries.BinomialHeap.Imp.Heap.headD le a_1 a_3)
Instances For
The return type of FindMin
, which encodes various quantities needed to
reconstruct the tree in deleteMin
.
- before : Batteries.BinomialHeap.Imp.Heap α → Batteries.BinomialHeap.Imp.Heap α
The list of elements prior to the minimum element, encoded as a "difference list".
- val : α
The minimum element.
- node : Batteries.BinomialHeap.Imp.HeapNode α
The children of the minimum element.
- next : Batteries.BinomialHeap.Imp.Heap α
The forest after the minimum element.
Instances For
O(log n)
. Find the minimum element, and return a data structure FindMin
with information
needed to reconstruct the rest of the binomial heap.
Equations
- One or more equations did not get rendered due to their size.
- Batteries.BinomialHeap.Imp.Heap.findMin le k Batteries.BinomialHeap.Imp.Heap.nil x = x
Instances For
O(log n)
. Find and remove the the minimum element from the binomial heap.
Equations
- One or more equations did not get rendered due to their size.
- Batteries.BinomialHeap.Imp.Heap.deleteMin le Batteries.BinomialHeap.Imp.Heap.nil = none
Instances For
O(log n)
. Get the tail of the binomial heap after removing the minimum element.
Equations
- Batteries.BinomialHeap.Imp.Heap.tail? le h = Option.map (fun (x : α × Batteries.BinomialHeap.Imp.Heap α) => x.snd) (Batteries.BinomialHeap.Imp.Heap.deleteMin le h)
Instances For
O(log n)
. Remove the minimum element of the heap.
Equations
- Batteries.BinomialHeap.Imp.Heap.tail le h = (Batteries.BinomialHeap.Imp.Heap.tail? le h).getD Batteries.BinomialHeap.Imp.Heap.nil
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.BinomialHeap.Imp.Heap.fold le s init f = (Batteries.BinomialHeap.Imp.Heap.foldM le s init f).run
Instances For
O(n log n)
. Convert the heap to an array in increasing order.
Equations
- Batteries.BinomialHeap.Imp.Heap.toArray le s = Batteries.BinomialHeap.Imp.Heap.fold le s #[] Array.push
Instances For
O(n log n)
. Convert the heap to a list in increasing order.
Equations
- Batteries.BinomialHeap.Imp.Heap.toList le s = (Batteries.BinomialHeap.Imp.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.BinomialHeap.Imp.HeapNode.foldTreeM nil join Batteries.BinomialHeap.Imp.HeapNode.nil = pure nil
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.BinomialHeap.Imp.Heap.foldTreeM nil join Batteries.BinomialHeap.Imp.Heap.nil = pure nil
Instances For
O(n)
. Fold a function over the tree structure to accumulate a value.
Equations
- Batteries.BinomialHeap.Imp.Heap.foldTree nil join s = (Batteries.BinomialHeap.Imp.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.BinomialHeap.Imp.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) - When interpreting
child
andsibling
as left and right children of a binary tree, it is a perfect binary tree with depthr
Equations
- One or more equations did not get rendered due to their size.
- Batteries.BinomialHeap.Imp.HeapNode.WF le a Batteries.BinomialHeap.Imp.HeapNode.nil x = (x = 0)
Instances For
The well formedness predicate for a binomial heap. It asserts that:
- It consists of a list of well formed trees with the specified ranks
- The ranks are in strictly increasing order, and all are at least
n
Equations
- One or more equations did not get rendered due to their size.
- Batteries.BinomialHeap.Imp.Heap.WF le n Batteries.BinomialHeap.Imp.Heap.nil = True
Instances For
The well formedness predicate for a FindMin
value.
This is not actually a predicate, as it contains an additional data value
rank
corresponding to the rank of the returned node, which is omitted from findMin
.
- rank : Nat
The rank of the minimum element
- before : ∀ {s : Batteries.BinomialHeap.Imp.Heap α}, Batteries.BinomialHeap.Imp.Heap.WF le self.rank s → Batteries.BinomialHeap.Imp.Heap.WF le 0 (res.before s)
- node : Batteries.BinomialHeap.Imp.HeapNode.WF le res.val res.node self.rank
- next : Batteries.BinomialHeap.Imp.Heap.WF le (self.rank + 1) res.next
Instances For
before
is a difference list which can be appended to a binomial heap
with ranks at least rank
to produce another well formed heap.
node
is a well formed forest of rank rank
with val
at the root.
The conditions under which findMin
is well-formed.
Equations
- One or more equations did not get rendered due to their size.
- h_2.findMin hr hk = hr
Instances For
A binomial heap is a data structure which supports the following primary operations:
insert : α → BinomialHeap α → BinomialHeap α
: add an element to the heapdeleteMin : BinomialHeap α → Option (α × BinomialHeap α)
: remove the minimum element from the heapmerge : BinomialHeap α → BinomialHeap α → BinomialHeap α
: 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 BinomialHeap
, all three operations are O(log n)
.
Equations
- Batteries.BinomialHeap α le = { h : Batteries.BinomialHeap.Imp.Heap α // Batteries.BinomialHeap.Imp.Heap.WF le 0 h }
Instances For
O(1)
. Make a new empty binomial heap.
Equations
- Batteries.mkBinomialHeap α le = ⟨Batteries.BinomialHeap.Imp.Heap.nil, ⋯⟩
Instances For
O(1)
. Make a new empty binomial heap.
Equations
- Batteries.BinomialHeap.empty = Batteries.mkBinomialHeap α le
Instances For
Equations
- Batteries.BinomialHeap.instEmptyCollection = { emptyCollection := Batteries.BinomialHeap.empty }
Equations
- Batteries.BinomialHeap.instInhabited = { default := Batteries.BinomialHeap.empty }
O(1)
. Is the heap empty?
Equations
- b.isEmpty = b.val.isEmpty
Instances For
O(log 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(log n)
. Merge the contents of two heaps.
Equations
- Batteries.BinomialHeap.merge ⟨b₁, h₁⟩ ⟨b₂, h₂⟩ = ⟨Batteries.BinomialHeap.Imp.Heap.merge le b₁ b₂, ⋯⟩
Instances For
O(log n)
. Add element a
to the given heap h
.
Equations
- Batteries.BinomialHeap.insert a h = (Batteries.BinomialHeap.singleton a).merge h
Instances For
O(n log n)
. Construct a heap from a list by inserting all the elements.
Equations
- Batteries.BinomialHeap.ofList le as = List.foldl (flip Batteries.BinomialHeap.insert) Batteries.BinomialHeap.empty as
Instances For
O(n log n)
. Construct a heap from a list by inserting all the elements.
Equations
- Batteries.BinomialHeap.ofArray le as = Array.foldl (flip Batteries.BinomialHeap.insert) Batteries.BinomialHeap.empty as
Instances For
O(log n)
. Remove and return the minimum element from the heap.
Equations
- b.deleteMin = match eq : Batteries.BinomialHeap.Imp.Heap.deleteMin le b.val with | none => none | some (a, tl) => some (a, ⟨tl, ⋯⟩)
Instances For
Equations
- Batteries.BinomialHeap.instStream = { next? := Batteries.BinomialHeap.deleteMin }
O(n log n)
. Implementation of for x in (b : BinomialHeap α le) ...
notation,
which iterates over the elements in the heap in increasing order.
Equations
- b.forIn x f = ForInStep.run <$> Batteries.BinomialHeap.Imp.Heap.foldM le b.val (ForInStep.yield x) fun (x : ForInStep β) (a : α) => x.bind (f a)
Instances For
O(log n)
. Returns the smallest element in the heap, or none
if the heap is empty.
Equations
- b.head? = Batteries.BinomialHeap.Imp.Heap.head? le b.val
Instances For
O(log n)
. Returns the smallest element in the heap, or panics if the heap is empty.
Equations
- b.head! = b.head?.get!
Instances For
O(log n)
. Returns the smallest element in the heap, or default
if the heap is empty.
Equations
- b.headI = b.head?.getD default
Instances For
O(log n)
. Removes the smallest element from the heap, or none
if the heap is empty.
Equations
- b.tail? = match eq : Batteries.BinomialHeap.Imp.Heap.tail? le b.val with | none => none | some tl => some ⟨tl, ⋯⟩
Instances For
O(log n)
. Removes the smallest element from the heap, if possible.
Equations
- b.tail = ⟨Batteries.BinomialHeap.Imp.Heap.tail le b.val, ⋯⟩
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
- b.foldM init f = Batteries.BinomialHeap.Imp.Heap.foldM le b.val init f
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
- b.fold init f = Batteries.BinomialHeap.Imp.Heap.fold le b.val init f
Instances For
O(n log n)
. Convert the heap to a list in increasing order.
Equations
- b.toList = Batteries.BinomialHeap.Imp.Heap.toList le b.val
Instances For
O(n log n)
. Convert the heap to an array in increasing order.
Equations
- b.toArray = Batteries.BinomialHeap.Imp.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