# Crate skiplist

Expand description

A skiplist is a way of storing sorted elements in such a way that they can be accessed, inserted and removed, all in `O(log(n))` on average.

Conceptually, a skiplist is arranged as follows:

``````<head> ----------> [2] --------------------------------------------------> [9] ---------->
<head> ----------> [2] ------------------------------------[7] ----------> [9] ---------->
<head> ----------> [2] ----------> [4] ------------------> [7] ----------> [9] --> [10] ->
<head> --> [1] --> [2] --> [3] --> [4] --> [5] --> [6] --> [7] --> [8] --> [9] --> [10] ->
``````

Each node contains at the very least a link to the next element in the list (corresponding to the lowest level in the above diagram), but it can randomly contain more links which skip further down the list (the towers in the above diagram). This allows for the algorithm to move down the list faster than having to visit every element.

Conceptually, the skiplist can be thought of as a stack of linked lists. At the very bottom is the full linked list with every element, and each layer above corresponds to a linked list containing a random subset of the elements from the layer immediately below it. The probability distribution that determines this random subset can be customized, but typically a layer will contain half the nodes from the layer below.

## Safety

The ordered skiplist relies on a well-behaved comparison function. Specifically, given some ordering function `f(a, b)`, it must satisfy the following properties:

• Be well defined: `f(a, b)` should always return the same value
• Be anti-symmetric: `f(a, b) == Greater` if and only if `f(b, a) == Less`, and `f(a, b) == Equal == f(b, a)`.
• By transitive: If `f(a, b) == Greater` and `f(b, c) == Greater` then `f(a, c) == Greater`.

Failure to satisfy these properties can result in unexpected behavior at best, and at worst will cause a segfault, null deref, or some other bad behavior.

## Re-exports

• `pub use crate::ordered_skiplist::OrderedSkipList;`
• `pub use crate::skiplist::SkipList;`
• `pub use crate::skipmap::SkipMap;`

## Modules

• SkipLists use a probabilistic distribution of nodes over the internal levels, whereby the lowest level (level 0) contains all the nodes, and each level `n > 0` will contain a random subset of the nodes on level `n - 1`.
• An always-ordered skiplist.
• A skiplist implementation which allows faster random access than a standard linked list.
• SkipMap stores key-value pairs, with the keys being unique and always sorted.