4 Splay Trees

▼ |  | Data: Data Structures

1 | Imperative Queues
2 | Growable Vectors
3 | Orders and Ordered Dictionaries
4 | Splay Trees
5 | Skip Lists
6 | Interval Maps
7 | Binary Heaps
8 | Integer Sets
9 | Bit Vectors
10 | Union-Find: Sets with only Canonical Elements

On this page:

make-splay-tree
make-adjustable-splay-tree
splay-tree?
adjustable-splay-tree?
splay-tree-ref
splay-tree-set!
splay-tree-remove!
splay-tree-count
splay-tree-iterate-first
splay-tree-iterate-next
splay-tree-iterate-key
splay-tree-iterate-value
splay-tree-remove-range!
splay-tree-contract!
splay-tree-expand!
splay-tree-iterate-least
splay-tree-iterate-greatest
splay-tree-iterate-least/ >?
splay-tree-iterate-least/ >=?
splay-tree-iterate-greatest/ <?
splay-tree-iterate-greatest/ <=?
splay-tree-iter?
splay-tree->list

5.3.6
top ← prev up next →

### 4`` Splay Trees

Ryan Culpepper <ryanc@racket-lang.org>

(require data/splay-tree)

Splay trees are an efficient data structure for mutable dictionaries with totally ordered keys. They were described in the paper “Self-Adjusting Binary Search Trees” by Daniel Sleator and Robert Tarjan in Journal of the ACM 32(3) pp652-686.

A splay-tree is a ordered dictionary (dict? and ordered-dict?).

Operations on splay-trees are not thread-safe. If a key in a splay-tree is mutated, the splay-tree’s internal invariants may be violated, causing its behavior to become unpredictable.

> > procedure
> > (make-splay-tree | [ | ord |  |  |  |
> > |  | #:key-contract key-contract |  |  |  |
> > |  | #:value-contract value-contract]) |  | → |  | splay-tree?
> ord : order? = datum-order
> key-contract : contract? = any/c
> value-contract : contract? = any/c

Makes a new empty splay-tree. The splay tree uses ord to order keys; in addition, the domain contract of ord is combined with key-contract to check keys.

Examples:
> > (define splay-tree
> (make-splay-tree (order 'string-order string? string=? string<?)))
> > (splay-tree-set! splay-tree "dot" 10)
> > (splay-tree-set! splay-tree "cherry" 500)
> > (dict-map splay-tree list)
> '(("cherry" 500) ("dot" 10))
> > (splay-tree-ref splay-tree "dot")
> 10
> > (splay-tree-remove! splay-tree "cherry")
> > (splay-tree-count splay-tree)
> 1
> > (splay-tree-set! splay-tree 'pear 3)
> splay-tree-set!: contract violation
> expected: string?
> given: 'pear
> in: the key argument of
> (->i
> ((s splay-tree?) (key (s) ...) (v (s) ...))
> (_r void?))
> contract from:
> <collects>/data/splay-tree.rkt
> blaming: top-level
> at: <collects>/data/splay-tree.rkt:1115.2

> > procedure
> > (make-adjustable-splay-tree | [ | #:key-contract key-contract |
> > |  | #:value-contract value-contract]) |
> → splay-tree?
> key-contract : contract? = any/c
> value-contract : contract? = any/c

Makes a new empty splay-tree that permits only exact integers as keys (in addition to any constraints imposed by key-contract). The resulting splay tree answers true to adjustable-splay-tree? and supports efficient key adjustment.

Examples:
> > (define splay-tree (make-adjustable-splay-tree))
> > (splay-tree-set! splay-tree 3 'apple)
> > (splay-tree-set! splay-tree 6 'cherry)
> > (dict-map splay-tree list)
> '((3 apple) (6 cherry))
> > (splay-tree-ref splay-tree 3)
> 'apple
> > (splay-tree-remove! splay-tree 6)
> > (splay-tree-count splay-tree)
> 1

> procedure (splay-tree? x) → boolean?
> x : any/c

Returns #t if x is a splay-tree, #f otherwise.

> procedure (adjustable-splay-tree? x) → boolean?
> x : any/c

Returns #t if x is a splay-tree that supports key adjustment; see splay-tree-contract! and splay-tree-expand!.

> procedure (splay-tree-ref s key [default]) → any
> s : splay-tree?
> key : any/c
> default : any/c = (lambda () (error ....))
> procedure (splay-tree-set! s key value) → void?
> s : splay-tree?
> key : any/c
> value : any/c
> procedure (splay-tree-remove! s key) → void?
> s : splay-tree?
> key : any/c
> procedure (splay-tree-count s) → exact-nonnegative-integer?
> s : splay-tree?
> procedure (splay-tree-iterate-first s) → (or/c #f splay-tree-iter?)
> s : splay-tree?
> procedure (splay-tree-iterate-next s iter) → (or/c #f splay-tree-iter?)
> s : splay-tree?
> iter : splay-tree-iter?
> procedure (splay-tree-iterate-key s iter) → any/c
> s : splay-tree?
> iter : splay-tree-iter?
> procedure (splay-tree-iterate-value s iter) → any/c
> s : splay-tree?
> iter : splay-tree-iter?

Implementations of dict-ref, dict-set!, dict-remove!, dict-count, dict-iterate-first, dict-iterate-next, dict-iterate-key, and dict-iterate-value, respectively.

> procedure (splay-tree-remove-range! s from to) → void?
> s : splay-tree?
> from : any/c
> to : any/c

Removes all keys in [from, to); that is, all keys greater than or equal to from and less than to.

This operation takes O(N) time, or O(log N) time if (adjustable-splay-tree? s).

> procedure (splay-tree-contract! s from to) → void?
> s : adjustable-splay-tree?
> from : exact-integer?
> to : exact-integer?

Like splay-tree-remove-range!, but also decreases the value of all keys greater than or equal to to by (- to from).

This operation is only allowed on adjustable splay trees, and it takes O(log N) time.

> procedure (splay-tree-expand! s from to) → void?
> s : adjustable-splay-tree?
> from : exact-integer?
> to : exact-integer?

Increases the value of all keys greater than or equal to from by (- to from).

This operation is only allowed on adjustable splay trees, and it takes O(log N) time.

> procedure (splay-tree-iterate-least s) → (or/c #f splay-tree-iter?)
> s : splay-tree
> procedure (splay-tree-iterate-greatest s) → (or/c #f splay-tree-iter?)
> s : splay-tree
> procedure (splay-tree-iterate-least/>? s key) → (or/c #f splay-tree-iter?)
> s : splay-tree?
> key : any/c
> procedure (splay-tree-iterate-least/>=? s key)
> → (or/c #f splay-tree-iter?)
> s : splay-tree?
> key : any/c
> procedure (splay-tree-iterate-greatest/<? s key)
> → (or/c #f splay-tree-iter?)
> s : splay-tree?
> key : any/c
> procedure (splay-tree-iterate-greatest/<=? s key)
> → (or/c #f splay-tree-iter?)
> s : splay-tree?
> key : any/c

Implementations of dict-iterate-least, dict-iterate-greatest, dict-iterate-least/>?, dict-iterate-least/>=?, dict-iterate-greatest/<?, and dict-iterate-greatest/<=?, respectively.

> procedure (splay-tree-iter? x) → boolean?
> x : any/c

Returns #t if x represents a position in a splay-tree, #f otherwise.

> procedure (splay-tree->list s) → (listof pair?)
> s : splay-tree?

Returns an association list with the keys and values of s, in order.
top ← prev up next →