9 Treap
(require pfds/treap) | package: pfds |
Treaps are binary search trees in which each node has both a search key and a priority. Its keys are sorted in inorder and its each node priority is smaller than the priorities of its children. Because of this, a treap is a binary search tree for the keys and a heap for its priorities. This implementation uses random priorities to achieve good average-case performance.
Provides worst case running time of O(log(n)) for the operations insert, find-min/max and delete-min/max.
syntax
(Treap A)
> (treap < 1 2 3 4 5 6) - : (Treap Positive-Byte)
#<Treap>
In the above example, the treap obtained will have elements 1 thru’ 6 with < as the comparison function.
> (insert 10 (treap < 1 2 3)) - : (Treap Positive-Byte)
#<Treap>
In the above example, insert adds the element 10 to (treap < 1 2 3).
procedure
(find-min/max treap) → A
treap : (Treap A)
> (find-min/max (treap < 1 2 3 4 5 6)) - : Integer [more precisely: Positive-Byte]
1
> (find-min/max (treap > 1 2 3 4 5 6)) - : Integer [more precisely: Positive-Byte]
6
> (find-min/max (treap <)) find-min/max: given treap is empty
procedure
(delete-min/max treap) → (Treap A)
treap : (Treap A)
> (delete-min/max (treap < 1 2 3 4 5 6)) - : (Treap Positive-Byte)
#<Treap>
> (delete-min/max (treap > 1 2 3 4 5 6)) - : (Treap Positive-Byte)
#<Treap>
> (delete-min/max (treap <)) delete-min/max: given treap is empty
In the above example, (delete-min/max (treap < 1 2 3 4 5 6)), deletes the element 1(min) from the treap. And (delete-min/max (treap > 1 2 3 4 5 6)), deletes the element 6(max) from the treap.
> (delete 6 (treap < 1 2 3 4 5 6)) - : (Treap Positive-Byte)
#<Treap>
> (delete 3 (treap > 1 2 3 4 5 6)) - : (Treap Positive-Byte)
#<Treap>
> (delete 10 (treap <)) eval:15:0: Type Checker: Polymorphic function `delete' could
not be applied to arguments:
Argument 1:
Expected: A
Given: Positive-Byte
Argument 2:
Expected: (Treap A)
Given: (Treap Nothing)
in: <
In the above example, (delete 6 (treap < 1 2 3 4 5 6)), deletes the 6 returns (treap < 1 2 3 4 5). And (delete 3 (treap > 1 2 3 4 5 6)) returns (treap > 1 2 4 5 6).
procedure
(treap->list treap) → (Listof A)
treap : (Treap A)
> (treap->list (treap > 1 2 3 4 5 6)) - : (Listof Positive-Byte)
'(4 6 5 3 2 1)
> (treap->list (treap < 1 2 3 4 5 6)) - : (Listof Positive-Byte)
'(6 2 1 5 4 3)
> (treap->list (map < add1 (treap < 1 2 3 4 5 6))) - : (Listof Positive-Index)
'(7 2 3 6 4 5)
> (treap->list (map < * (treap < 1 2 3 4 5 6) (treap < 1 2 3 4 5 6))) - : (Listof Positive-Index)
'(12 1 4 25 24 18)
procedure
(fold func init treap1 treap2 ...) → C
func : (C A B ... B -> C) init : C treap1 : (Treap A) treap2 : (Treap B)
fold currently does not produce correct results when the given function is non-commutative.
> (fold + 0 (treap < 1 2 3 4 5 6)) - : Integer [more precisely: Nonnegative-Integer]
21
> (fold * 1 (treap < 1 2 3 4 5 6) (treap < 1 2 3 4 5 6)) - : Integer [more precisely: Positive-Integer]
518400
> (define trp (treap < 1 2 3 4 5 6))
> (treap->list (filter (λ: ([x : Integer]) (> x 5)) trp)) - : (Listof Positive-Byte)
'(6)
> (treap->list (filter (λ: ([x : Integer]) (< x 5)) trp)) - : (Listof Positive-Byte)
'(2 1 3 4)
> (treap->list (filter (λ: ([x : Integer]) (<= x 5)) trp)) - : (Listof Positive-Byte)
'(4 3 2 1 5)
> (treap->list (remove (λ: ([x : Integer]) (> x 5)) (treap < 1 2 3 4 5 6))) - : (Listof Positive-Byte)
'(4 2 1 3 5)
> (treap->list (remove (λ: ([x : Integer]) (< x 5)) (treap < 1 2 3 4 5 6))) - : (Listof Positive-Byte)
'(6 5)
> (treap->list (remove (λ: ([x : Integer]) (<= x 5)) (treap < 1 2 3 4 5 6))) - : (Listof Positive-Byte)
'(6)
procedure
(andmap func treap1 treap2 ...) → Boolean
func : (A B ... B -> Boolean) treap1 : (Treap A) treap2 : (Treap B)
> (andmap even? (treap < 1 2 3 4 5 6)) - : Boolean
#f
> (andmap odd? (treap < 1 2 3 4 5 6)) - : Boolean
#f
> (andmap positive? (treap < 1 2 3 4 5 6)) - : Boolean
#t
> (andmap negative? (treap < -1 -2)) - : Boolean
#t
procedure
(ormap func treap1 treap2 ...) → Boolean
func : (A B ... B -> Boolean) treap1 : (Treap A) treap2 : (Treap B)
> (ormap even? (treap < 1 2 3 4 5 6)) - : Boolean
#t
> (ormap odd? (treap < 1 2 3 4 5 6)) - : Boolean
#t
> (ormap positive? (treap < -1 -2 3 4 -5 6)) - : Boolean
#t
> (ormap negative? (treap < 1 -2)) - : Boolean
#t
procedure
(build-treap size func comp) → (Treap A)
size : Natural func : (Natural -> A) comp : (A A -> Boolean)
> (treap->list (build-treap 5 (λ:([x : Integer]) (add1 x)) <)) - : (Listof Integer)
'(5 2 1 4 3)
> (treap->list (build-treap 5 (λ:([x : Integer]) (* x x)) <)) - : (Listof Integer)
'(16 0 4 1 9)