6.2.901.900
3 Heaps
Following heap structures implement and provide the functions
empty?, insert, find-min/max, delete-min/max, merge and sorted-list.
All the heaps are polymorphic.
3.1 Binomial Heap
Binomial Heaps are nothing but mergeable priority heaps. To avoid the
confusion with FIFO queues, they are referred as heaps. Heaps are similar
to the sortable collections but the difference is that comparison function
is fixed when the heap is created. Binomial heaps are a binary representation
with heap-ordered, binomial trees. A tree is heap-ordered if it maintains
min-heap or max-heap property.
Provides worst case running time of O(log(n)) for the
operations insert, find-min/max, delete-min/max
and merge.
A binomial heap of type A.
(heap comp a ...) → (Heap A)
|
comp : (A A -> Boolean) |
a : A |
Function
heap creates a Binomial Heap with the given
inputs.
Example: |
> (heap < 1 2 3 4 5 6) | - : (Heap Positive-Byte) | #<Heap> |
|
In the above example, the binomial heap obtained will have elements 1 thru’ 6
with < as the comparison function.
Function
empty? checks if the given binomial heap is empty or not.
Examples: |
> (empty? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (empty? (heap <)) | - : Boolean | #t |
|
Function
insert takes an element and a binomial heap and inserts
the given element into the binomial heap.
Example: |
> (insert 10 (heap < 1 2 3)) | - : (Heap Positive-Byte) | #<Heap> |
|
In the above example, insert adds the element 10 to
(heap < 1 2 3).
Function
find-min/max takes a binomial heap and gives the
largest or the smallest element in the heap if binomial heap is not empty
else throws an error. The element returned is largest or smallest depends
on the comparison function of the heap.
Examples: |
> (find-min/max (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 1 | > (find-min/max (heap > 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 6 | > (find-min/max (heap <)) | find-min/max: given heap is empty |
|
Function
delete-min/max takes a binomial heap and returns the
same heap without the min or max element in the given heap. The element
removed from the heap is max or min depends on the comparison function of the
heap.
In the above example, (delete-min/max (heap < 1 2 3 4 5 6)),
deletes the element 1(min) from the heap. And
(delete-min/max (heap > 1 2 3 4 5 6)), deletes
the element 6(max) from the heap.
Function
merge takes two binomial heaps and returns a
merged binomial heap. Uses the comparison function of the first heap for
merging and the same function becomes the comparison function for the
merged heap.
If the comparison
functions do not have the same properties, merged heap might lose its
heap-order.
Examples: |
> (define bheap1 (heap < 1 2 3 4 5 6)) | | > (define bheap2 (heap (λ: ([a : Integer] | [b : Integer]) | (< a b)) | 10 20 30 40 50 60)) |
| | > (merge bheap1 bheap2) | eval:15:0: Type Checker: Polymorphic function `merge' could | not be applied to arguments: | Argument 1: | Expected: (Heap A) | Given: (Heap Positive-Byte) | Argument 2: | Expected: (Heap A) | Given: (Heap Integer) | | in: bheap2 |
|
In the above example, (merge bheap1 bheap2), merges the heaps and
< will become the comparison function for the merged heap.
Function
sorted-list takes a binomial heap and returns a list
which is sorted according to the comparison function of the heap.
Examples: |
> (sorted-list (heap > 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(6 5 4 3 2 1) | > (sorted-list (heap < 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(1 2 3 4 5 6) |
|
(map comparer func hep1 hep2 ...) → (Heap A)
|
comparer : (C C -> Boolean) |
func : (A B ... B -> C) |
hep1 : (Heap A) |
hep2 : (Heap B) |
Function
map is similar to
map for lists.
Examples: |
> (sorted-list (map < add1 (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(2 3 4 5 6 7) | > (sorted-list (map < * (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(1 4 9 16 25 36) |
|
(fold func init hep1 hep2 ...) → C
|
func : (C A B ... B -> C) |
init : C |
hep1 : (Heap A) |
hep2 : (Heap B) |
fold currently does not produce correct results when the
given function is non-commutative.
Examples: |
> (fold + 0 (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Nonnegative-Integer] | 21 | > (fold * 1 (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Integer] | 518400 |
|
Examples: |
> (define hep (heap < 1 2 3 4 5 6)) | | > (sorted-list (filter (λ: ([x : Integer]) (> x 5)) hep)) | - : (Listof Positive-Byte) | '(6) | > (sorted-list (filter (λ: ([x : Integer]) (< x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4) | > (sorted-list (filter (λ: ([x : Integer]) (<= x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4 5) |
|
Function
remove is similar to
filter but
remove removes the elements which match the predicate.
Examples: |
| - : (Listof Positive-Byte) | '(1 2 3 4 5) | | - : (Listof Positive-Byte) | '(5 6) | | - : (Listof Positive-Byte) | '(6) |
|
(andmap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (andmap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap positive? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (andmap negative? (heap < -1 -2)) | - : Boolean | #t |
|
(ormap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (ormap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap positive? (heap < -1 -2 3 4 -5 6)) | - : Boolean | #t | > (ormap negative? (heap < 1 -2)) | - : Boolean | #t |
|
(build-heap size func comp) → (Heap A)
|
size : Natural |
func : (Natural -> A) |
comp : (A A -> Boolean) |
3.2 Skew Binomial Heap
Skew Binomial Heaps are Binomial Heaps with hybrid numerical representation
for heaps based on both skew binary numbers. Skew binary number representation
is used since incrementing a skew binary number is quick and simple. Provides
worst case running time of O(log(n)) for the operations
find-min/max, delete-min/max and merge.
And worst case running time of
O(1) for the insert operation.
A skew binomial heap of type A.
(heap comp a ...) → (Heap A)
|
comp : (A A -> Boolean) |
a : A |
Function
heap creates a Skew Binomial Heap with the given
inputs.
Example: |
> (heap < 1 2 3 4 5 6) | - : (Heap Positive-Byte) | #<Heap> |
|
In the above example, the binomial heap obtained will have elements 1 thru’ 6
with < as the comparison function.
Function
empty? checks if the given binomial heap is empty or not.
Examples: |
> (empty? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (empty? (heap <)) | - : Boolean | #t |
|
Function
insert takes an element and a binomial heap and inserts
the given element into the binomial heap.
Example: |
> (insert 10 (heap < 1 2 3 4 5 6)) | - : (Heap Positive-Byte) | #<Heap> |
|
In the above example, insert adds the element 10 to
(heap < 1 2 3 4 5 6).
Function
find-min/max takes a binomial heap and gives the
largest or the smallest element in the heap if binomial heap is not empty
else throws an error. The element returned is max or min depends on the
comparison function of the heap.
Examples: |
> (find-min/max (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 1 | > (find-min/max (heap > 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 6 | > (find-min/max (heap <)) | find-min/max: given heap is empty |
|
Function
delete-min/max takes a binomial heap and returns the
same heap with out the min or max element in the given heap. The element
removed from the heap is max or min depends on the comparison function of the
heap.
In the above example, (delete-min/max (heap < 1 2 3 4 5 6))
deletes 1 and returns (delete-min/max (heap < 2 3 4 5 6)).
And (delete-min/max (heap > 1 2 3 4 5 6))
deletes 6 and returns (delete-min/max (heap < 1 2 3 4 5)).
Function
merge takes two binomial heaps and returns a
merged binomial heap. Uses the comparison function in the first heap for
merging and the same function becomes the comparison function for the
merged heap.
If the comparison
functions do not have the same properties, merged heap might lose its
heap-order.
Examples: |
> (define bheap1 (heap < 1 2 3 4 5 6)) | | > (define bheap2 (heap (λ: ([a : Integer] | [b : Integer]) | (< a b)) | 10 20 30 40 50 60)) |
| | > (merge bheap1 bheap2) | eval:15:0: Type Checker: Polymorphic function `merge' could | not be applied to arguments: | Argument 1: | Expected: (Heap A) | Given: (Heap Positive-Byte) | Argument 2: | Expected: (Heap A) | Given: (Heap Integer) | | in: bheap2 |
|
In the above example, (merge bheap1 bheap2), merges the heaps and
< will become the comparison function for the merged heap.
Function
sorted-list takes a binomial heap and returns a list
which is sorted according to the comparison function of the heap.
Examples: |
> (sorted-list (heap > 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(6 5 4 3 2 1) | > (sorted-list (heap < 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(1 2 3 4 5 6) |
|
(map comparer func hep1 hep2 ...) → (Heap A)
|
comparer : (C C -> Boolean) |
func : (A B ... B -> C) |
hep1 : (Heap A) |
hep2 : (Heap B) |
Function
map is similar to
map for lists.
Examples: |
> (sorted-list (map < add1 (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(2 3 4 5 6 7) | > (sorted-list (map < * (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(1 4 9 16 25 36) |
|
(fold func init hep1 hep2 ...) → C
|
func : (C A B ... B -> C) |
init : C |
hep1 : (Heap A) |
hep2 : (Heap B) |
fold currently does not produce correct results when the
given function is non-commutative.
Examples: |
> (fold + 0 (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Nonnegative-Integer] | 21 | > (fold * 1 (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Integer] | 518400 |
|
Examples: |
> (define hep (heap < 1 2 3 4 5 6)) | | > (sorted-list (filter (λ: ([x : Integer]) (> x 5)) hep)) | - : (Listof Positive-Byte) | '(6) | > (sorted-list (filter (λ: ([x : Integer]) (< x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4) | > (sorted-list (filter (λ: ([x : Integer]) (<= x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4 5) |
|
Function
remove is similar to
filter but
remove removes the elements which match the predicate.
Examples: |
| - : (Listof Positive-Byte) | '(1 2 3 4 5) | | - : (Listof Positive-Byte) | '(5 6) | | - : (Listof Positive-Byte) | '(6) |
|
(andmap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (andmap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap positive? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (andmap negative? (heap < -1 -2)) | - : Boolean | #t |
|
(ormap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (ormap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap positive? (heap < -1 -2 3 4 -5 6)) | - : Boolean | #t | > (ormap negative? (heap < 1 -2)) | - : Boolean | #t |
|
(build-heap size func comp) → (Heap A)
|
size : Natural |
func : (Natural -> A) |
comp : (A A -> Boolean) |
3.3 Leftist Heap
Leftist heaps are heap-ordered binary trees that satisfy the
leftist property: the rank of any left child is at least as large as the rank
of its right sibling. The rank of a node is defined to be the length of its
right spine (i.e., the rightmost path from the node in question to an empty
node). A simple consequence of the leftist property is that the right spine
of any node is always the shortest path to an empty node.
Provides worst case running time of O(log(n)) for the
operations insert, delete-min/max and merge
and a worst case running
time of O(1) for find-min/max.
A leftist heap of type A.
(heap comp a ...) → (Heap A)
|
comp : (A A -> Boolean) |
a : A |
Function
heap creates a Leftist Heap with the given
inputs.
Example: |
> (heap < 1 2 3 4 5 6) | - : (LeftistHeap Positive-Byte) | #<LeftistHeap> |
|
In the above example, the leftist heap obtained will have elements 1 thru’ 6
with < as the comparison function.
(empty? heap) → Boolean
|
heap : (Heap A) |
Function empty? checks if the given leftist heap is empty or not.
Examples: |
> (empty? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (empty? empty) | - : Boolean | #t |
|
Function
insert takes an element and a leftist heap and inserts
the given element into the leftist heap.
Example: |
> (insert 10 (heap < 1 2 3 4 5 6)) | - : (LeftistHeap Positive-Byte) | #<LeftistHeap> |
|
In the above example, insert adds the element 10 to the heap
(heap < 1 2 3 4 5 6).
Function
find-min/max takes a leftist heap and gives the
largest or the smallest element in the heap if leftist heap is not empty
else throws an error. The element returned is max or min depends on the
comparison function of the heap.
Examples: |
> (find-min/max (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 1 | > (find-min/max (heap > 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 6 | > (find-min/max (heap <)) | find-min/max: given heap is empty |
|
In the above example, (find-min/max lheap), returns the smallest
element in lheap which happens to be 1.
Function
delete-min/max takes a leftist heap and returns the
same heap with out the min or max element in the given heap. The element
removed from the heap is max or min depends on the comparison function of the
heap.
Examples: |
> (delete-min/max (heap < 1 2 3 4 5 6)) | - : (LeftistHeap Positive-Byte) | #<LeftistHeap> | > (delete-min/max (heap > 1 2 3 4 5 6)) | - : (LeftistHeap Positive-Byte) | #<LeftistHeap> | > (delete-min/max (heap <)) | delete-min/max: given heap is empty |
|
In the above example, (delete-min/max (heap < 1 2 3 4 5 6))
deletes min element 1 from the heap and
(delete-min/max (heap > 1 2 3 4 5 6)) deletes max element 6
from the heap.
Function
merge takes two leftist heaps and returns a
merged leftist heap. Uses the comparison function in the first heap for
merging and the same function becomes the comparison function for the
merged heap.
If the comparison
functions do not have the same properties, merged heap might lose its
heap-order.
Examples: |
> (define lheap1 (heap < 1 2 3 4 5 6)) | | > (define lheap2 (heap (λ: ([a : Integer] | [b : Integer]) | (< a b)) | 10 20 30 40 50 60)) |
| | > (merge lheap1 lheap2) | eval:15:0: Type Checker: Polymorphic function `merge' could | not be applied to arguments: | Argument 1: | Expected: (LeftistHeap A) | Given: (LeftistHeap Positive-Byte) | Argument 2: | Expected: (LeftistHeap A) | Given: (LeftistHeap Integer) | | in: lheap2 |
|
In the above example, (merge lheap1 lheap2), merges the heaps and
< will become the comparison function for the merged heap.
Function
sorted-list takes a leftist heap and returns a list
which is sorted according to the comparison function of the heap.
Examples: |
> (sorted-list (heap > 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(6 5 4 3 2 1) | > (sorted-list (heap < 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(1 2 3 4 5 6) |
|
(map comparer func hep1 hep2 ...) → (Heap A)
|
comparer : (C C -> Boolean) |
func : (A B ... B -> C) |
hep1 : (Heap A) |
hep2 : (Heap B) |
Function
map is similar to
map for lists.
Examples: |
> (sorted-list (map < add1 (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(2 3 4 5 6 7) | > (sorted-list (map < * (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(1 4 9 16 25 36) |
|
(fold func init hep1 hep2 ...) → C
|
func : (C A B ... B -> C) |
init : C |
hep1 : (Heap A) |
hep2 : (Heap B) |
fold currently does not produce correct results when the
given function is non-commutative.
Examples: |
> (fold + 0 (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Nonnegative-Integer] | 21 | > (fold * 1 (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Integer] | 518400 |
|
Examples: |
> (define hep (heap < 1 2 3 4 5 6)) | | > (sorted-list (filter (λ: ([x : Integer]) (> x 5)) hep)) | - : (Listof Positive-Byte) | '(6) | > (sorted-list (filter (λ: ([x : Integer]) (< x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4) | > (sorted-list (filter (λ: ([x : Integer]) (<= x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4 5) |
|
Function
remove is similar to
filter but
remove removes the elements which match the predicate.
Examples: |
| - : (Listof Positive-Byte) | '(1 2 3 4 5) | | - : (Listof Positive-Byte) | '(5 6) | | - : (Listof Positive-Byte) | '(6) |
|
(andmap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (andmap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap positive? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (andmap negative? (heap < -1 -2)) | - : Boolean | #t |
|
(ormap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (ormap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap positive? (heap < -1 -2 3 4 -5 6)) | - : Boolean | #t | > (ormap negative? (heap < 1 -2)) | - : Boolean | #t |
|
(build-heap size func comp) → (Heap A)
|
size : Natural |
func : (Natural -> A) |
comp : (A A -> Boolean) |
3.4 Splay Heap
Splay Heaps are very similar to balanced binary search trees. The difference
between the two lies in the fact that Splay Heaps do not maintain any
explicit balance information. Instead every operation restructures the
tree with some simple transformations that increase the balance of the
tree. Because of the restructuring on every operation, the worst case
running time of all the operations is O(n). But it can
be easily shown that the amortized running time of is
O(log(n)) for the all the main operations
insert, find-min/max, delete-min/max
and merge.
A splay heap of type A.
(heap comp a ...) → (Heap A)
|
comp : (A A -> Boolean) |
a : A |
Function
heap creates a Splay Heap with the given
inputs.
Example: |
> (heap < 1 2 3 4 5 6) | - : (Heap Positive-Byte) | #<Heap> |
|
In the above example, the splay heap obtained will have elements 1 thru’ 6
with < as the comparison function.
Function
empty? checks if the given splay heap is empty or not.
Examples: |
> (empty? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (empty? (heap <)) | - : Boolean | #t |
|
Function
insert takes an element and a splay heap and inserts
the given element into the splay heap.
Example: |
> (insert 10 (heap < 1 2 3 4 5 6)) | - : (Heap Positive-Byte) | #<Heap> |
|
In the above example, (insert 10 (heap < 1 2 3 4 5 6)) adds 10
to the heap (heap < 1 2 3 4 5 6).
Function
find-min/max takes a splay heap and gives the
largest or the smallest element in the heap if splay heap is not empty
else throws an error. The element returned is max or min depends on the
comparison function of the heap.
Examples: |
> (find-min/max (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 1 | > (find-min/max (heap > 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 6 | > (find-min/max (heap <)) | find-min/max: given heap is empty |
|
Function
delete-min/max takes a splay heap and returns the
same heap with out the min or max element in the given heap. The element
removed from the heap is max or min depends on the comparison function of the
heap.
In the above example, (delete-min/max (heap < 1 2 3 4 5 6))
deletes the smallest element 1.
And (delete-min/max (heap > 1 2 3 4 5 6)) deletes the largest
element 6.
Function
merge takes two splay heaps and returns a
merged splay heap. Uses the comparison function in the first heap for
merging and the same function becomes the comparison function for the
merged heap.
If the comparison
functions do not have the same properties, merged heap might lose its
heap-order.
Examples: |
> (define sheap1 (heap < 1 2 3 4 5 6)) | | > (define sheap2 (heap (λ: ([a : Integer] | [b : Integer]) | (< a b)) | 10 20 30 40 50 60)) |
| | > (merge sheap1 sheap2) | eval:15:0: Type Checker: Polymorphic function `merge' could | not be applied to arguments: | Argument 1: | Expected: (Heap A) | Given: (Heap Positive-Byte) | Argument 2: | Expected: (Heap A) | Given: (Heap Integer) | | in: sheap2 |
|
In the above example, (merge sheap1 sheap2), merges the heaps and
< will become the comparison function for the merged heap.
Function
sorted-list takes a splay heap and returns a list
which is sorted according to the comparison function of the heap.
Examples: |
> (sorted-list (heap > 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(6 5 4 3 2 1) | > (sorted-list (heap < 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(1 2 3 4 5 6) | > (sorted-list (heap >)) | - : (Listof Nothing) | '() |
|
(map comparer func hep1 hep2 ...) → (Heap A)
|
comparer : (C C -> Boolean) |
func : (A B ... B -> C) |
hep1 : (Heap A) |
hep2 : (Heap B) |
Function
map is similar to
map for lists.
Examples: |
> (sorted-list (map < add1 (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(2 3 4 5 6 7) | > (sorted-list (map < * (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(1 4 9 16 25 36) |
|
(fold func init hep1 hep2 ...) → C
|
func : (C A B ... B -> C) |
init : C |
hep1 : (Heap A) |
hep2 : (Heap B) |
fold currently does not produce correct results when the
given function is non-commutative.
Examples: |
> (fold + 0 (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Nonnegative-Integer] | 21 | > (fold * 1 (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Integer] | 518400 |
|
Examples: |
> (define hep (heap < 1 2 3 4 5 6)) | | > (sorted-list (filter (λ: ([x : Integer]) (> x 5)) hep)) | - : (Listof Positive-Byte) | '(6) | > (sorted-list (filter (λ: ([x : Integer]) (< x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4) | > (sorted-list (filter (λ: ([x : Integer]) (<= x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4 5) |
|
Function
remove is similar to
filter but
remove removes the elements which match the predicate.
Examples: |
| - : (Listof Positive-Byte) | '(1 2 3 4 5) | | - : (Listof Positive-Byte) | '(5 6) | | - : (Listof Positive-Byte) | '(6) |
|
(andmap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (andmap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap positive? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (andmap negative? (heap < -1 -2)) | - : Boolean | #t |
|
(ormap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (ormap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap positive? (heap < -1 -2 3 4 -5 6)) | - : Boolean | #t | > (ormap negative? (heap < 1 -2)) | - : Boolean | #t |
|
(build-heap size func comp) → (Heap A)
|
size : Natural |
func : (Natural -> A) |
comp : (A A -> Boolean) |
3.5 Pairing Heap
Pairing Heap is a type of heap which has a very simple implementation
and has extremely good performance in practice. Pairing Heaps provide a
worst case running time of O(1) for the operations
insert find-min/max merge.
And delete-min/max has a amortized
running time of O(log(n)).
A pairing heap of type A.
(heap comp a ...) → (Heap A)
|
comp : (A A -> Boolean) |
a : A |
Function
heap creates a Pairing Heap with the given
inputs.
Example: |
> (heap < 1 2 3 4 5 6) | - : (PairingHeap Positive-Byte) | #<PairingHeap> |
|
In the above example, the pairing heap obtained will have elements 1 thru’ 6
with < as the comparison function.
Function
empty? checks if the given pairing heap is empty or not.
Examples: |
> (empty? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (empty? (heap <)) | - : Boolean | #t |
|
Function
insert takes an element and a pairing heap and inserts
the given element into the pairing heap.
Example: |
> (insert 10 (heap < 1 2 3 4 5 6)) | - : (PairingHeap Positive-Byte) | #<PairingHeap> |
|
In the above example, (insert 10 (heap < 1 2 3 4 5 6)) adds
the element 10 to (heap < 1 2 3 4 5 6).
Function
find-min/max takes a pairing heap and gives the
largest or the smallest element in the heap if pairing heap is not empty
else throws an error. The element returned is max or min depends on the
comparison function of the heap. For
Examples: |
> (find-min/max (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 1 | > (find-min/max (heap > 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 6 | > (find-min/max (heap >)) | find-min/max: given heap is empty |
|
Function
delete-min/max takes a pairing heap and returns the
same heap with out the min or max element in the given heap. The element
removed from the heap is max or min depends on the comparison function of the
heap. For
Examples: |
> (delete-min/max (heap < 1 2 3 4 5 6)) | - : (PairingHeap Positive-Byte) | #<PairingHeap> | > (delete-min/max (heap > 1 2 3 4 5 6)) | - : (PairingHeap Positive-Byte) | #<PairingHeap> | > (delete-min/max (heap <)) | delete-min/max: given heap is empty |
|
In the above example, (delete-min/max (heap < 1 2 3 4 5 6)),
deletes the smallest element 1 in the heap (heap < 1 2 3 4 5 6).
And (delete-min/max (heap > 1 2 3 4 5 6)) deletes the largest
element which is 6.
Function
merge takes two pairing heaps and returns a
merged pairing heap. Uses the comparison function in the first heap for
merging and the same function becomes the comparison function for the
merged heap.
If the comparison
functions do not have the same properties, merged heap might lose its
heap-order.
Examples: |
> (define pheap1 (heap < 1 2 3 4 5 6)) | | > (define pheap2 (heap (λ: ([a : Integer] | [b : Integer]) | (< a b)) | 10 20 30 40 50 60)) |
| | > (merge pheap1 pheap2) | eval:15:0: Type Checker: Polymorphic function `merge' could | not be applied to arguments: | Argument 1: | Expected: (PairingHeap A) | Given: (PairingHeap Positive-Byte) | Argument 2: | Expected: (PairingHeap A) | Given: (PairingHeap Integer) | | in: pheap2 |
|
In the above example, (merge pheap1 pheap2), merges the heaps and
< will become the comparison function for the merged heap.
Function
sorted-list takes a pairing heap and returns a list
which is sorted according to the comparison function of the heap. For
Examples: |
> (sorted-list (heap > 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(6 5 4 3 2 1) | > (sorted-list (heap < 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(1 2 3 4 5 6) |
|
(map comparer func hep1 hep2 ...) → (Heap A)
|
comparer : (C C -> Boolean) |
func : (A B ... B -> C) |
hep1 : (Heap A) |
hep2 : (Heap B) |
Function
map is similar to
map for lists.
Examples: |
> (sorted-list (map < add1 (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(2 3 4 5 6 7) | > (sorted-list (map < * (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(1 4 9 16 25 36) |
|
(fold func init hep1 hep2 ...) → C
|
func : (C A B ... B -> C) |
init : C |
hep1 : (Heap A) |
hep2 : (Heap B) |
fold currently does not produce correct results when the
given function is non-commutative.
Examples: |
> (fold + 0 (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Nonnegative-Integer] | 21 | > (fold * 1 (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Integer] | 518400 |
|
Examples: |
> (define hep (heap < 1 2 3 4 5 6)) | | > (sorted-list (filter (λ: ([x : Integer]) (> x 5)) hep)) | - : (Listof Positive-Byte) | '(6) | > (sorted-list (filter (λ: ([x : Integer]) (< x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4) | > (sorted-list (filter (λ: ([x : Integer]) (<= x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4 5) |
|
Function
remove is similar to
filter but
remove removes the elements which match the predicate.
Examples: |
| - : (Listof Positive-Byte) | '(1 2 3 4 5) | | - : (Listof Positive-Byte) | '(5 6) | | - : (Listof Positive-Byte) | '(6) |
|
(andmap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (andmap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap positive? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (andmap negative? (heap < -1 -2)) | - : Boolean | #t |
|
(ormap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (ormap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap positive? (heap < -1 -2 3 4 -5 6)) | - : Boolean | #t | > (ormap negative? (heap < 1 -2)) | - : Boolean | #t |
|
(build-heap size func comp) → (Heap A)
|
size : Natural |
func : (Natural -> A) |
comp : (A A -> Boolean) |
3.6 Lazy Pairing Heap
Lazy Pairing Heap is very similar to Pairing Heap. The only difference between
the two is, as the name suggests, Lazy Pairing Heap is lazy in nature.
A lazy pairing heap of type A.
(heap comp a ...) → (Heap A)
|
comp : (A A -> Boolean) |
a : A |
Function
heap creates a Lazy Pairing Heap with the given
inputs.
Example: |
> (heap < 1 2 3 4 5 6) | - : (PairingHeap Positive-Byte) | #<PairingHeap> |
|
In the above example, the lazy pairing heap obtained will have elements 1 thru’ 6
with < as the comparison function.
Function
empty? checks if the given lazy pairing heap is empty or not.
Examples: |
> (empty? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (empty? (heap <)) | - : Boolean | #t |
|
Function
insert takes an element and a lazy pairing heap and inserts
the given element into the lazy pairing heap.
Example: |
> (insert 10 (heap < 1 2 3 4 5 6)) | - : (PairingHeap Positive-Byte) | #<PairingHeap> |
|
In the above example, (insert 10 (heap < 1 2 3 4 5 6))
adds the element 10 to the heap (heap < 1 2 3 4 5 6).
Function
find-min/max takes a lazy pairing heap and gives the
largest or the smallest element in the heap if lazy pairing heap is not empty
else throws an error. The element returned is max or min depends on the
comparison function of the heap.
Examples: |
> (find-min/max (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 1 | > (find-min/max (heap > 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 6 | > (find-min/max (heap <)) | find-min/max: given heap is empty |
|
Function
delete-min/max takes a lazy pairing heap and returns the
same heap with out the min or max element in the given heap. The element
removed from the heap is max or min depends on the comparison function of the
heap.
Examples: |
> (delete-min/max (heap < 1 2 3 4 5 6)) | - : (PairingHeap Positive-Byte) | #<PairingHeap> | > (delete-min/max (heap > 1 2 3 4 5 6)) | - : (PairingHeap Positive-Byte) | #<PairingHeap> | > (delete-min/max (heap >)) | delete-min/max: given heap is empty |
|
Function
merge takes two lazy pairing heaps and returns a
merged lazy pairing heap. Uses the comparison function in the first heap for
merging and the same function becomes the comparison function for the
merged heap.
If the comparison
functions do not have the same properties, merged heap might lose its
heap-order.
Examples: |
> (define pheap1 (heap < 1 2 3 4 5 6)) | | > (define pheap2 (heap (λ: ([a : Integer] | [b : Integer]) | (< a b)) | 10 20 30 40 50 60)) |
| | > (merge pheap1 pheap2) | eval:15:0: Type Checker: Polymorphic function `merge' could | not be applied to arguments: | Argument 1: | Expected: (PairingHeap A) | Given: (PairingHeap Positive-Byte) | Argument 2: | Expected: (PairingHeap A) | Given: (PairingHeap Integer) | | in: pheap2 |
|
In the above example, (merge pheap1 pheap2), merges the heaps and
< will become the comparison function for the merged heap.
Function
sorted-list takes a lazy pairing heap and returns a list
which is sorted according to the comparison function of the heap.
Examples: |
> (sorted-list (heap > 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(6 5 4 3 2 1) | > (sorted-list (heap < 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(1 2 3 4 5 6) |
|
(map comparer func hep1 hep2 ...) → (Heap A)
|
comparer : (C C -> Boolean) |
func : (A B ... B -> C) |
hep1 : (Heap A) |
hep2 : (Heap B) |
Function
map is similar to
map for lists.
Examples: |
> (sorted-list (map < add1 (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(2 3 4 5 6 7) | > (sorted-list (map < * (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(1 4 9 16 25 36) |
|
(fold func init hep1 hep2 ...) → C
|
func : (C A B ... B -> C) |
init : C |
hep1 : (Heap A) |
hep2 : (Heap B) |
fold currently does not produce correct results when the
given function is non-commutative.
Examples: |
> (fold + 0 (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Nonnegative-Integer] | 21 | > (fold * 1 (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Integer] | 518400 |
|
Examples: |
> (define hep (heap < 1 2 3 4 5 6)) | | > (sorted-list (filter (λ: ([x : Integer]) (> x 5)) hep)) | - : (Listof Positive-Byte) | '(6) | > (sorted-list (filter (λ: ([x : Integer]) (< x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4) | > (sorted-list (filter (λ: ([x : Integer]) (<= x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4 5) |
|
Function
remove is similar to
filter but
remove removes the elements which match the predicate.
Examples: |
| - : (Listof Positive-Byte) | '(1 2 3 4 5) | | - : (Listof Positive-Byte) | '(5 6) | | - : (Listof Positive-Byte) | '(6) |
|
(andmap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (andmap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap positive? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (andmap negative? (heap < -1 -2)) | - : Boolean | #t |
|
(ormap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (ormap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap positive? (heap < -1 -2 3 4 -5 6)) | - : Boolean | #t | > (ormap negative? (heap < 1 -2)) | - : Boolean | #t |
|
(build-heap size func comp) → (Heap A)
|
size : Natural |
func : (Natural -> A) |
comp : (A A -> Boolean) |
3.7 Bootstrapped Heap
Bootstrapped heaps are heaps with efficient merging. The bootstrapped heap is
implemented with structural abstraction over a less efficient heap
implementation to get a worst case running time of O(1) for the
operations insert, find-min/max and merge and worst
case running time of O(log(n)) for delete-min/max
operation. This implementation abstracts over skew binomial heaps. For skew
binomial heaps, see Skew Binomial Heap.
A bootstrapped heap of type A.
(heap comp a ...) → (Heap A)
|
comp : (A A -> Boolean) |
a : A |
Function
heap creates a Bootstrapped Heap with the
given inputs.
Example: |
> (heap < 1 2 3 4 5 6) | - : (BSHeap Positive-Byte) | #<BSHeap> |
|
In the above example, the bootstrapped heap obtained will have elements
1 thru’ 6 with < as the comparison function.
Function
empty? checks if the given bootstrapped heap is empty
or not.
Examples: |
> (empty? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (empty? (heap <)) | - : Boolean | #t |
|
Function
insert takes an element and a bootstrapped heap and inserts
the given element into the bootstrapped heap.
Example: |
> (insert 10 (heap < 1 2 3 4 5 6)) | - : (BSHeap Positive-Byte) | #<BSHeap> |
|
In the above example, insert adds the element 10 to the heap
(heap < 1 2 3 4 5 6).
Function
find-min/max takes a bootstrapped heap and gives the
largest or the smallest element in the heap if bootstrapped heap is not empty
else throws an error. The element returned is largest or smallest depends on
the comparison function of the heap.
Examples: |
> (find-min/max (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 1 | > (find-min/max (heap > 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Byte] | 6 | > (find-min/max (heap <)) | find-min/max: given heap is empty |
|
Function
delete-min/max takes a bootstrapped heap and returns the
same heap without the min or max element in the given heap. The element
removed from the heap is max or min depends on the comparison function of the
heap.
Examples: |
> (delete-min/max (heap < 1 2 3 4 5 6)) | - : (BSHeap Positive-Byte) | #<BSHeap> | > (delete-min/max (heap > 1 2 3 4 5 6)) | - : (BSHeap Positive-Byte) | #<BSHeap> | > (delete-min/max (heap <)) | delete-min/max: given heap is empty |
|
In the above example,
(delete-min/max (heap < 1 2 3 4 5 6)), deletes element
1 from (heap < 1 2 3 4 5 6). And
(delete-min/max (heap > 1 2 3 4 5 6)), deletes element
6 from (heap > 1 2 3 4 5 6).
Function
merge takes two bootstrapped heaps and returns a
merged bootstrapped heap. Uses the comparison function in the first heap for
merging and the same function becomes the comparison function for the
merged heap.
If the comparison
functions do not have the same properties, merged heap might lose its
heap-order.
Examples: |
> (define bheap1 (heap < 1 2 3 4 5 6)) | | > (define bheap2 (heap (λ: ([a : Integer] | [b : Integer]) | (< a b)) | 10 20 30 40 50 60)) |
| | > (merge bheap1 bheap2) | eval:15:0: Type Checker: Polymorphic function `merge' could | not be applied to arguments: | Argument 1: | Expected: (BSHeap A) | Given: (BSHeap Positive-Byte) | Argument 2: | Expected: (BSHeap A) | Given: (BSHeap Integer) | | in: bheap2 |
|
In the above example, (merge bheap1 bheap2), merges the heaps and
< will become the comparison function for the merged heap.
Function
sorted-list takes a bootstrapped heap and returns a
list which is sorted according to the comparison function of the heap.
Examples: |
> (sorted-list (heap > 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(6 5 4 3 2 1) | > (sorted-list (heap < 1 2 3 4 5 6)) | - : (Listof Positive-Byte) | '(1 2 3 4 5 6) |
|
In the above example, (sorted-list bheap), returns
(6 5 4 3 2 1).
(map comparer func hep1 hep2 ...) → (Heap A)
|
comparer : (C C -> Boolean) |
func : (A B ... B -> C) |
hep1 : (Heap A) |
hep2 : (Heap B) |
Function
map is similar to
map for lists.
Examples: |
> (sorted-list (map < add1 (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(2 3 4 5 6 7) | > (sorted-list (map < * (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6))) | - : (Listof Positive-Index) | '(1 4 9 16 25 36) |
|
(fold func init hep1 hep2 ...) → C
|
func : (C A B ... B -> C) |
init : C |
hep1 : (Heap A) |
hep2 : (Heap B) |
fold currently does not produce correct results when the
given function is non-commutative.
Examples: |
> (fold + 0 (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Nonnegative-Integer] | 21 | > (fold * 1 (heap < 1 2 3 4 5 6) (heap < 1 2 3 4 5 6)) | - : Integer [more precisely: Positive-Integer] | 518400 |
|
Examples: |
> (define hep (heap < 1 2 3 4 5 6)) | | > (sorted-list (filter (λ: ([x : Integer]) (> x 5)) hep)) | - : (Listof Positive-Byte) | '(6) | > (sorted-list (filter (λ: ([x : Integer]) (< x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4) | > (sorted-list (filter (λ: ([x : Integer]) (<= x 5)) hep)) | - : (Listof Positive-Byte) | '(1 2 3 4 5) |
|
Function
remove is similar to
filter but
remove removes the elements which match the predicate.
Examples: |
| - : (Listof Positive-Byte) | '(1 2 3 4 5) | | - : (Listof Positive-Byte) | '(5 6) | | - : (Listof Positive-Byte) | '(6) |
|
(andmap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (andmap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #f | > (andmap positive? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (andmap negative? (heap < -1 -2)) | - : Boolean | #t |
|
(ormap func heap1 heap2 ...) → Boolean
|
func : (A B ... B -> Boolean) |
heap1 : (Heap A) |
heap2 : (Heap B) |
Examples: |
> (ormap even? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap odd? (heap < 1 2 3 4 5 6)) | - : Boolean | #t | > (ormap positive? (heap < -1 -2 3 4 -5 6)) | - : Boolean | #t | > (ormap negative? (heap < 1 -2)) | - : Boolean | #t |
|
(build-heap size func comp) → (Heap A)
|
size : Natural |
func : (Natural -> A) |
comp : (A A -> Boolean) |