Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <limits.h>
  4.  
  5. #define SKIPLIST_MAX_LEVEL 6
  6.  
  7. typedef struct snode
  8. {
  9. int key;
  10. int value;
  11. struct snode **forward; // 每个节点都含有一个二级指针,指向着不同层的next节点
  12. }snode;
  13.  
  14. typedef struct skiplist
  15. {
  16. int level;
  17. int size;
  18. struct snode *header; // 一个链表表头
  19. }skiplist;
  20.  
  21. static int rand_level() { // 对于rand_level,要具体实现在于如何设置概率,网上一般要求为 2层的概率为0.5,3层0.25, 0.125...
  22. int level;
  23. for(level = 1; level < SKIPLIST_MAX_LEVEL && rand() % 2 == 0; level++);
  24.  
  25. // while (rand() < RAND_MAX / 2 && level < SKIPLIST_MAX_LEVEL)
  26. // level++;
  27. printf("return level: %d\n", level);
  28. return level;
  29. }
  30. snode *skiplist_search(skiplist *list, int key)
  31. {
  32. snode *x = list->header;
  33. int i;
  34.  
  35. for(i = list->level; i >= 1; i--){
  36. while(x->forward[i]->key < key)
  37. x = x->forward[i];
  38. }
  39. x = x->forward[1];
  40.  
  41. if(x->key == key)
  42. return x;
  43. else
  44. return NULL;
  45. }
  46.  
  47. static void skiplist_node_free(snode *x)
  48. {
  49. if (x) {
  50. free(x->forward);
  51. free(x);
  52. }
  53. }
  54.  
  55. // 把insert看懂,这个就会了
  56. int skiplist_delete(skiplist *list, int key)
  57. {
  58. snode *update[SKIPLIST_MAX_LEVEL + 1];
  59. snode *x = list->header;
  60. int i;
  61.  
  62. for(i = list->level; i >= 1; i--){
  63. while(x->forward[i]->key < key)
  64. x = x->forward[i];
  65. update[i] = x;
  66. }
  67.  
  68. x = x->forward[1];
  69. if(x->key == key){
  70. for(i = 1; i <= list->level; i++){
  71. if(update[i]->forward[i] != x)
  72. break;
  73. update[i]->forward[i] = x->forward[i];
  74. }
  75. skiplist_node_free(x);
  76. // 对于那些删除该key节点后,只剩一个header的,level就会减一(没必要保持)
  77. while(list->level > 1 && list->header->forward[list->level] == list->header)
  78. list->level--;
  79. return 0;
  80. }
  81. return 1;
  82. }
  83. int skiplist_insert(skiplist *list, int key, int value)
  84. {
  85. /* update在于保存每一层中当前节点的下一个节点的key值大于key的,
  86. * 通过保存update,我们能在最后的时候一并更新
  87. */
  88. snode *update[SKIPLIST_MAX_LEVEL + 1];
  89. snode *x = list->header;
  90. int i;
  91.  
  92. for(i = list->level; i >= 1; i--){
  93. while(x->forward[i]->key < key)
  94. x = x->forward[i];
  95. update[i] = x;
  96. }
  97.  
  98. // 查看是否存在key相等的可能
  99. x = x->forward[1];
  100.  
  101. if(x->key == key){
  102. x->value = value;
  103. return 0;
  104. }else{
  105. // 节点获取的level跟自己的属性和整体的属性没有关系,都是通过一定概率的函数(!!但是概率中又存在着概率,因为rand()是个伪随机)
  106. int lvl = rand_level();
  107. if(lvl > list->level){
  108. for(int i = list->level + 1; i <= lvl; i++){
  109. // 如果当前的level小于节点的level,则把上层的level的header作为更新点(因为默认每层为空时只存在一个header)
  110. update[i] = list->header;
  111. }
  112. list->level = lvl;
  113. }
  114.  
  115. x = (snode *)malloc(sizeof(struct snode));
  116. x->key = key;
  117. x->value = value;
  118. x->forward = (snode **)malloc(sizeof(snode*) * (lvl+1));
  119. for(int i = 1; i <= lvl; i++){
  120. x->forward[i] = update[i] -> forward[i];
  121. update[i] -> forward[i] =x;
  122. }
  123. }
  124.  
  125. return 0;
  126. }
  127.  
  128. skiplist *skiplist_init(skiplist *list)
  129. {
  130. snode *header = (snode *)malloc(sizeof(struct snode));
  131. list->header = header;
  132. header->key = INT_MAX;
  133. header->forward = (snode **)malloc(sizeof(snode*)
  134. * (SKIPLIST_MAX_LEVEL + 1));
  135. for(int i = 0; i<= SKIPLIST_MAX_LEVEL; i++){
  136. header->forward[i] = list->header;
  137. }
  138.  
  139. list->level = 1;
  140. list->size = 0;
  141. }
  142.  
  143. static void skiplist_dump(skiplist *list)
  144. {
  145. snode *x = list->header;
  146. while(x && x->forward[1] != list->header){
  147. printf("%d[%d] ->", x->forward[1]->key, x->forward[1]->value);
  148. x = x->forward[1];
  149. }
  150.  
  151. printf("NIL\n");
  152. }
  153.  
  154. int main(){
  155.  
  156. int arr[] = {3, 6, 9, 2, 11, 1, 4, 8}, i;
  157. skiplist list;
  158. skiplist_init(&list);
  159. printf("Insert:--------------------\n");
  160. for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){
  161. skiplist_insert(&list, arr[i], arr[i]);
  162. }
  163.  
  164. printf("Search:--------------------\n");
  165. int keys[] = {3, 4, 7, 10, 111};
  166.  
  167. for (i = 0; i < sizeof(keys)/sizeof(keys[0]); i++) {
  168. snode *x = skiplist_search(&list, keys[i]);
  169. if(x)
  170. printf("key = %d, value = %d\n", keys[i], x->value);
  171. else
  172. printf("key = %d, not found\n", keys[i]);
  173. }
  174. printf("Search:--------------------\n");
  175. skiplist_delete(&list, 3);
  176. skiplist_delete(&list, 9);
  177. skiplist_dump(&list);
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement