当做笔记记录下来:)
相比于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 };
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 }