skiplist.rs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. ///# Skiplist
  2. ///<p>skiplist is an important data structure of database and many database use this as the basic structure in memory.
  3. /// In the database I also use two Skiplist in memory to store datas temperary.</p>
  4. ///</p> We refer the source of leveldb,however we know that the first time, google use C++ writting leveldb and then rewrite it by go.</p>
  5. #[allow(unused)]
  6. pub mod skip_lists
  7. {
  8. use std::{borrow::{Borrow, BorrowMut}, cell::{Ref, RefCell}, collections::btree_map::Values, rc::Rc};
  9. use std::cmp::PartialOrd;
  10. use crate::algorithm::{baisc_data::basic_data, random};
  11. use crate::algorithm::baisc_data;
  12. pub enum InsertResult
  13. {
  14. Successful,
  15. Fault,
  16. Exist
  17. }
  18. #[derive(Debug,Clone)]
  19. ///## Node of skiplist
  20. ///
  21. /// <p>We will build a kv database,so the node has two members key and value.</p>
  22. ///
  23. /// <p>The node would never be used out of the mod.</p>
  24. struct Node<K:PartialOrd,V>
  25. where K:Copy ,
  26. V:Clone
  27. {
  28. key:K,
  29. value:V,
  30. level:usize,
  31. forward:Vec<Option<Rc<RefCell<Node<K,V>>>>>
  32. }
  33. impl<K:PartialOrd,V> Node<K,V>
  34. where K:Copy,
  35. V:Clone{
  36. fn new(_key:K,_value:V,_level:usize)->Rc<RefCell<Self>>
  37. {
  38. Rc::new(
  39. RefCell::new(
  40. Node
  41. {
  42. key:_key,
  43. value:_value,
  44. level:_level,
  45. forward:vec![None;_level+1]
  46. }
  47. )
  48. )
  49. }
  50. }
  51. ///## Skiplist
  52. ///
  53. ///
  54. #[derive(Debug)]
  55. pub struct Skiplists<K,V>
  56. where K:Copy,
  57. K:PartialOrd,
  58. V:Clone
  59. {
  60. max_level:usize,
  61. current_level:usize,
  62. current_size:usize,
  63. max_size:usize,
  64. head:Vec<Option<Rc<RefCell<Node<K,V>>>>>
  65. }
  66. impl<K:PartialOrd,V> Skiplists<K,V>
  67. where K:Copy,
  68. V:Clone
  69. {
  70. pub fn new(_max_size:usize)->Self
  71. {
  72. Skiplists
  73. {
  74. max_level:_max_size,
  75. current_level:0,
  76. current_size:0,
  77. max_size:basic_data::MAX_SIZE_OF_SKIPLIST,
  78. head:vec![None;_max_size+1]
  79. }
  80. }
  81. fn creat_node(_key:K,_value:V,_level:usize)->Rc<RefCell<Node<K,V>>>
  82. {
  83. Node::new(_key, _value, _level)
  84. }
  85. pub fn insert(&mut self,key:K,value:V)->InsertResult
  86. {
  87. if self.current_size==0 //如果shiplist是全空的,直接将点插入
  88. {
  89. let random_level: usize=random::random::lgc(self.max_level);
  90. let new_node: Rc<RefCell<Node<K, V>>>=Self::creat_node(key,value,random_level); //创建新的节点
  91. for i in 0..=random_level
  92. {
  93. self.head[i]=Some(new_node.clone());
  94. }
  95. }
  96. else //当list不为空的时候需要判定插入的位置
  97. {
  98. let random_level:usize=random::random::lgc(self.max_level);
  99. let mut cur_point:Option<Rc<RefCell<Node<K,V>>>>=None;
  100. let mut cur_node:Vec<Option<Rc<RefCell<Node<K,V>>>>>=vec![None;self.max_level];
  101. let mut cur_level: i32=(self.current_level-1) as i32;
  102. while(cur_level>=0)
  103. {
  104. if self.head[cur_level as usize].is_none() //如果起始点为空则直接跳过(在这一层不会有节点)
  105. {
  106. cur_level=cur_level-1;
  107. continue;
  108. }
  109. else { //判定每一层的起始位置
  110. if cur_level <=((self.max_level) as i32)-2 //如果self.max_level小于2那么这个显然不成立
  111. {
  112. if cur_node[cur_level as usize+1].is_none() //如果在之前的层全为空则跳过,从当前的头节点开始
  113. {
  114. cur_point=self.head[cur_level as usize].clone();
  115. if (*(cur_point.clone().unwrap())).borrow().key<key //如果第一个节点key就大于当前数据(主要是没有一个空的头节点就比较复杂)
  116. {
  117. cur_level=cur_level-1;
  118. continue;
  119. }
  120. else if (*(cur_point.clone().unwrap())).borrow().key==key
  121. {
  122. (*(*(cur_point.clone().unwrap())).borrow_mut()).value=value.clone();
  123. return InsertResult::Exist;
  124. }
  125. }
  126. }
  127. else {
  128. cur_point=cur_node[cur_level as usize+1].clone();
  129. }
  130. loop
  131. {
  132. if (*(*(cur_point.clone().unwrap())).borrow_mut()).forward[cur_level as usize].is_none()
  133. {
  134. cur_node[cur_level as usize]=cur_point.clone();
  135. break;
  136. }
  137. else if (*(((*(*(cur_point.clone().unwrap())).borrow_mut()).forward[cur_level as usize]).clone()).unwrap()).borrow().key==key
  138. {
  139. (*(((*(*(cur_point.clone().unwrap())).borrow_mut()).forward[cur_level as usize]).clone()).unwrap()).borrow_mut().key=key; //将对应的节点数据修改
  140. return InsertResult::Exist;
  141. }
  142. else if (*(((*(*(cur_point.clone().unwrap())).borrow_mut()).forward[cur_level as usize]).clone()).unwrap()).borrow().key<key
  143. {
  144. cur_node[cur_level as usize]=cur_point.clone();
  145. break;
  146. }
  147. else
  148. {
  149. cur_point=(*((cur_point.clone()).unwrap())).borrow().forward[cur_level as usize].clone();
  150. }
  151. }
  152. cur_level=cur_level-1;
  153. }
  154. }
  155. let mut middle_ptr:Option<Rc<RefCell<Node<K,V>>>>=None;
  156. let mut new_nodes:Rc<RefCell<Node<K, V>>> =Self::creat_node(key, value, random_level);
  157. for i in 0..=random_level-1
  158. {
  159. if cur_node[i].is_none()
  160. {
  161. self.head[i]=Some(new_nodes.clone());
  162. }
  163. else
  164. {
  165. (*new_nodes).borrow_mut().forward[i]=((*(*((cur_node[i].clone()).unwrap())).borrow_mut()).forward[i]).clone();
  166. (*(cur_node[i].clone().unwrap())).borrow_mut().forward[i]=Some(new_nodes.clone());
  167. }
  168. }
  169. }
  170. InsertResult::Successful
  171. }
  172. }
  173. }