zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Educational Codeforces Round 49 (Rated for Div. 2)
    Codeforces Round #506 (Div. 3)
    multiset
    C++中substr函数的用法
    7.30 背包问题
    7.29 dp动态规划
    7.27 图论 存图 前向星 最短路 dijstra算法 SPFA算法
    7.26 搜索进阶(状压搜索,迭代加深搜索)
    7.23 深搜广搜
    7.24 二分搜索
  • 原文地址:https://www.cnblogs.com/runnyu/p/5917626.html
Copyright © 2011-2022 走看看