Skip to content

Commit f59a1d5

Browse files
author
zhangzhuang08
committed
Add skip list
1 parent 21f5615 commit f59a1d5

File tree

2 files changed

+370
-0
lines changed

2 files changed

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

0 commit comments

Comments
 (0)