forked from vieter-v/libvieter
docs(heap): add readme
parent
05b96d1fd6
commit
a6bdd39776
|
@ -0,0 +1,33 @@
|
||||||
|
This min-heap implementation is a pretty standard binomial heap.
|
||||||
|
|
||||||
|
## Representation in memory
|
||||||
|
|
||||||
|
A heap consists of one or more binomial trees, each with a different order `k`
|
||||||
|
and `2^k` total nodes. This heap can contain `2^64 - 1` elements at most, which
|
||||||
|
is far more than your memory can contain, but it's still fun to mention.
|
||||||
|
|
||||||
|
A tree does not have its own memory structure; a node that's the root of a
|
||||||
|
binomial tree is simply called the tree.
|
||||||
|
|
||||||
|
Each node has the following layout:
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef struct vieter_heap_node {
|
||||||
|
uint64_t key;
|
||||||
|
void *data;
|
||||||
|
struct vieter_heap_node *largest_order;
|
||||||
|
union {
|
||||||
|
struct vieter_heap_node *next_tree;
|
||||||
|
struct vieter_heap_node *next_largest_order;
|
||||||
|
} ptr;
|
||||||
|
uint8_t order;
|
||||||
|
} vieter_heap_node;
|
||||||
|
```
|
||||||
|
|
||||||
|
Each node has a pointer to its child with the largest order (if the node's
|
||||||
|
order is `0`, this pointer will be NULL). Each non-root node has a pointer to
|
||||||
|
its sibling with the next-highest order. These pointers allow the children of a
|
||||||
|
binomial tree to be recombined into a new tree, once their root has been
|
||||||
|
pop'ed.
|
||||||
|
|
||||||
|
Roots point to the binomial tree in the heap with the next largest order.
|
Loading…
Reference in New Issue