SkipList的实现

当做笔记记录下来:)

相比于bTree,skiplist占用更多的空间。

而在并发的环境下skiplist会比bTree效率更高。

(bTree插入的时候需要rebalance,需要lock比较多的结点,而skiplist则只需要lock跟node相关的几个结点)

SkipList.h

 1 #define MAX_LEVEL 16
 2 
 3 typedef int KeyType;
 4 typedef int ValueType;
 5 
 6 typedef struct nodeStructure* Node;
 7 struct nodeStructure
 8 {
 9     KeyType key;
10     ValueType value;
11     Node forward[1];
12 };
13 
14 class SkipList
15 {
16 public:
17     SkipList();
18     Node createNode(int level, const KeyType& key, const ValueType& value);
19     void createList();
20     bool insert(const KeyType& key, const ValueType& value);
21     bool erase(const KeyType& key, ValueType& value);
22     bool search(const KeyType& key, ValueType& value);
23 private:
24     int randomLevel();
25 private:
26     int _level;
27     Node _header;
28 };
View Code

SkipList.cpp

  1 #include "SkipList.h"
  2 #include <iostream>
  3 
  4 SkipList::SkipList()
  5 {
  6     _level = 0;
  7     _header = createNode(MAX_LEVEL, 0, 0);
  8     Node tail = createNode(1, 0x7fffffff, 0);
  9     for (int i = 0; i < MAX_LEVEL; ++i) 
 10         _header->forward[i] = tail;
 11         
 12 }
 13 
 14 Node SkipList::createNode(int level, const KeyType& key, const ValueType& value)
 15 {
 16     Node node = (Node)malloc(
 17         sizeof(nodeStructure) + sizeof(Node) * level);
 18     node->key = key;
 19     node->value = value;
 20     return node;
 21 }
 22 
 23 int SkipList::randomLevel()
 24 {
 25     int k = 1;
 26     // 50% k++
 27     while (rand() % 2)
 28         k++;
 29     return (k < MAX_LEVEL) ? k : MAX_LEVEL - 1;
 30 }
 31 
 32 bool SkipList::insert(const KeyType& key, const ValueType& value)
 33 {
 34     Node update[MAX_LEVEL];
 35     Node node = _header;
 36     // search
 37     for (int i = _level; i >= 0; --i)
 38     {
 39         while (node->forward[i]->key < key)
 40             node = node->forward[i];
 41         // record previous node
 42         update[i] = node;
 43     }
 44 
 45     // same key
 46     if (node->forward[0]->key == key)
 47         return false;
 48 
 49     int level = randomLevel();
 50     // update level
 51     if (level > _level)
 52     {
 53         for (int i = _level + 1; i <= level; ++i)
 54             update[i] = _header;
 55         _level = level;
 56     }
 57 
 58     // update pointer
 59     Node insNode = createNode(level, key, value);
 60     for (int i = level; i >= 0; --i)
 61     {
 62         node = update[i];
 63         insNode->forward[i] = node->forward[i];
 64         node->forward[i] = insNode;
 65     }
 66     return true;
 67 }
 68 
 69 // similar to insert
 70 bool SkipList::erase(const KeyType& key, ValueType& value)
 71 {
 72     Node update[MAX_LEVEL];
 73     Node node = _header;
 74     for (int i = _level; i >= 0; --i)
 75     {
 76         while (node->forward[i]->key < key)
 77             node = node->forward[i];
 78         update[i] = node;
 79     }
 80 
 81     node = node->forward[0];
 82     if (node->key != key)
 83         return false;
 84 
 85     for (int i = 0; i < _level; ++i)
 86     {
 87         if (update[i]->forward[i] != node)
 88             break;
 89         update[i]->forward[i] = node->forward[i];
 90     }
 91     free(node);
 92     return true;
 93 }
 94 
 95 bool SkipList::search(const KeyType& key, ValueType& value)
 96 {
 97     Node node = _header;
 98     for (int i = _level; i >= 0; --i)
 99         // find the last node->key < key
100         while (node->forward[i]->key < key)
101             node = node->forward[i];
102     // node->key >= key
103     node = node->forward[0];
104     if (node->key == key)
105     {
106         value = node->value;
107         return true;
108     }
109     return false;
110 }
View Code

 

posted @ 2016-09-28 19:11  Runnyu  阅读(346)  评论(0编辑  收藏  举报