Wikipedia / Binomial heap
Wikipedia / Binomial heap
In computer science, a binomial heap is a data structure that acts as a priority queue. It is an example of a mergeable heap (also called meldable heap), as it supports merging two heaps in logarithmic time. It is implemented as a heap similar to a binary heap but using a special tree structure that is different from the complete binary trees used by binary heaps. Binomial heaps were invented in 1978 by Jean Vuillemin.
Binomial heap
A binomial heap is implemented as a set of binomial trees (compare with a binary heap, which has a shape of a single binary tree), which are defined recursively as follows:
A binomial tree of order 0 is a single node
, ..., 2, 1, 0 (in this order).
, a binomial coefficient by attaching one of them as the leftmost child of the root of the other tree. This feature is central to the merge operation of a binomial heap, which is its major advantage over other conventional heaps.
Structure of a binomial heap
A binomial heap is implemented as a set of binomial trees that satisfy the binomial heap properties:
Each binomial tree in a heap obeys the minimum-heap property: the key of a node is greater than or equal to the key of its parent.
There can be at most one binomial tree for each order, including zero order.
The first property ensures that the root of each binomial tree contains the smallest key in the tree. It follows that the smallest key in the entire heap is one of the roots.
is the binary logarithm: there is one binomial tree for each nonzero bit in the binary, and thus a binomial heap with 13 nodes will consist of three binomial trees of orders 3, 2, and 0 (see figure below).
these numbers are
1, 1, 3, 3, 15, 45, 315, 315, 2835, 14175, ...
items are inserted into a binomial heap in a uniformly random order, each of these arrangements is equally likely.
Implementation
Because no operation requires random access to the root nodes of the binomial trees, the roots of the binomial trees can be stored in a linked list, ordered by increasing order of the tree. Because the number of children for each node is variable, it does not work well for each node to have separate links to each of its children, as would be common in a binary tree; instead, it is possible to implement this tree using links from each node to its highest-order child in the tree, and to its sibling of the next smaller order than it. These sibling pointers can be interpreted as the next pointers in a linked list of the children of each node, but with the opposite order from the linked list of roots: from largest to smallest order, rather than vice versa. This representation allows two trees of the same order to be linked together, making a tree of the next larger order, in constant time.
Merge
The operation of merging two heaps is used as a subroutine in most other operations. A basic subroutine within this procedure merges pairs of binomial trees of the same order. This may be done by comparing the keys at the roots of the two trees (the smallest keys in both trees). The root node with the larger key is made into a child of the root node with the smaller key, increasing its order by one:
function mergeTree(p, q)
if p.root.key <= q.root.key
return p.addSubTree(q)
else
return q.addSubTree(p)To merge two heaps more generally, the lists of roots of both heaps are traversed simultaneously in a manner similar to that of the merge algorithm in one of the two input heaps. In the course of the algorithm, it will examine at most three trees of any order, two from the two heaps we merge and one composed of two smaller trees.
function merge(p, q)
while not (p.end() and q.end())
tree = mergeTree(p.currentTree(), q.currentTree()) if not heap.currentTree().empty()
tree = mergeTree(tree, heap.currentTree()) heap.addTree(tree)
heap.next(); p.next(); q.next()Because each binomial tree in a binomial heap corresponds to a bit in the binary representation of its size, there is an analogy between the merging of two heaps and the binary addition of the sizes of the two heaps, from right-to-left. Whenever a carry occurs during addition, this corresponds to a merging of two binomial trees during the merge.
.
Insert
Inserting. Another way of stating this is that (after logarithmic overhead for the first insertion in a sequence) each successive insert has an amortized time (i.e. constant) per insertion.
A variant of the binomial heap, the skew binomial heap, achieves constant worst case insertion time by using forests whose tree sizes are based on the skew binary number system rather than on the binary number system.
Find minimum
To find the minimum tree roots to examine.
time per update, without raising the overall asymptotic running time of any operation.
Delete minimum
To delete the minimum element.
function deleteMin(heap)
min = heap.trees().first()
for each current in heap.trees()
if current.root < min.root then min = current
for each tree in min.subTrees()
tmp.addTree(tree)
heap.removeTree(min)
merge(heap, tmp)Decrease key
After decreasing time. However, this operation requires that the representation of the tree include pointers from each node to its parent in the tree, somewhat complicating the implementation of other operations.
Delete
To delete an element from the heap, decrease its key to negative infinity (or equivalently, to some value lower than any element in the heap) and then delete the minimum in the heap.
Summary of running times
Applications
See also
Weak heap, a combination of the binary heap and binomial heap data structures
References
External links
Two C implementations of binomial heap (a generic one and one optimized for integer keys)