forked from glenn-brown/skiplist
-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
156 lines (119 loc) · 6.26 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
PACKAGE
package skiplist
import "github.com/glenn-brown/skiplist"
Package skiplist implements fast indexable ordered multimaps.
This skip list has some features that make it special: It supports
position-index addressing. It can act as a map or as a multimap. It
automatically adjusts its depth. It mimics Go's container/list interface
where possible. It automatically and efficiently supports int*, float*,
uint*, string, and []byte keys. It supports externally defined key types
via the FastKey and SlowKey interfaces.
Get, Set, Insert, Remove*, Element*, and Pos operations all require
O(log(N)) time or less, where N is the number of entries in the list.
GetAll() requires O(log(N)+V) time where V is the number of values
returned. The skiplist requires O(N) space.
TYPES
type Element struct {
Value interface{}
// contains filtered or unexported fields
}
Element is an key/value pair inserted into the list. Use element.Key()
to access the protected key.
func (e *Element) Key() interface{}
Key returns the key used to insert the value in the list element in O(1)
time.
func (e *Element) Next() *Element
Next returns the next-higher-indexed list element or nil in O(1) time.
func (e *Element) String() string
String returns a Key:Value string representation of the element.
type FastKey interface {
Less(interface{}) bool
Score() float64
}
The FastKey interface allows externally-defined types to be used as
keys, efficiently. An a.Less(b) call should return true iff a < b.
key.Score() must increase monotonically as key increases.
type SlowKey interface {
Less(interface{}) bool
}
The SlowKey interface allows externally-defined types to be used as
keys. An a.Less(b) call should return true iff a < b.
type T struct {
// contains filtered or unexported fields
}
A skiplist.T is a skiplist. A skiplist is linked at multiple levels. The
bottom level (L0) is a sorted linked list of entries, and each link has
a link at the next higher level added with probability P at insertion.
Since this is a position-addressable skip-list, each link has an
associated 'width' specifying the number of nodes it skips, so nodes can
also be referenced by position.
For example, a skiplist containing values from 0 to 0x16 might be
structured like this:
L4 |---------------------------------------------------------------------->/
L3 |------------------------------------------->|------------------------->/
L2 |---------->|---------->|---------->|------->|---------------->|---->|->/
L1 |---------->|---------->|---------->|->|---->|->|->|->|------->|->|->|->/
L0 |->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->|->/
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6
The skiplist is searched starting at the top level, going as far right
as possible without passing the desired Element, dropping down one
level, and repeating for each level.
func New() *T
New returns a new skiplist in O(1) time. The list will be sorted from
least to greatest key.
func NewDescending() *T
NewDescending is like New, except keys are sorted from greatest to
least.
func (l *T) Element(key interface{}) (e *Element)
Element returns the youngest list element for key, without modifying the
list, in O(log(N)) time. If there is no match, nil is returned.
func (l *T) ElementN(index int) *Element
ElementN returns the Element at position pos in the skiplist, in
O(log(index)) time. If no such entry exists, nil is returned.
func (l *T) ElementPos(key interface{}) (e *Element, pos int)
Element returns the youngest list element for key and its position, If
there is no match, nil and -1 are returned.
Consider using Get or GetAll instead if you only want Values.
func (l *T) Front() *Element
Return the first list element in O(1) time.
func (l *T) Get(key interface{}) (value interface{})
Get returns the value corresponding to key in the table in O(log(N))
time. If there is no corresponding value, nil is returned. If there are
multiple corresponding values, the youngest is returned.
If the list might contain an nil value, you may want to use GetOk
instead.
func (l *T) GetAll(key interface{}) (values []interface{})
GetAll returns all values coresponding to key in the list, starting with
the youngest. If no value corresponds, an empty slice is returned.
O(log(N)+V) time is required, where M is the number of values returned.
func (l *T) GetOk(key interface{}) (value interface{}, ok bool)
GetOk returns the value corresponding to key in the table in O(log(N))
time. The return value ok is true iff the key was present. If there is
no corresponding value, nil and false are returned. If there are
multiple corresponding values, the youngest is returned.
func (l *T) Insert(key interface{}, value interface{}) *T
Insert a {key,value} pair into the skip list in O(log(N)) time.
func (l *T) Len() int
Len returns the number of elements in the T.
func (l *T) Pos(key interface{}) (pos int)
ElementPos returns the position of the youngest list element for key,
without modifying the list, in O(log(N)) time. If there is no match, -1
is returned.
Consider using Get or GetAll instead if you only want Values.
func (l *T) Remove(key interface{}) *Element
Remove the youngest Element associate with Key, if any, in O(log(N))
time. Return the removed element or nil.
func (l *T) RemoveElement(e *Element) *Element
Remove the specified element from the table, in O(log(N)) time. If the
element is one of M multiple entries for the key, and additional O(M)
time is required. This is useful for removing a specific element in a
multimap, or removing elements during iteration.
func (l *T) RemoveN(index int) *Element
RemoveN removes any element at position pos in O(log(N)) time, returning
it or nil.
func (l *T) Set(key interface{}, value interface{}) *T
Insert a {key,value} pair into the skip list in O(log(N)) time,
replacing the youngest entry for key, if any.
func (l *T) String() string
Function String prints only the key/value pairs in the skip list.