Skip to content

Commit 700fd3a

Browse files
Add skip list (#954)
1 parent eaf895d commit 700fd3a

File tree

2 files changed

+379
-0
lines changed

2 files changed

+379
-0
lines changed

src/data_structures/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ mod range_minimum_query;
1414
mod rb_tree;
1515
mod segment_tree;
1616
mod segment_tree_recursive;
17+
mod skip_list;
1718
mod stack_using_singly_linked_list;
1819
mod treap;
1920
mod trie;
@@ -38,6 +39,7 @@ pub use self::range_minimum_query::RangeMinimumQuery;
3839
pub use self::rb_tree::RBTree;
3940
pub use self::segment_tree::SegmentTree;
4041
pub use self::segment_tree_recursive::SegmentTree as SegmentTreeRecursive;
42+
pub use self::skip_list::SkipList;
4143
pub use self::stack_using_singly_linked_list::Stack;
4244
pub use self::treap::Treap;
4345
pub use self::trie::Trie;

src/data_structures/skip_list.rs

Lines changed: 377 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,377 @@
1+
use rand::random_range;
2+
use std::{cmp::Ordering, marker::PhantomData, ptr::null_mut};
3+
4+
struct Node<K: Ord, V> {
5+
key: Option<K>,
6+
value: Option<V>,
7+
forward: Vec<*mut Node<K, V>>,
8+
}
9+
10+
impl<K: Ord, V> Node<K, V> {
11+
pub fn new() -> Self {
12+
let mut forward = Vec::with_capacity(4);
13+
forward.resize(4, null_mut());
14+
Node {
15+
key: None,
16+
value: None,
17+
forward,
18+
}
19+
}
20+
21+
pub fn make_node(capacity: usize, key: K, value: V) -> Self {
22+
let mut new_node = Self::new();
23+
new_node.key = Some(key);
24+
new_node.value = Some(value);
25+
new_node.forward = Vec::<*mut Node<K, V>>::with_capacity(capacity);
26+
new_node.forward.resize(capacity, null_mut());
27+
new_node
28+
}
29+
}
30+
31+
/// A probabilistic data structure that maintains a sorted collection of key-value pairs.
32+
///
33+
/// A skip list is a data structure that allows O(log n) search, insertion, and deletion
34+
/// on average by maintaining multiple levels of linked lists with probabilistic balancing.
35+
pub struct SkipList<K: Ord, V> {
36+
header: *mut Node<K, V>,
37+
level: usize,
38+
max_level: usize,
39+
marker: PhantomData<Node<K, V>>,
40+
}
41+
42+
impl<K: Ord, V> SkipList<K, V> {
43+
pub fn new(max_level: usize) -> Self {
44+
let mut node = Box::new(Node::<K, V>::new());
45+
node.forward = Vec::with_capacity(max_level);
46+
node.forward.resize(max_level, null_mut());
47+
48+
SkipList {
49+
header: Box::into_raw(node),
50+
level: 0,
51+
max_level,
52+
marker: PhantomData,
53+
}
54+
}
55+
56+
pub fn search(&self, searched_key: K) -> Option<&V> {
57+
let mut x = self.header;
58+
59+
unsafe {
60+
'outer: for i in (0..self.level).rev() {
61+
loop {
62+
let forward_i = (&*x).forward[i];
63+
if forward_i.is_null() {
64+
continue 'outer;
65+
}
66+
67+
let forward_i_key = (*forward_i).key.as_ref();
68+
match forward_i_key.cmp(&Some(&searched_key)) {
69+
Ordering::Less => {
70+
x = forward_i;
71+
}
72+
_ => {
73+
break;
74+
}
75+
}
76+
}
77+
}
78+
79+
x = (&*x).forward[0];
80+
if x.is_null() {
81+
return None;
82+
}
83+
84+
match (*x).key.as_ref().cmp(&Some(&searched_key)) {
85+
Ordering::Equal => {
86+
return (*x).value.as_ref();
87+
}
88+
_ => {
89+
return None;
90+
}
91+
}
92+
}
93+
}
94+
95+
pub fn insert(&mut self, searched_key: K, new_value: V) -> bool {
96+
let mut update = Vec::<*mut Node<K, V>>::with_capacity(self.max_level);
97+
update.resize(self.max_level, null_mut());
98+
99+
let mut x = self.header;
100+
101+
unsafe {
102+
for i in (0..self.level).rev() {
103+
loop {
104+
let x_forward_i = (&*x).forward[i];
105+
if x_forward_i.is_null() {
106+
break;
107+
}
108+
109+
let x_forward_i_key = (*x_forward_i).key.as_ref();
110+
match x_forward_i_key.cmp(&Some(&searched_key)) {
111+
Ordering::Less => {
112+
x = x_forward_i;
113+
}
114+
_ => {
115+
break;
116+
}
117+
}
118+
}
119+
let update_i = &mut update[i];
120+
*update_i = x;
121+
}
122+
123+
let x_forward_i = (&*x).forward[0];
124+
x = x_forward_i;
125+
if x.is_null() || (*x).key.as_ref().cmp(&Some(&searched_key)) != Ordering::Equal {
126+
let v = random_value(self.max_level);
127+
if v > self.level {
128+
for update_i in update.iter_mut().take(v).skip(self.level) {
129+
*update_i = self.header;
130+
}
131+
self.level = v;
132+
}
133+
let new_node = Node::make_node(v, searched_key, new_value);
134+
x = Box::into_raw(Box::new(new_node));
135+
136+
for (i, t) in update.iter_mut().enumerate().take(self.level) {
137+
let x_forward_i = (&mut *x).forward.get_mut(i);
138+
if x_forward_i.is_none() {
139+
break;
140+
}
141+
let x_forward_i = x_forward_i.unwrap();
142+
let update_i = t;
143+
let update_i_forward_i = &mut (&mut **update_i).forward[i];
144+
*x_forward_i = *update_i_forward_i;
145+
*update_i_forward_i = x;
146+
}
147+
return true;
148+
}
149+
(*x).value.replace(new_value);
150+
return true;
151+
}
152+
}
153+
154+
pub fn delete(&mut self, searched_key: K) -> bool {
155+
let mut update = Vec::<*mut Node<K, V>>::with_capacity(self.max_level);
156+
update.resize(self.max_level, null_mut());
157+
158+
let mut x = self.header;
159+
160+
unsafe {
161+
for i in (0..self.level).rev() {
162+
loop {
163+
let x_forward_i = (&*x).forward[i];
164+
if x_forward_i.is_null() {
165+
break;
166+
}
167+
168+
let x_forward_i_key = (*x_forward_i).key.as_ref();
169+
match x_forward_i_key.cmp(&Some(&searched_key)) {
170+
Ordering::Less => {
171+
x = x_forward_i;
172+
}
173+
_ => {
174+
break;
175+
}
176+
}
177+
}
178+
let update_i = &mut update[i];
179+
*update_i = x;
180+
}
181+
182+
let x_forward_i = *((&*x).forward.first().unwrap());
183+
x = x_forward_i;
184+
185+
if x.is_null() {
186+
return false;
187+
}
188+
189+
match (*x).key.as_ref().cmp(&Some(&searched_key)) {
190+
Ordering::Equal => {
191+
for (i, update_i) in update.iter_mut().enumerate().take(self.level) {
192+
let update_i_forward_i = &mut (&mut **update_i).forward[i];
193+
if update_i_forward_i.is_null() {
194+
break;
195+
}
196+
197+
let x_forward_i = (&mut *x).forward.get_mut(i);
198+
if x_forward_i.is_none() {
199+
break;
200+
}
201+
let x_forward_i = x_forward_i.unwrap();
202+
*update_i_forward_i = *x_forward_i;
203+
}
204+
205+
let _v = Box::from_raw(x);
206+
207+
loop {
208+
if self.level == 0 {
209+
break;
210+
}
211+
212+
let header_forward_level = &(&*self.header).forward[self.level - 1];
213+
if header_forward_level.is_null() {
214+
self.level -= 1;
215+
} else {
216+
break;
217+
}
218+
}
219+
return true;
220+
}
221+
_ => {
222+
return false;
223+
}
224+
}
225+
}
226+
}
227+
228+
pub fn iter(&self) -> Iter<'_, K, V> {
229+
Iter::new(self)
230+
}
231+
}
232+
233+
impl<K: Ord, V> Drop for SkipList<K, V> {
234+
fn drop(&mut self) {
235+
let mut node = unsafe { Box::from_raw(self.header) };
236+
loop {
237+
let node_forward_0 = node.forward.first().unwrap();
238+
if node_forward_0.is_null() {
239+
break;
240+
}
241+
node = unsafe { Box::from_raw(*node_forward_0) };
242+
}
243+
}
244+
}
245+
246+
fn random_value(max: usize) -> usize {
247+
let mut v = 1usize;
248+
loop {
249+
if random_range(1usize..10usize) > 5 && v < max {
250+
v += 1;
251+
} else {
252+
break;
253+
}
254+
}
255+
v
256+
}
257+
258+
pub struct Iter<'a, K: Ord, V> {
259+
current_node: *mut Node<K, V>,
260+
_marker: PhantomData<&'a SkipList<K, V>>,
261+
}
262+
263+
impl<'a, K: Ord, V> Iter<'a, K, V> {
264+
pub fn new(skip_list: &'a SkipList<K, V>) -> Self {
265+
Iter {
266+
current_node: skip_list.header,
267+
_marker: PhantomData,
268+
}
269+
}
270+
}
271+
272+
impl<'a, K: Ord, V> Iterator for Iter<'a, K, V> {
273+
type Item = (&'a K, &'a V);
274+
275+
fn next(&mut self) -> Option<Self::Item> {
276+
unsafe {
277+
let forward_0 = (&*self.current_node).forward.first();
278+
forward_0?;
279+
let forward_0 = *forward_0.unwrap();
280+
if forward_0.is_null() {
281+
return None;
282+
}
283+
self.current_node = forward_0;
284+
return match ((*forward_0).key.as_ref(), (*forward_0).value.as_ref()) {
285+
(Some(key), Some(value)) => Some((key, value)),
286+
_ => None,
287+
};
288+
}
289+
}
290+
}
291+
292+
#[cfg(test)]
293+
mod test {
294+
#[test]
295+
fn insert_and_delete() {
296+
let mut skip_list = super::SkipList::<&'static str, i32>::new(8);
297+
skip_list.insert("a", 10);
298+
skip_list.insert("b", 12);
299+
300+
{
301+
let result = skip_list.search("b");
302+
assert!(result.is_some());
303+
assert_eq!(result, Some(&12));
304+
}
305+
306+
{
307+
skip_list.delete("b");
308+
let result = skip_list.search("b");
309+
assert!(result.is_none());
310+
}
311+
312+
skip_list.delete("a");
313+
}
314+
315+
#[test]
316+
fn iterator() {
317+
let mut skip_list = super::SkipList::<&'static str, i32>::new(8);
318+
skip_list.insert("h", 22);
319+
skip_list.insert("a", 12);
320+
skip_list.insert("c", 11);
321+
322+
let result: Vec<(&&'static str, &i32)> = skip_list.iter().collect();
323+
assert_eq!(result, vec![(&"a", &12), (&"c", &11), (&"h", &22)]);
324+
}
325+
326+
#[test]
327+
fn cannot_search() {
328+
let mut skip_list = super::SkipList::<&'static str, i32>::new(8);
329+
330+
{
331+
let result = skip_list.search("h");
332+
assert!(result.is_none());
333+
}
334+
335+
skip_list.insert("h", 10);
336+
337+
{
338+
let result = skip_list.search("a");
339+
assert!(result.is_none());
340+
}
341+
}
342+
343+
#[test]
344+
fn delete_unsuccessfully() {
345+
let mut skip_list = super::SkipList::<&'static str, i32>::new(8);
346+
347+
{
348+
let result = skip_list.delete("a");
349+
assert!(!result);
350+
}
351+
352+
skip_list.insert("a", 10);
353+
354+
{
355+
let result = skip_list.delete("b");
356+
assert!(!result);
357+
}
358+
}
359+
360+
#[test]
361+
fn update_value_with_insert_operation() {
362+
let mut skip_list = super::SkipList::<&'static str, i32>::new(8);
363+
skip_list.insert("a", 10);
364+
365+
{
366+
let result = skip_list.search("a");
367+
assert_eq!(result, Some(&10));
368+
}
369+
370+
skip_list.insert("a", 100);
371+
372+
{
373+
let result = skip_list.search("a");
374+
assert_eq!(result, Some(&100));
375+
}
376+
}
377+
}

0 commit comments

Comments
 (0)